From: Yoan Le Clanche Date: Tue, 18 Dec 2018 14:02:22 +0000 (+0100) Subject: Initial commit X-Git-Tag: v1.1.0~15 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=eb6405fd0e5bfc8fee33aa2cf484a924d84879fd;p=pdfannotator.git Initial commit --- eb6405fd0e5bfc8fee33aa2cf484a924d84879fd diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3ccd92b --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +coverage/ +sandbox/shared diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/admin.py b/admin.py new file mode 100644 index 0000000..20d6d3e --- /dev/null +++ b/admin.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from django.contrib import admin + +from pdfannotator.models import Annotation, AnnotationComment + + +class AnnotationAdmin(admin.ModelAdmin): + model = Annotation + + +class AnnotationCommentAdmin(admin.ModelAdmin): + model = AnnotationComment + + + + +admin.site.register(Annotation, AnnotationAdmin) +admin.site.register(AnnotationComment, AnnotationCommentAdmin) + + diff --git a/forms.py b/forms.py new file mode 100644 index 0000000..6b477f9 --- /dev/null +++ b/forms.py @@ -0,0 +1,3 @@ +from django import forms + +# place form definition here \ No newline at end of file diff --git a/migrations/0001_initial.py b/migrations/0001_initial.py new file mode 100644 index 0000000..ff5fa19 --- /dev/null +++ b/migrations/0001_initial.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding model 'Annotation' + db.create_table('pdfannotator_annotation', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('annotation_id', self.gf('django.db.models.fields.CharField')(max_length=50)), + ('uuid', self.gf('django.db.models.fields.CharField')(max_length=50)), + ('page', self.gf('django.db.models.fields.IntegerField')()), + ('content', self.gf('django.db.models.fields.TextField')()), + )) + db.send_create_signal('pdfannotator', ['Annotation']) + + + def backwards(self, orm): + # Deleting model 'Annotation' + db.delete_table('pdfannotator_annotation') + + + models = { + 'pdfannotator.annotation': { + 'Meta': {'object_name': 'Annotation'}, + 'annotation_id': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'content': ('django.db.models.fields.TextField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'page': ('django.db.models.fields.IntegerField', [], {}), + 'uuid': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + } + } + + complete_apps = ['pdfannotator'] \ No newline at end of file diff --git a/migrations/0002_auto__add_annotationcomment.py b/migrations/0002_auto__add_annotationcomment.py new file mode 100644 index 0000000..a254bb8 --- /dev/null +++ b/migrations/0002_auto__add_annotationcomment.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding model 'AnnotationComment' + db.create_table('pdfannotator_annotationcomment', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('uuid', self.gf('django.db.models.fields.CharField')(max_length=50)), + ('annotation_id', self.gf('django.db.models.fields.CharField')(max_length=50)), + ('content', self.gf('django.db.models.fields.TextField')()), + )) + db.send_create_signal('pdfannotator', ['AnnotationComment']) + + + def backwards(self, orm): + # Deleting model 'AnnotationComment' + db.delete_table('pdfannotator_annotationcomment') + + + models = { + 'pdfannotator.annotation': { + 'Meta': {'object_name': 'Annotation'}, + 'annotation_id': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'content': ('django.db.models.fields.TextField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'page': ('django.db.models.fields.IntegerField', [], {}), + 'uuid': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'pdfannotator.annotationcomment': { + 'Meta': {'object_name': 'AnnotationComment'}, + 'annotation_id': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'content': ('django.db.models.fields.TextField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'uuid': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + } + } + + complete_apps = ['pdfannotator'] \ No newline at end of file diff --git a/migrations/0003_auto__add_field_annotationcomment_created__add_field_annotation_order.py b/migrations/0003_auto__add_field_annotationcomment_created__add_field_annotation_order.py new file mode 100644 index 0000000..7ec1b22 --- /dev/null +++ b/migrations/0003_auto__add_field_annotationcomment_created__add_field_annotation_order.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding field 'AnnotationComment.created' + db.add_column('pdfannotator_annotationcomment', 'created', + self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, default=datetime.datetime(2018, 11, 16, 0, 0), blank=True), + keep_default=False) + + # Adding field 'Annotation.order' + db.add_column('pdfannotator_annotation', 'order', + self.gf('django.db.models.fields.CharField')(default='1', max_length=10), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'AnnotationComment.created' + db.delete_column('pdfannotator_annotationcomment', 'created') + + # Deleting field 'Annotation.order' + db.delete_column('pdfannotator_annotation', 'order') + + + models = { + 'pdfannotator.annotation': { + 'Meta': {'object_name': 'Annotation'}, + 'annotation_id': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'content': ('django.db.models.fields.TextField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'order': ('django.db.models.fields.CharField', [], {'max_length': '10'}), + 'page': ('django.db.models.fields.IntegerField', [], {}), + 'uuid': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'pdfannotator.annotationcomment': { + 'Meta': {'object_name': 'AnnotationComment'}, + 'annotation_id': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'content': ('django.db.models.fields.TextField', [], {}), + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'uuid': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + } + } + + complete_apps = ['pdfannotator'] \ No newline at end of file diff --git a/migrations/__init__.py b/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/models.py b/models.py new file mode 100644 index 0000000..53be2b3 --- /dev/null +++ b/models.py @@ -0,0 +1,33 @@ +from django.db import models + + +class Annotation(models.Model): + annotation_id = models.CharField(blank=False, null=False, max_length=50) + uuid = models.CharField(blank=False, null=False, max_length=50) # file uuid + page = models.IntegerField(blank=False, null=False) # page number + order = models.CharField(blank=False, null=False, max_length=10) + content = models.TextField(blank=False, null=False) + + class Meta: + verbose_name = "Annotation" + verbose_name_plural = "Annotations" + + def __unicode__(self): + return unicode('Annotation %d - %s for %s' % (self.id, self.annotation_id, self.uuid)) + +class AnnotationComment(models.Model): + uuid = models.CharField(blank=False, null=False, max_length=50) # file uuid + annotation_id = models.CharField(blank=False, null=False, max_length=50) # we're not using foreignkey, because annotationcomment could potentially be added before annotation + content = models.TextField(blank=False, null=False) + created = models.DateTimeField(auto_now_add=True) + + class Meta: + verbose_name = "AnnotationComment" + verbose_name_plural = "AnnotationComments" + + def __unicode__(self): + return unicode('Comment %d - %s' % (self.id, self.annotation_id)) + + @property + def annotation(self): + return Annotation.objects.get(uuid=self.uuid, annotation_id=self.annotation_id) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..5566ea5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,7263 @@ +{ + "name": "pdf-annotate.js", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "Base64": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/Base64/-/Base64-0.2.1.tgz", + "integrity": "sha1-ujpCMHCOGGcFBl5mur3Uw1z2ACg=", + "dev": true + }, + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": true + }, + "accepts": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", + "dev": true, + "requires": { + "mime-types": "~2.1.11", + "negotiator": "0.6.1" + } + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "ajv": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", + "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", + "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "babel-core": { + "version": "6.7.4", + "resolved": "http://registry.npmjs.org/babel-core/-/babel-core-6.7.4.tgz", + "integrity": "sha1-ru6l2lhsBD4aG2HeosV2Ut8D7kk=", + "dev": true, + "requires": { + "babel-code-frame": "^6.7.4", + "babel-generator": "^6.7.2", + "babel-helpers": "^6.6.0", + "babel-messages": "^6.7.2", + "babel-register": "^6.7.2", + "babel-runtime": "^5.0.0", + "babel-template": "^6.7.0", + "babel-traverse": "^6.7.4", + "babel-types": "^6.7.2", + "babylon": "^6.7.0", + "convert-source-map": "^1.1.0", + "debug": "^2.1.1", + "json5": "^0.4.0", + "lodash": "^3.10.0", + "minimatch": "^2.0.3", + "path-exists": "^1.0.0", + "path-is-absolute": "^1.0.0", + "private": "^0.1.6", + "shebang-regex": "^1.0.0", + "slash": "^1.0.0", + "source-map": "^0.5.0" + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "requires": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "babel-loader": { + "version": "6.2.4", + "resolved": "http://registry.npmjs.org/babel-loader/-/babel-loader-6.2.4.tgz", + "integrity": "sha1-qnCv+N3CI6WVLoOaQ6bDpMi/oek=", + "dev": true, + "requires": { + "loader-utils": "^0.2.11", + "mkdirp": "^0.5.1", + "object-assign": "^4.0.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "babel-plugin-add-module-exports": { + "version": "0.2.1", + "resolved": "http://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz", + "integrity": "sha1-mumh9KjcZ/DN7E9K7aHkOl/2XiU=", + "dev": true + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "requires": { + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, + "requires": { + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "requires": { + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "dev": true, + "requires": { + "regenerator-transform": "^0.10.0" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "babel-preset-es2015": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", + "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.24.1", + "babel-plugin-transform-es2015-classes": "^6.24.1", + "babel-plugin-transform-es2015-computed-properties": "^6.24.1", + "babel-plugin-transform-es2015-destructuring": "^6.22.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", + "babel-plugin-transform-es2015-for-of": "^6.22.0", + "babel-plugin-transform-es2015-function-name": "^6.24.1", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-umd": "^6.24.1", + "babel-plugin-transform-es2015-object-super": "^6.24.1", + "babel-plugin-transform-es2015-parameters": "^6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", + "babel-plugin-transform-regenerator": "^6.24.1" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + }, + "dependencies": { + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "json5": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "babel-runtime": { + "version": "5.8.38", + "resolved": "http://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz", + "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=", + "dev": true, + "requires": { + "core-js": "^1.0.0" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "http://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", + "dev": true + } + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true + }, + "batch": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.3.tgz", + "integrity": "sha1-PzQU84AyF0O/wQQvmoP/HVgk1GQ=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "binary-extensions": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz", + "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==", + "dev": true + }, + "blob": { + "version": "0.0.4", + "resolved": "http://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", + "dev": true + }, + "bluebird": { + "version": "2.11.0", + "resolved": "http://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=", + "dev": true + }, + "body-parser": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "~2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + } + } + }, + "boom": { + "version": "2.10.1", + "resolved": "http://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.x.x" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "dev": true, + "requires": { + "pako": "~0.2.0" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chai": { + "version": "3.5.0", + "resolved": "http://registry.npmjs.org/chai/-/chai-3.5.0.tgz", + "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", + "dev": true, + "requires": { + "assertion-error": "^1.0.1", + "deep-eql": "^0.1.3", + "type-detect": "^1.0.0" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "colors": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz", + "integrity": "sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==", + "dev": true + }, + "combined-stream": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "compressible": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.15.tgz", + "integrity": "sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw==", + "dev": true, + "requires": { + "mime-db": ">= 1.36.0 < 2" + } + }, + "compression": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz", + "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.14", + "debug": "2.6.9", + "on-headers": "~1.0.1", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "dev": true, + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + } + }, + "connect-history-api-fallback": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.1.0.tgz", + "integrity": "sha1-Wm3ugtmmSMspEx0/ndQA/6RZN0I=", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "constants-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-0.0.1.tgz", + "integrity": "sha1-kld9tSe6bEzwpFaNhLwDH0QeIfI=", + "dev": true + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "coveralls": { + "version": "2.13.3", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-2.13.3.tgz", + "integrity": "sha512-iiAmn+l1XqRwNLXhW8Rs5qHZRFMYp9ZIPjEOVRpC/c4so6Y/f4/lFi0FfR5B9cCqgyhkJ5cZmbvcVRfP8MHchw==", + "dev": true, + "requires": { + "js-yaml": "3.6.1", + "lcov-parse": "0.0.10", + "log-driver": "1.2.5", + "minimist": "1.2.0", + "request": "2.79.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "create-stylesheet": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/create-stylesheet/-/create-stylesheet-0.3.0.tgz", + "integrity": "sha1-N0edg8dRMbBnfQBRDQQZ/MzJvJY=" + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "http://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "2.x.x" + } + }, + "crypto-browserify": { + "version": "3.2.8", + "resolved": "http://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.2.8.tgz", + "integrity": "sha1-ubEdvm2WUd2IKgHmzEZ99xjs8Yk=", + "dev": true, + "requires": { + "pbkdf2-compat": "2.0.1", + "ripemd160": "0.2.0", + "sha.js": "2.2.6" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "meow": "^3.3.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-eql": { + "version": "0.1.3", + "resolved": "http://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "dev": true, + "requires": { + "type-detect": "0.1.1" + }, + "dependencies": { + "type-detect": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", + "dev": true + } + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "diff": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", + "dev": true + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "engine.io": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.5.tgz", + "integrity": "sha512-j1DWIcktw4hRwrv6nWx++5nFH2X64x16MAG2P0Lmi5Dvdfi3I+Jhc7JKJIdAmDJa+5aZ/imHV7dWRPy2Cqjh3A==", + "dev": true, + "requires": { + "accepts": "1.3.3", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "2.3.3", + "engine.io-parser": "1.3.2", + "ws": "~1.1.5" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "engine.io-client": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.5.tgz", + "integrity": "sha512-AYTgHyeVUPitsseqjoedjhYJapNVoSPShbZ+tEUX9/73jgZ/Z3sUlJf9oYgdEBBdVhupUpUqSxH0kBCXlQnmZg==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "2.3.3", + "engine.io-parser": "1.3.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parsejson": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~1.1.5", + "xmlhttprequest-ssl": "1.5.3", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "engine.io-parser": { + "version": "1.3.2", + "resolved": "http://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", + "integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "0.0.6", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary": "0.1.7", + "wtf-8": "1.0.0" + } + }, + "enhanced-resolve": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", + "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.2.0", + "tapable": "^0.1.8" + }, + "dependencies": { + "memory-fs": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz", + "integrity": "sha1-8rslNovBIeORwlIN6Slpyu4KApA=", + "dev": true + } + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "dev": true, + "requires": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.2.0" + }, + "dependencies": { + "source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", + "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "expand-braces": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", + "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", + "dev": true, + "requires": { + "array-slice": "^0.2.3", + "array-unique": "^0.2.1", + "braces": "^0.1.2" + }, + "dependencies": { + "braces": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", + "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", + "dev": true, + "requires": { + "expand-range": "^0.1.0" + } + }, + "expand-range": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", + "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", + "dev": true, + "requires": { + "is-number": "^0.1.1", + "repeat-string": "^0.2.2" + } + }, + "is-number": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", + "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=", + "dev": true + }, + "repeat-string": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", + "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=", + "dev": true + } + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + } + }, + "express": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", + "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.3", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.4", + "qs": "6.5.2", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.2", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "dev": true, + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" + } + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + } + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "follow-redirects": { + "version": "1.5.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.9.tgz", + "integrity": "sha512-Bh65EZI/RU8nx0wbYF9shkFZlqLP+6WT/5FnA3cE/djNSuKNHJEinGGZgu/cQEkeeb2GdFOgenAmn8qaqYke2w==", + "dev": true, + "requires": { + "debug": "=3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" + } + }, + "formatio": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", + "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", + "dev": true, + "requires": { + "samsam": "~1.1" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "^2.1.0" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true + } + } + }, + "generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dev": true, + "requires": { + "is-property": "^1.0.2" + } + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "^1.0.0" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "handlebars": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", + "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", + "dev": true, + "requires": { + "async": "^2.5.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "har-validator": { + "version": "2.0.6", + "resolved": "http://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, + "requires": { + "chalk": "^1.1.1", + "commander": "^2.9.0", + "is-my-json-valid": "^2.12.4", + "pinkie-promise": "^2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-binary": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", + "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", + "dev": true, + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "http://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "http://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "http-browserify": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/http-browserify/-/http-browserify-1.7.0.tgz", + "integrity": "sha1-M3la3nLfiKz7/TZ3PO/tp2RzWyA=", + "dev": true, + "requires": { + "Base64": "~0.2.0", + "inherits": "~2.0.1" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "http-parser-js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", + "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==", + "dev": true + }, + "http-proxy": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "dev": true, + "requires": { + "eventemitter3": "^3.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "requires": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.0.tgz", + "integrity": "sha1-s//f5zSyo9Sp79WOhlTJH86G6v0=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "interpret": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-0.6.6.tgz", + "integrity": "sha1-/s16GOfOXKar+5U+H4YhOknxYls=", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "ipaddr.js": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", + "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-my-ip-valid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", + "dev": true + }, + "is-my-json-valid": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.19.0.tgz", + "integrity": "sha512-mG0f/unGX1HZ5ep4uhRaPOS8EkAY8/j6mDRMJrutq4CqhoJWYp7qAlonIPy3TV7p3ju4TK9fo/PbnoksWmsp5Q==", + "dev": true, + "requires": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", + "jsonpointer": "^4.0.0", + "xtend": "^4.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "^1.2.0" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", + "dev": true, + "requires": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "istanbul-instrumenter-loader": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-0.2.0.tgz", + "integrity": "sha1-ZD5OXk6PlGaGOimpd9KDqzcsAZw=", + "dev": true, + "requires": { + "istanbul": "0.x.x", + "loader-utils": "0.x.x", + "object-assign": "4.x.x" + } + }, + "jade": { + "version": "0.26.3", + "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", + "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", + "dev": true, + "requires": { + "commander": "0.6.1", + "mkdirp": "0.3.0" + }, + "dependencies": { + "commander": { + "version": "0.6.1", + "resolved": "http://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", + "dev": true + }, + "mkdirp": { + "version": "0.3.0", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", + "dev": true + } + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", + "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^2.6.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsesc": { + "version": "1.3.0", + "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "json5": { + "version": "0.4.0", + "resolved": "http://registry.npmjs.org/json5/-/json5-0.4.0.tgz", + "integrity": "sha1-BUNS5MTIDIbAkjh31EneF2pzLI0=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "karma": { + "version": "0.13.22", + "resolved": "http://registry.npmjs.org/karma/-/karma-0.13.22.tgz", + "integrity": "sha1-B3ULG9Bj1+fnuRvNLmNU2PKqh0Q=", + "dev": true, + "requires": { + "batch": "^0.5.3", + "bluebird": "^2.9.27", + "body-parser": "^1.12.4", + "chokidar": "^1.4.1", + "colors": "^1.1.0", + "connect": "^3.3.5", + "core-js": "^2.1.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "expand-braces": "^0.1.1", + "glob": "^7.0.0", + "graceful-fs": "^4.1.2", + "http-proxy": "^1.13.0", + "isbinaryfile": "^3.0.0", + "lodash": "^3.8.0", + "log4js": "^0.6.31", + "mime": "^1.3.4", + "minimatch": "^3.0.0", + "optimist": "^0.6.1", + "rimraf": "^2.3.3", + "socket.io": "^1.4.5", + "source-map": "^0.5.3", + "useragent": "^2.1.6" + }, + "dependencies": { + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "karma-cli": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/karma-cli/-/karma-cli-0.1.2.tgz", + "integrity": "sha1-ys6oQ3Hs4Zh2JlyPoQLru5/uSow=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "karma-coverage": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-0.5.5.tgz", + "integrity": "sha1-sNWLECXVnVxmICYxhvHVj11TSMU=", + "dev": true, + "requires": { + "dateformat": "^1.0.6", + "istanbul": "^0.4.0", + "minimatch": "^3.0.0", + "source-map": "^0.5.1" + }, + "dependencies": { + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "karma-firefox-launcher": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-0.1.7.tgz", + "integrity": "sha1-wF3YZTNpHmLzGVJZUJjovTV9OfM=", + "dev": true + }, + "karma-mocha": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-0.2.2.tgz", + "integrity": "sha1-OI7ZF9oV3LGW0bkVwZNO+AMZP44=", + "dev": true + }, + "karma-sinon-chai": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/karma-sinon-chai/-/karma-sinon-chai-1.3.4.tgz", + "integrity": "sha512-Oatu8tdkfWaSveM809euI6KGcNJRdoXFilz9ozSf+vPwrM73kncu54nsfkLcMqR/iht3PXASAGK9La5oU2xDKQ==", + "dev": true, + "requires": { + "lolex": "^1.6.0" + } + }, + "karma-sourcemap-loader": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz", + "integrity": "sha1-kTIsd/jxPUb+0GKwQuEAnUxFBdg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2" + } + }, + "karma-webpack": { + "version": "1.8.1", + "resolved": "http://registry.npmjs.org/karma-webpack/-/karma-webpack-1.8.1.tgz", + "integrity": "sha1-OdX9Lt7qPMPvW0BZibN9Ww5qO04=", + "dev": true, + "requires": { + "async": "~0.9.0", + "loader-utils": "^0.2.5", + "lodash": "^3.8.0", + "source-map": "^0.1.41", + "webpack-dev-middleware": "^1.0.11" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "http://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "lcov-parse": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", + "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + }, + "dependencies": { + "json5": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + } + } + }, + "lodash": { + "version": "3.10.1", + "resolved": "http://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + }, + "log-driver": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz", + "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=", + "dev": true + }, + "log4js": { + "version": "0.6.38", + "resolved": "http://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz", + "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=", + "dev": true, + "requires": { + "readable-stream": "~1.0.2", + "semver": "~4.3.3" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "lolex": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", + "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "math-random": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", + "dev": true + }, + "mime-types": { + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "dev": true, + "requires": { + "mime-db": "~1.37.0" + } + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "requires": { + "brace-expansion": "^1.0.0" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "2.5.3", + "resolved": "http://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", + "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", + "dev": true, + "requires": { + "commander": "2.3.0", + "debug": "2.2.0", + "diff": "1.4.0", + "escape-string-regexp": "1.0.2", + "glob": "3.2.11", + "growl": "1.9.2", + "jade": "0.26.3", + "mkdirp": "0.5.1", + "supports-color": "1.2.0", + "to-iso-string": "0.0.2" + }, + "dependencies": { + "commander": { + "version": "2.3.0", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.3.0.tgz", + "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", + "dev": true + }, + "debug": { + "version": "2.2.0", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "escape-string-regexp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", + "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", + "dev": true + }, + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "dev": true, + "requires": { + "inherits": "2", + "minimatch": "0.3" + } + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "supports-color": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", + "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", + "dev": true + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "nan": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", + "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, + "node-ensure": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/node-ensure/-/node-ensure-0.0.0.tgz", + "integrity": "sha1-7K52QVDemYYexcgQ/V0Jaxg5Mqc=", + "dev": true + }, + "node-libs-browser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-0.6.0.tgz", + "integrity": "sha1-JEgG1E0xngSLyGB7XMTq+aKdLjw=", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "~0.1.4", + "buffer": "^4.9.0", + "console-browserify": "^1.1.0", + "constants-browserify": "0.0.1", + "crypto-browserify": "~3.2.6", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "http-browserify": "^1.3.2", + "https-browserify": "0.0.0", + "os-browserify": "~0.1.2", + "path-browserify": "0.0.0", + "process": "^0.11.0", + "punycode": "^1.2.4", + "querystring-es3": "~0.2.0", + "readable-stream": "^1.1.13", + "stream-browserify": "^1.0.0", + "string_decoder": "~0.10.25", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.0", + "url": "~0.10.1", + "util": "~0.10.3", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", + "dev": true + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz", + "integrity": "sha1-ScoCk+CxlZCl9d4Qx/JlphfY/lQ=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", + "dev": true + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parsejson": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", + "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-exists": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-1.0.0.tgz", + "integrity": "sha1-1aiZjrce83p0w06w2eum6HjuoIE=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pbkdf2-compat": { + "version": "2.0.1", + "resolved": "http://registry.npmjs.org/pbkdf2-compat/-/pbkdf2-compat-2.0.1.tgz", + "integrity": "sha1-tuDI+plJTZTgURV1gCpZpcFC8og=", + "dev": true + }, + "pdfjs-dist": { + "version": "2.0.943", + "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-2.0.943.tgz", + "integrity": "sha512-iLhNcm4XceTHRaSU5o22ZGCm4YpuW5+rf4+BJFH/feBhMQLbCGBry+Jet8Q419QDI4qgARaIQzXuiNrsNWS8Yw==", + "dev": true, + "requires": { + "node-ensure": "^0.0.0", + "worker-loader": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "proxy-addr": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", + "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.8.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz", + "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==", + "dev": true + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true + }, + "raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "requires": { + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" + }, + "dependencies": { + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + } + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "http://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.79.0", + "resolved": "http://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "dev": true, + "requires": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.11.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~2.0.6", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "qs": "~6.3.0", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "~0.4.1", + "uuid": "^3.0.0" + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "^7.0.5" + }, + "dependencies": { + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "ripemd160": { + "version": "0.2.0", + "resolved": "http://registry.npmjs.org/ripemd160/-/ripemd160-0.2.0.tgz", + "integrity": "sha1-K/GYveFnys+lHAqSjoS2i74XH84=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "samsam": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", + "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", + "dev": true + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "4.3.6", + "resolved": "http://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "dev": true + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "dependencies": { + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + } + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "dev": true, + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + } + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "sha.js": { + "version": "2.2.6", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.2.6.tgz", + "integrity": "sha1-F93t3F9yL7ZlAWWIlUYZd4ZzFbo=", + "dev": true + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "simulant": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simulant/-/simulant-0.2.2.tgz", + "integrity": "sha1-8bzlJxK2p6DaON392n6DsgsdoB4=", + "dev": true + }, + "sinon": { + "version": "1.17.7", + "resolved": "http://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", + "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", + "dev": true, + "requires": { + "formatio": "1.1.1", + "lolex": "1.3.2", + "samsam": "1.1.2", + "util": ">=0.10.3 <1" + }, + "dependencies": { + "lolex": { + "version": "1.3.2", + "resolved": "http://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", + "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", + "dev": true + } + } + }, + "sinon-chai": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.14.0.tgz", + "integrity": "sha512-9stIF1utB0ywNHNT7RgiXbdmen8QDCRsrTjw+G9TgKt1Yexjiv8TOWZ6WHsTPz57Yky3DIswZvEqX8fpuHNDtQ==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + } + }, + "sntp": { + "version": "1.0.9", + "resolved": "http://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "requires": { + "hoek": "2.x.x" + } + }, + "socket.io": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.4.tgz", + "integrity": "sha1-L37O3DORvy1cc+KR/iM+bjTU3QA=", + "dev": true, + "requires": { + "debug": "2.3.3", + "engine.io": "~1.8.4", + "has-binary": "0.1.7", + "object-assign": "4.1.0", + "socket.io-adapter": "0.5.0", + "socket.io-client": "1.7.4", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + }, + "object-assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", + "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", + "dev": true + } + } + }, + "socket.io-adapter": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", + "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=", + "dev": true, + "requires": { + "debug": "2.3.3", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "socket.io-client": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.4.tgz", + "integrity": "sha1-7J+CA1btme9tNX8HVtZIcXvdQoE=", + "dev": true, + "requires": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "2.3.3", + "engine.io-client": "~1.8.4", + "has-binary": "0.1.7", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseuri": "0.0.5", + "socket.io-parser": "2.3.1", + "to-array": "0.1.4" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "socket.io-parser": { + "version": "2.3.1", + "resolved": "http://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", + "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", + "dev": true, + "requires": { + "component-emitter": "1.1.2", + "debug": "2.2.0", + "isarray": "0.0.1", + "json3": "3.3.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", + "dev": true + }, + "debug": { + "version": "2.2.0", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "ms": { + "version": "0.7.1", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", + "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", + "dev": true, + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "faye-websocket": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "source-list-map": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", + "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz", + "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz", + "integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz", + "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stream-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-1.0.0.tgz", + "integrity": "sha1-v5tKv7QrJ011FHnkTg/yZWtvEZM=", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^1.0.27-1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "stream-cache": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stream-cache/-/stream-cache-0.0.2.tgz", + "integrity": "sha1-GsWtaDJCjKVWZ9ve45Xa1ObbEY8=", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "stringstream": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", + "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "tapable": { + "version": "0.1.10", + "resolved": "http://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", + "integrity": "sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q=", + "dev": true + }, + "time-stamp": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.2.0.tgz", + "integrity": "sha512-zxke8goJQpBeEgD82CXABeMh0LSJcj7CXEd0OHOg45HgcofF7pxNwZm9+RknpxpDhwN4gFpySkApKfFYfRQnUA==", + "dev": true + }, + "timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", + "dev": true, + "requires": { + "process": "~0.11.0" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "to-iso-string": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", + "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + } + } + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "dev": true, + "requires": { + "punycode": "^1.4.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "twitter-text": { + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/twitter-text/-/twitter-text-1.14.7.tgz", + "integrity": "sha1-d4dzQuxhuwxTl7gWP01dMUeKQOQ=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-detect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", + "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", + "dev": true + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.18" + } + }, + "uglify-js": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", + "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "dev": true, + "optional": true, + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true, + "optional": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", + "dev": true + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-parse": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz", + "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==", + "dev": true, + "requires": { + "querystringify": "^2.0.0", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "useragent": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", + "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", + "dev": true, + "requires": { + "lru-cache": "4.1.x", + "tmp": "0.0.x" + } + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "watchpack": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-0.2.9.tgz", + "integrity": "sha1-Yuqkq15bo1/fwBgnVibjwPXj+ws=", + "dev": true, + "requires": { + "async": "^0.9.0", + "chokidar": "^1.0.0", + "graceful-fs": "^4.1.2" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "http://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true + } + } + }, + "webpack": { + "version": "1.12.14", + "resolved": "http://registry.npmjs.org/webpack/-/webpack-1.12.14.tgz", + "integrity": "sha1-NlUXRDq/s8tDKZ6kRGVb6Jr/kdU=", + "dev": true, + "requires": { + "async": "^1.3.0", + "clone": "^1.0.2", + "enhanced-resolve": "~0.9.0", + "esprima": "^2.5.0", + "interpret": "^0.6.4", + "loader-utils": "^0.2.11", + "memory-fs": "~0.3.0", + "mkdirp": "~0.5.0", + "node-libs-browser": ">= 0.4.0 <=0.6.0", + "optimist": "~0.6.0", + "supports-color": "^3.1.0", + "tapable": "~0.1.8", + "uglify-js": "~2.6.0", + "watchpack": "^0.2.1", + "webpack-core": "~0.6.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.3.0.tgz", + "integrity": "sha1-e8xrYp46Q+hx1+Kaymrop/FcuyA=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + }, + "uglify-js": { + "version": "2.6.4", + "resolved": "http://registry.npmjs.org/uglify-js/-/uglify-js-2.6.4.tgz", + "integrity": "sha1-ZeovswWck5RpLxX+2HwrNsFrmt8=", + "dev": true, + "requires": { + "async": "~0.2.6", + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "http://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "dev": true + } + } + } + } + }, + "webpack-core": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", + "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", + "dev": true, + "requires": { + "source-list-map": "~0.1.7", + "source-map": "~0.4.1" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "webpack-dev-middleware": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", + "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", + "dev": true, + "requires": { + "memory-fs": "~0.4.1", + "mime": "^1.5.0", + "path-is-absolute": "^1.0.0", + "range-parser": "^1.0.3", + "time-stamp": "^2.0.0" + } + }, + "webpack-dev-server": { + "version": "1.14.1", + "resolved": "http://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-1.14.1.tgz", + "integrity": "sha1-5R3iKAcSWLDbbVXg9f7lXuxnVd4=", + "dev": true, + "requires": { + "compression": "^1.5.2", + "connect-history-api-fallback": "1.1.0", + "express": "^4.13.3", + "http-proxy": "^1.11.2", + "optimist": "~0.6.0", + "serve-index": "^1.7.2", + "sockjs": "^0.3.15", + "sockjs-client": "^1.0.3", + "stream-cache": "~0.0.1", + "strip-ansi": "^3.0.0", + "supports-color": "^3.1.1", + "webpack-dev-middleware": "^1.4.0" + }, + "dependencies": { + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "websocket-driver": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "worker-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-2.0.0.tgz", + "integrity": "sha512-tnvNp4K3KQOpfRnD20m8xltE3eWh89Ye+5oj7wXEEHKac1P4oZ6p9oTj8/8ExqoSBnk9nu5Pr4nKfQ1hn2APJw==", + "dev": true, + "requires": { + "loader-utils": "^1.0.0", + "schema-utils": "^0.4.0" + }, + "dependencies": { + "json5": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", + "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", + "dev": true, + "requires": { + "options": ">=0.0.5", + "ultron": "1.0.x" + } + }, + "wtf-8": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", + "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", + "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + } + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..47619d8 --- /dev/null +++ b/package.json @@ -0,0 +1,61 @@ +{ + "name": "pdf-annotate.js", + "version": "0.0.0", + "description": "Annotation layer for pdf.js", + "main": "dist/pdf-annotate.js", + "scripts": { + "test": "karma start --single-run", + "start": "./node_modules/.bin/webpack-dev-server --no-inline --config ./webpack.web.js --publicPath http://ellington.pilotsystems.net:3000", + "build": "MINIFY=1 webpack", + "coveralls": "cat coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js" + }, + "files": [ + "dist" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/instructure/pdf-annotate.js.git" + }, + "keywords": [ + "pdf", + "annotation" + ], + "author": "Matt Zabriskie", + "license": "MIT", + "bugs": { + "url": "https://github.com/instructure/pdf-annotate.js/issues" + }, + "homepage": "https://github.com/instructure/pdf-annotate.js#readme", + "devDependencies": { + "babel-core": "6.7.4", + "babel-loader": "6.2.4", + "babel-plugin-add-module-exports": "^0.2.1", + "babel-preset-es2015": "^6.6.0", + "chai": "^3.5.0", + "coveralls": "^2.11.9", + "istanbul-instrumenter-loader": "^0.2.0", + "karma": "^0.13.22", + "karma-cli": "^0.1.2", + "karma-coverage": "^0.5.5", + "karma-firefox-launcher": "^0.1.7", + "karma-mocha": "^0.2.2", + "karma-sinon-chai": "^1.2.0", + "karma-sourcemap-loader": "^0.3.7", + "karma-webpack": "^1.7.0", + "lolex": "^1.4.0", + "mocha": "^2.4.5", + "object-assign": "^4.0.1", + "pdfjs-dist": "2.0.943", + "simulant": "^0.2.0", + "sinon": "^1.17.3", + "sinon-chai": "^2.8.0", + "twitter-text": "^1.13.4", + "webpack": "1.12.14", + "webpack-dev-server": "1.14.1" + }, + "dependencies": { + "axios": "^0.18.0", + "create-stylesheet": "^0.3.0", + "object-assign": "^4.0.1" + } +} diff --git a/src/PDFJSAnnotate.js b/src/PDFJSAnnotate.js new file mode 100644 index 0000000..83db4a9 --- /dev/null +++ b/src/PDFJSAnnotate.js @@ -0,0 +1,72 @@ +import StoreAdapter from './adapter/StoreAdapter'; +import CRFPAStoreAdapter from './adapter/CRFPAStoreAdapter'; +import render from './render'; +import UI from './UI'; + +export default { + /** + * Abstract class that needs to be defined so PDFJSAnnotate + * knows how to communicate with your server. + */ + StoreAdapter, + + /** + * Implementation of StoreAdapter that stores annotation data to localStorage. + */ + CRFPAStoreAdapter, + + /** + * Abstract instance of StoreAdapter + */ + __storeAdapter: new StoreAdapter(), + + /** + * Getter for the underlying StoreAdapter property + * + * @return {StoreAdapter} + */ + getStoreAdapter() { + return this.__storeAdapter; + }, + + /** + * Setter for the underlying StoreAdapter property + * + * @param {StoreAdapter} adapter The StoreAdapter implementation to be used. + */ + setStoreAdapter(adapter) { + // TODO this throws an error when bundled + // if (!(adapter instanceof StoreAdapter)) { + // throw new Error('adapter must be an instance of StoreAdapter'); + // } + + this.__storeAdapter = adapter; + }, + + /** + * UI is a helper for instrumenting UI interactions for creating, + * editing, and deleting annotations in the browser. + */ + UI, + + /** + * Render the annotations for a page in the PDF Document + * + * @param {SVGElement} svg The SVG element that annotations should be rendered to + * @param {PageViewport} viewport The PDFPage.getViewport data + * @param {Object} data The StoreAdapter.getAnnotations data + * @return {Promise} + */ + render, + + /** + * Convenience method for getting annotation data + * + * @alias StoreAdapter.getAnnotations + * @param {String} documentId The ID of the document + * @return {Promise} + */ + getAnnotations(documentId) { + return this.getStoreAdapter().getAnnotations(...arguments); + } +} diff --git a/src/UI/comments.js b/src/UI/comments.js new file mode 100644 index 0000000..199bcd8 --- /dev/null +++ b/src/UI/comments.js @@ -0,0 +1,128 @@ +import PDFJSAnnotate from '../PDFJSAnnotate' +import twitter from "twitter-text"; +import {addEventListener} from "./event"; +import {createEditOverlay} from "./edit"; + +let commentList = $('#comment-wrapper .comment-list-container'); +let commentForm = $('#comment-wrapper .comment-list-form'); + +// let commentText = commentForm.querySelector('input[type="text"]'); + +export function renderComments(documentId) { + PDFJSAnnotate.getStoreAdapter().getComments(documentId).then((comments) => { + + + commentList.html(''); + commentForm.hide(); + // commentText.focus(); + + // commentForm.onsubmit = function () { + // PDFJSAnnotate.getStoreAdapter().addComment(documentId, annotationId, commentText.value.trim()) + // .then(insertComment) + // .then(() => { + // commentText.value = ''; + // commentText.focus(); + // }); + // + // return false; + // }; + + comments.forEach(insertComment); + }); +} + + +function supportsComments(target) { + let type = target.getAttribute('data-pdf-annotate-type'); + return ['point', 'highlight', 'area'].indexOf(type) > -1; +} + +function insertComment(comment) { + let child = $('
'); + child.addClass('comment-list-item'); + child.attr('uuid', comment.annotation) + child.html(twitter.autoLink(twitter.htmlEscape(comment.content))); + child.bind('click', handleCommentClick); + commentList.append(child); +} + +function handleCommentClick(e) { + let comment = $(e.target); + selectComment(comment.attr('uuid')); +} + + +function scrollToView(element) { + var offset = element.offset().top; + if (!element.is(":visible")) { + element.css({"visibility": "hidden"}).show(); + var offset = element.offset().top; + element.css({"visibility": "", "display": ""}); + } + + var visible_area_start = $(window).scrollTop(); + var visible_area_end = visible_area_start + window.innerHeight; + + if (offset < visible_area_start || offset > visible_area_end) { + // Not in view so scroll to it + if (element.hasClass('comment-list-item')) { + $('.comment-list-container').animate({scrollTop: offset - window.innerHeight / 3}, 300); + } + else { + $('#content-wrapper').animate({scrollTop: offset - window.innerHeight / 3}, 300); + } + return false; + } + return true; +} + +export function selectComment(uuid) { + let comment = $(`.comment-list-item[uuid=${uuid}]`); + $('.comment-list-item').removeClass('selected'); + comment.addClass('selected'); + const annotation = $(`[data-pdf-annotate-id=${uuid}]`)[0]; + createEditOverlay(annotation); + scrollToView($(annotation)); + scrollToView(comment); +} + +// function handleAnnotationClick(target) { +// if (supportsComments(target)) { +// let documentId = target.parentNode.getAttribute('data-pdf-annotate-document'); +// let annotationId = target.getAttribute('data-pdf-annotate-id'); +// +// PDFJSAnnotate.getStoreAdapter().getComments(documentId, annotationId).then((comments) => { +// commentList.innerHTML = ''; +// commentForm.style.display = ''; +// commentText.focus(); +// +// commentForm.onsubmit = function () { +// PDFJSAnnotate.getStoreAdapter().addComment(documentId, annotationId, commentText.value.trim()) +// .then(insertComment) +// .then(() => { +// commentText.value = ''; +// commentText.focus(); +// }); +// +// return false; +// }; +// +// comments.forEach(insertComment); +// }); +// } +// } +// +// function handleAnnotationBlur(target) { +// if (supportsComments(target)) { +// commentList.innerHTML = ''; +// commentForm.style.display = 'none'; +// commentForm.onsubmit = null; +// +// insertComment({content: 'No comments'}); +// } +// } + + +// UI.addEventListener('annotation:click', handleAnnotationClick); +// UI.addEventListener('annotation:blur', handleAnnotationBlur); + diff --git a/src/UI/edit.js b/src/UI/edit.js new file mode 100644 index 0000000..e8bff05 --- /dev/null +++ b/src/UI/edit.js @@ -0,0 +1,375 @@ +import PDFJSAnnotate from '../PDFJSAnnotate'; + +import appendChild from '../render/appendChild'; +import { + addEventListener, + removeEventListener +} from './event'; +import { + BORDER_COLOR, + disableUserSelect, + enableUserSelect, + findSVGContainer, + findSVGAtPoint, + getAnnotationRect, + getMetadata, + scaleDown, + scaleUp +} from './utils'; +import {selectComment} from "./comments"; +import {readonly} from "../initFile"; + +let _enabled = false; +let isDragging = false, overlay; +let dragOffsetX, dragOffsetY, dragStartX, dragStartY; +const OVERLAY_BORDER_SIZE = 3; + +/** + * Create an overlay for editing an annotation. + * + * @param {Element} target The annotation element to apply overlay for + */ +export function createEditOverlay(target) { + destroyEditOverlay(); + + overlay = document.createElement('div'); + let anchor = document.createElement('a'); + let parentNode = findSVGContainer(target).parentNode; + let id = target.getAttribute('data-pdf-annotate-id'); + let rect = getAnnotationRect(target); + let styleLeft = rect.left - OVERLAY_BORDER_SIZE; + let styleTop = rect.top - OVERLAY_BORDER_SIZE; + + overlay.setAttribute('id', 'pdf-annotate-edit-overlay'); + overlay.setAttribute('data-target-id', id); + overlay.style.boxSizing = 'content-box'; + overlay.style.position = 'absolute'; + overlay.style.top = `${styleTop}px`; + overlay.style.left = `${styleLeft}px`; + overlay.style.width = `${rect.width}px`; + overlay.style.height = `${rect.height}px`; + overlay.style.border = `${OVERLAY_BORDER_SIZE}px solid ${BORDER_COLOR}`; + overlay.style.borderRadius = `${OVERLAY_BORDER_SIZE}px`; + + anchor.innerHTML = '×'; + anchor.setAttribute('href', 'javascript://'); + anchor.style.background = '#fff'; + anchor.style.borderRadius = '20px'; + anchor.style.border = '1px solid #bbb'; + anchor.style.color = '#bbb'; + anchor.style.fontSize = '16px'; + anchor.style.padding = '2px'; + anchor.style.textAlign = 'center'; + anchor.style.textDecoration = 'none'; + anchor.style.position = 'absolute'; + anchor.style.top = '-13px'; + anchor.style.right = '-13px'; + anchor.style.width = '25px'; + anchor.style.height = '25px'; + + if(readonly) + anchor.style.display = 'none'; + overlay.appendChild(anchor); + parentNode.appendChild(overlay); + document.addEventListener('click', handleDocumentClick); + document.addEventListener('keyup', handleDocumentKeyup); + document.addEventListener('mousedown', handleDocumentMousedown); + anchor.addEventListener('click', deleteAnnotation); + anchor.addEventListener('mouseover', () => { + anchor.style.color = '#35A4DC'; + anchor.style.borderColor = '#999'; + anchor.style.boxShadow = '0 1px 1px #ccc'; + }); + anchor.addEventListener('mouseout', () => { + anchor.style.color = '#bbb'; + anchor.style.borderColor = '#bbb'; + anchor.style.boxShadow = ''; + }); + overlay.addEventListener('mouseover', () => { + if (!isDragging&&!readonly) { anchor.style.display = ''; } + }); + overlay.addEventListener('mouseout', () => { + anchor.style.display = 'none'; + }); +} + +/** + * Destroy the edit overlay if it exists. + */ +function destroyEditOverlay() { + if (overlay) { + overlay.parentNode.removeChild(overlay); + overlay = null; + } + document.removeEventListener('click', handleDocumentClick); + document.removeEventListener('keyup', handleDocumentKeyup); + document.removeEventListener('mousedown', handleDocumentMousedown); + document.removeEventListener('mousemove', handleDocumentMousemove); + document.removeEventListener('mouseup', handleDocumentMouseup); + enableUserSelect(); +} + +/** + * Delete currently selected annotation + */ +function deleteAnnotation() { + if (!overlay) { return; } + + let annotationId = overlay.getAttribute('data-target-id'); + let nodes = document.querySelectorAll(`[data-pdf-annotate-id="${annotationId}"]`); + let svg = overlay.parentNode.querySelector('svg.annotationLayer'); + let { documentId } = getMetadata(svg); + + [...nodes].forEach((n) => { + n.parentNode.removeChild(n); + }); + + PDFJSAnnotate.getStoreAdapter().deleteAnnotation(documentId, annotationId); + + destroyEditOverlay(); +} + +/** + * Handle document.click event + * + * @param {Event} e The DOM event that needs to be handled + */ +function handleDocumentClick(e) { + if (!findSVGAtPoint(e.clientX, e.clientY)) { return; } + + // Remove current overlay + let overlay = document.getElementById('pdf-annotate-edit-overlay'); + if (overlay) { + if (isDragging || e.target === overlay) { + return; + } + destroyEditOverlay(); + } +} + +/** + * Handle document.keyup event + * + * @param {Event} e The DOM event that needs to be handled + */ +function handleDocumentKeyup(e) { + if (overlay && e.keyCode === 46 && + e.target.nodeName.toLowerCase() !== 'textarea' && + e.target.nodeName.toLowerCase() !== 'input') { + deleteAnnotation(); + } +} + +/** + * Handle document.mousedown event + * + * @param {Event} e The DOM event that needs to be handled + */ +function handleDocumentMousedown(e) { + if (e.target !== overlay) { return; } + + // Highlight and strikeout annotations are bound to text within the document. + // It doesn't make sense to allow repositioning these types of annotations. + let annotationId = overlay.getAttribute('data-target-id'); + let target = document.querySelector(`[data-pdf-annotate-id="${annotationId}"]`); + let type = target.getAttribute('data-pdf-annotate-type'); + + if (type === 'highlight' || type === 'strikeout') { return; } + + if(!readonly) + isDragging = true; + dragOffsetX = e.clientX; + dragOffsetY = e.clientY; + dragStartX = overlay.offsetLeft; + dragStartY = overlay.offsetTop; + + overlay.style.background = 'rgba(255, 255, 255, 0.7)'; + overlay.style.cursor = 'move'; + // if(!readonly) + overlay.querySelector('a').style.display = 'none'; + + document.addEventListener('mousemove', handleDocumentMousemove); + document.addEventListener('mouseup', handleDocumentMouseup); + disableUserSelect(); +} + +/** + * Handle document.mousemove event + * + * @param {Event} e The DOM event that needs to be handled + */ +function handleDocumentMousemove(e) { + if(readonly) + return; + let annotationId = overlay.getAttribute('data-target-id'); + let parentNode = overlay.parentNode; + let rect = parentNode.getBoundingClientRect(); + let y = (dragStartY + (e.clientY - dragOffsetY)); + let x = (dragStartX + (e.clientX - dragOffsetX)); + let minY = 0; + let maxY = rect.height; + let minX = 0; + let maxX = rect.width; + + if (y > minY && y + overlay.offsetHeight < maxY) { + overlay.style.top = `${y}px`; + } + + if (x > minX && x + overlay.offsetWidth < maxX) { + overlay.style.left = `${x}px`; + } +} + +/** + * Handle document.mouseup event + * + * @param {Event} e The DOM event that needs to be handled + */ +function handleDocumentMouseup(e) { + let annotationId = overlay.getAttribute('data-target-id'); + let target = document.querySelectorAll(`[data-pdf-annotate-id="${annotationId}"]`); + let type = target[0].getAttribute('data-pdf-annotate-type'); + let svg = overlay.parentNode.querySelector('svg.annotationLayer'); + let { documentId } = getMetadata(svg); + + overlay.querySelector('a').style.display = ''; + + function getDelta(propX, propY) { + return calcDelta(parseInt(target[0].getAttribute(propX), 10), parseInt(target[0].getAttribute(propY), 10)); + } + + function calcDelta(x, y) { + return { + deltaX: OVERLAY_BORDER_SIZE + scaleDown(svg, {x: overlay.offsetLeft}).x - x, + deltaY: OVERLAY_BORDER_SIZE + scaleDown(svg, {y: overlay.offsetTop}).y - y + }; + } + + PDFJSAnnotate.getStoreAdapter().getAnnotation(documentId, annotationId).then((annotation) => { + if (['area', 'highlight', 'point', 'textbox'].indexOf(type) > -1) { + let { deltaX, deltaY } = getDelta('x', 'y'); + [...target].forEach((t, i) => { + if (deltaY !== 0) { + let modelY = parseInt(t.getAttribute('y'), 10) + deltaY; + let viewY = modelY; + + if (type === 'textbox') { + viewY += annotation.size; + } + + if (type === 'point' && !$.browser.mozilla) { + viewY = scaleUp(svg, { viewY }).viewY; + } + if($.browser.mozilla) + viewY -= 8; + + t.setAttribute('y', viewY); + if (annotation.rectangles) { + annotation.rectangles[i].y = modelY; + } else if (annotation.y) { + annotation.y = modelY; + } + } + if (deltaX !== 0) { + let modelX = parseInt(t.getAttribute('x'), 10) + deltaX; + let viewX = modelX; + + if (type === 'point' && !$.browser.mozilla) { + viewX = scaleUp(svg, { viewX }).viewX; + } + if($.browser.mozilla) + viewX -= 8; + + t.setAttribute('x', viewX); + if (annotation.rectangles) { + annotation.rectangles[i].x = modelX; + } else if (annotation.x) { + annotation.x = modelX; + } + } + }); + // } else if (type === 'strikeout') { + // let { deltaX, deltaY } = getDelta('x1', 'y1'); + // [...target].forEach(target, (t, i) => { + // if (deltaY !== 0) { + // t.setAttribute('y1', parseInt(t.getAttribute('y1'), 10) + deltaY); + // t.setAttribute('y2', parseInt(t.getAttribute('y2'), 10) + deltaY); + // annotation.rectangles[i].y = parseInt(t.getAttribute('y1'), 10); + // } + // if (deltaX !== 0) { + // t.setAttribute('x1', parseInt(t.getAttribute('x1'), 10) + deltaX); + // t.setAttribute('x2', parseInt(t.getAttribute('x2'), 10) + deltaX); + // annotation.rectangles[i].x = parseInt(t.getAttribute('x1'), 10); + // } + // }); + } else if (type === 'drawing') { + let rect = scaleDown(svg, getAnnotationRect(target[0])); + let [originX, originY] = annotation.lines[0]; + let { deltaX, deltaY } = calcDelta(originX, originY); + + // origin isn't necessarily at 0/0 in relation to overlay x/y + // adjust the difference between overlay and drawing coords + deltaY += (originY - rect.top); + deltaX += (originX - rect.left); + + annotation.lines.forEach((line, i) => { + let [x, y] = annotation.lines[i]; + annotation.lines[i][0] = x + deltaX; + annotation.lines[i][1] = y + deltaY; + }); + + target[0].parentNode.removeChild(target[0]); + appendChild(svg, annotation); + } + + if(!readonly) + PDFJSAnnotate.getStoreAdapter().editAnnotation(documentId, annotationId, annotation); + }); + + setTimeout(() => { + isDragging = false; + }, 0); + + overlay.style.background = ''; + overlay.style.cursor = ''; + + document.removeEventListener('mousemove', handleDocumentMousemove); + document.removeEventListener('mouseup', handleDocumentMouseup); + enableUserSelect(); +} + +/** + * Handle annotation.click event + * + * @param {Element} e The annotation element that was clicked + */ +function handleAnnotationClick(target) { + const type = target.dataset['pdfAnnotateType'] + if(type==='point') + selectComment(target.dataset['pdfAnnotateId']); + createEditOverlay(target); +} + +/** + * Enable edit mode behavior. + */ +export function enableEdit () { + if (_enabled) { return; } + + _enabled = true; + addEventListener('annotation:click', handleAnnotationClick); +}; + +/** + * Disable edit mode behavior. + */ +export function disableEdit () { + destroyEditOverlay(); + + + if (!_enabled) { return; } + + _enabled = false; + removeEventListener('annotation:click', handleAnnotationClick); +}; + diff --git a/src/UI/event.js b/src/UI/event.js new file mode 100644 index 0000000..acebd1a --- /dev/null +++ b/src/UI/event.js @@ -0,0 +1,55 @@ +import EventEmitter from 'events'; +import { + findAnnotationAtPoint, + findSVGAtPoint +} from './utils'; + +const emitter = new EventEmitter; + +let clickNode; + +/** + * Handle document.click event + * + * @param {Event} e The DOM event to be handled + */ +// document.addEventListener('mousedown', function handleDocumentClick(e) { + +document.addEventListener('click', function handleDocumentClick(e) { + if (!findSVGAtPoint(e.clientX, e.clientY)) { return; } + + let target = findAnnotationAtPoint(e.clientX, e.clientY); + + // Emit annotation:blur if clickNode is no longer clicked + if (clickNode && clickNode !== target) { + emitter.emit('annotation:blur', clickNode); + } + + // Emit annotation:click if target was clicked + if (target) { + emitter.emit('annotation:click', target); + } + + clickNode = target; +}); + +// let mouseOverNode; +// document.addEventListener('mousemove', function handleDocumentMousemove(e) { +// let target = findAnnotationAtPoint(e.clientX, e.clientY); +// +// // Emit annotation:mouseout if target was mouseout'd +// if (mouseOverNode && !target) { +// emitter.emit('annotation:mouseout', mouseOverNode); +// } +// +// // Emit annotation:mouseover if target was mouseover'd +// if (target && mouseOverNode !== target) { +// emitter.emit('annotation:mouseover', target); +// } +// +// mouseOverNode = target; +// }); + +export function fireEvent() { emitter.emit(...arguments); }; +export function addEventListener() { emitter.on(...arguments); }; +export function removeEventListener() { emitter.removeListener(...arguments); }; diff --git a/src/UI/index.js b/src/UI/index.js new file mode 100644 index 0000000..9db4759 --- /dev/null +++ b/src/UI/index.js @@ -0,0 +1,17 @@ +import { addEventListener, removeEventListener, fireEvent } from './event'; +import { disableEdit, enableEdit } from './edit'; +import { disablePen, enablePen, setPen } from './pen'; +import { disablePoint, enablePoint } from './point'; +import { disableRect, enableRect } from './rect'; +import { disableText, enableText, setText } from './text'; +import { createPage, renderPage } from './page'; + +export default { + addEventListener, removeEventListener, fireEvent, + disableEdit, enableEdit, + disablePen, enablePen, setPen, + disablePoint, enablePoint, + disableRect, enableRect, + disableText, enableText, setText, + createPage, renderPage +}; diff --git a/src/UI/page.js b/src/UI/page.js new file mode 100644 index 0000000..9c0c27d --- /dev/null +++ b/src/UI/page.js @@ -0,0 +1,243 @@ +import PDFJSAnnotate from '../PDFJSAnnotate'; +import renderScreenReaderHints from '../a11y/renderScreenReaderHints'; + +// Template for creating a new page +const PAGE_TEMPLATE = ` + +`; + +/** + * Create a new page to be appended to the DOM. + * + * @param {Number} pageNumber The page number that is being created + * @return {HTMLElement} + */ +export function createPage(pageNumber) { + let temp = document.createElement('div'); + temp.innerHTML = PAGE_TEMPLATE; + + let page = temp.children[0]; + let canvas = page.querySelector('canvas'); + + page.setAttribute('id', `pageContainer${pageNumber}`); + page.setAttribute('data-page-number', pageNumber); + + canvas.mozOpaque = true; + canvas.setAttribute('id', `page${pageNumber}`); + + // let svg = page.querySelector('.'); + // // let svg = document.body; + // console.log(svg) + // // let svg = document.getElementById(); + // + // document.addEventListener('click', function handleDocumentClick(e) { + // console.log(click) + // if (!findSVGAtPoint(e.clientX, e.clientY)) { + // return; + // } + // + // let target = findAnnotationAtPoint(e.clientX, e.clientY); + // + // // Emit annotation:blur if clickNode is no longer clicked + // if (clickNode && clickNode !== target) { + // emitter.emit('annotation:blur', clickNode); + // } + // + // // Emit annotation:click if target was clicked + // if (target) { + // emitter.emit('annotation:click', target); + // } + // + // clickNode = target; + // }); + + return page; +} + +/** + * Render a page that has already been created. + * + * @param {Number} pageNumber The page number to be rendered + * @param {Object} renderOptions The options for rendering + * @return {Promise} Settled once rendering has completed + * A settled Promise will be either: + * - fulfilled: [pdfPage, annotations] + * - rejected: Error + */ +export function renderPage(pageNumber, annotations, renderOptions) { + let { + documentId, + pdfDocument, + scale, + rotate + } = renderOptions; + + // Load the page and annotations + return Promise.all([ + pdfDocument.getPage(pageNumber), + ]).then(([pdfPage]) => { + let page = document.getElementById(`pageContainer${pageNumber}`); + let svg = page.querySelector('.annotationLayer'); + let canvas = page.querySelector('.canvasWrapper canvas'); + let canvasContext = canvas.getContext('2d', {alpha: false}); + let viewport = pdfPage.getViewport(scale, rotate); + let transform = scalePage(pageNumber, viewport, canvasContext); + + // Render the page + return Promise.all([ + pdfPage.render({ canvasContext, viewport, transform }), + PDFJSAnnotate.render(svg, viewport, {pageNumber, documentId, annotations:annotations[pageNumber]}) + ]).then(() => { + // Text content is needed for a11y, but is also necessary for creating + // highlight and strikeout annotations which require selecting text. + return pdfPage.getTextContent({normalizeWhitespace: true}).then((textContent) => { + return new Promise((resolve, reject) => { + // Render text layer for a11y of text content + let textLayer = page.querySelector(`.textLayer`); + let textLayerFactory = new pdfjsViewer.DefaultTextLayerFactory(); + let textLayerBuilder = textLayerFactory.createTextLayerBuilder(textLayer, pageNumber -1, viewport); + textLayerBuilder.setTextContent(textContent); + textLayerBuilder.render(); + + // Enable a11y for annotations + // Timeout is needed to wait for `textLayerBuilder.render` + setTimeout(() => { + try { + renderScreenReaderHints(annotations.annotations); + resolve(); + } catch (e) { + reject(e); + } + }); + }); + }); + }).then(() => { + // Indicate that the page was loaded + page.setAttribute('data-loaded', 'true'); + + return [pdfPage, annotations]; + }); + }); +} + +/** + * Scale the elements of a page. + * + * @param {Number} pageNumber The page number to be scaled + * @param {Object} viewport The viewport of the PDF page (see pdfPage.getViewport(scale, rotate)) + * @param {Object} context The canvas context that the PDF page is rendered to + * @return {Array} The transform data for rendering the PDF page + */ +function scalePage(pageNumber, viewport, context) { + let page = document.getElementById(`pageContainer${pageNumber}`); + let canvas = page.querySelector('.canvasWrapper canvas'); + let svg = page.querySelector('.annotationLayer'); + let wrapper = page.querySelector('.canvasWrapper'); + let textLayer = page.querySelector('.textLayer'); + let outputScale = getOutputScale(context); + let transform = !outputScale.scaled ? null : [outputScale.sx, 0, 0, outputScale.sy, 0, 0]; + let sfx = approximateFraction(outputScale.sx); + let sfy = approximateFraction(outputScale.sy); + + // Adjust width/height for scale + page.style.visibility = ''; + canvas.width = roundToDivide(viewport.width * outputScale.sx, sfx[0]); + canvas.height = roundToDivide(viewport.height * outputScale.sy, sfy[0]); + canvas.style.width = roundToDivide(viewport.width, sfx[1]) + 'px'; + canvas.style.height = roundToDivide(viewport.height, sfx[1]) + 'px'; + svg.setAttribute('width', viewport.width); + svg.setAttribute('height', viewport.height); + svg.style.width = `${viewport.width}px`; + svg.style.height = `${viewport.height}px`; + page.style.width = `${viewport.width}px`; + page.style.height = `${viewport.height}px`; + wrapper.style.width = `${viewport.width}px`; + wrapper.style.height = `${viewport.height}px`; + textLayer.style.width = `${viewport.width}px`; + textLayer.style.height = `${viewport.height}px`; + + return transform; +} + +/** + * The following methods are taken from mozilla/pdf.js and as such fall under + * the Apache License (http://www.apache.org/licenses/). + * + * Original source can be found at mozilla/pdf.js: + * https://github.com/mozilla/pdf.js/blob/master/web/ui_utils.js + */ + +/** + * Approximates a float number as a fraction using Farey sequence (max order + * of 8). + * + * @param {Number} x Positive float number + * @return {Array} Estimated fraction: the first array item is a numerator, + * the second one is a denominator. + */ +function approximateFraction(x) { + // Fast path for int numbers or their inversions. + if (Math.floor(x) === x) { + return [x, 1]; + } + + const xinv = 1 / x; + const limit = 8; + if (xinv > limit) { + return [1, limit]; + } else if (Math.floor(xinv) === xinv) { + return [1, xinv]; + } + + const x_ = x > 1 ? xinv : x; + + // a/b and c/d are neighbours in Farey sequence. + let a = 0, b = 1, c = 1, d = 1; + + // Limit search to order 8. + while (true) { + // Generating next term in sequence (order of q). + let p = a + c, q = b + d; + if (q > limit) { + break; + } + if (x_ <= p / q) { + c = p; d = q; + } else { + a = p; b = q; + } + } + + // Select closest of neighbours to x. + if (x_ - a / b < c / d - x_) { + return x_ === x ? [a, b] : [b, a]; + } else { + return x_ === x ? [c, d] : [d, c]; + } +} + +function getOutputScale(ctx) { + let devicePixelRatio = window.devicePixelRatio || 1; + let backingStoreRatio = ctx.webkitBackingStorePixelRatio || + ctx.mozBackingStorePixelRatio || + ctx.msBackingStorePixelRatio || + ctx.oBackingStorePixelRatio || + ctx.backingStorePixelRatio || 1; + let pixelRatio = devicePixelRatio / backingStoreRatio; + return { + sx: pixelRatio, + sy: pixelRatio, + scaled: pixelRatio !== 1 + }; +} + +function roundToDivide(x, div) { + let r = x % div; + return r === 0 ? x : Math.round(x - r + div); +} diff --git a/src/UI/pen.js b/src/UI/pen.js new file mode 100644 index 0000000..982fd0b --- /dev/null +++ b/src/UI/pen.js @@ -0,0 +1,151 @@ +import PDFJSAnnotate from '../PDFJSAnnotate'; +import appendChild from '../render/appendChild'; +import { + disableUserSelect, + enableUserSelect, + findSVGAtPoint, + getMetadata, + scaleDown +} from './utils'; + +let _enabled = false; +let _penSize; +let _penColor; +let path; +let lines; + +/** + * Handle document.mousedown event + */ +function handleDocumentMousedown() { + path = null; + lines = []; + + document.addEventListener('mousemove', handleDocumentMousemove); + document.addEventListener('mouseup', handleDocumentMouseup); +} + +/** + * Handle document.mouseup event + * + * @param {Event} e The DOM event to be handled + */ +function handleDocumentMouseup(e) { + let svg; + if (lines.length > 1 && (svg = findSVGAtPoint(e.clientX, e.clientY))) { + let { documentId, pageNumber } = getMetadata(svg); + + PDFJSAnnotate.getStoreAdapter().addAnnotation(documentId, pageNumber, { + type: 'drawing', + width: _penSize, + color: _penColor, + lines + } + ).then((annotation) => { + if (path) { + svg.removeChild(path); + } + + appendChild(svg, annotation); + }); + } + + document.removeEventListener('mousemove', handleDocumentMousemove); + document.removeEventListener('mouseup', handleDocumentMouseup); +} + +/** + * Handle document.mousemove event + * + * @param {Event} e The DOM event to be handled + */ +function handleDocumentMousemove(e) { + savePoint(e.clientX, e.clientY); +} + +/** + * Handle document.keyup event + * + * @param {Event} e The DOM event to be handled + */ +function handleDocumentKeyup(e) { + // Cancel rect if Esc is pressed + if (e.keyCode === 27) { + lines = null; + path.parentNode.removeChild(path); + document.removeEventListener('mousemove', handleDocumentMousemove); + document.removeEventListener('mouseup', handleDocumentMouseup); + } +} + +/** + * Save a point to the line being drawn. + * + * @param {Number} x The x coordinate of the point + * @param {Number} y The y coordinate of the point + */ +function savePoint(x, y) { + let svg = findSVGAtPoint(x, y); + if (!svg) { + return; + } + + let rect = svg.getBoundingClientRect(); + let point = scaleDown(svg, { + x: x - rect.left, + y: y - rect.top + }); + + lines.push([point.x, point.y]); + + if (lines.length <= 1) { + return; + } + + if (path) { + svg.removeChild(path); + } + + path = appendChild(svg, { + type: 'drawing', + color: _penColor, + width: _penSize, + lines + }); +} + +/** + * Set the attributes of the pen. + * + * @param {Number} penSize The size of the lines drawn by the pen + * @param {String} penColor The color of the lines drawn by the pen + */ +export function setPen(penSize = 1, penColor = '000000') { + _penSize = parseInt(penSize, 10); + _penColor = penColor; +} + +/** + * Enable the pen behavior + */ +export function enablePen() { + if (_enabled) { return; } + + _enabled = true; + document.addEventListener('mousedown', handleDocumentMousedown); + document.addEventListener('keyup', handleDocumentKeyup); + disableUserSelect(); +} + +/** + * Disable the pen behavior + */ +export function disablePen() { + if (!_enabled) { return; } + + _enabled = false; + document.removeEventListener('mousedown', handleDocumentMousedown); + document.removeEventListener('keyup', handleDocumentKeyup); + enableUserSelect(); +} + diff --git a/src/UI/point.js b/src/UI/point.js new file mode 100644 index 0000000..e4b2e8d --- /dev/null +++ b/src/UI/point.js @@ -0,0 +1,127 @@ +import PDFJSAnnotate from '../PDFJSAnnotate'; +import appendChild from '../render/appendChild'; +import { + BORDER_COLOR, + findSVGAtPoint, + getMetadata, + scaleDown +} from './utils'; + +let _enabled = false; +let input; + +/** + * Handle document.mouseup event + * + * @param {Event} The DOM event to be handled + */ +function handleDocumentMouseup(e) { + + if (input || !findSVGAtPoint(e.clientX, e.clientY)) { + return + } + + input = document.createElement('input'); + input.setAttribute('id', 'pdf-annotate-point-input'); + input.setAttribute('placeholder', 'Enter comment'); + input.style.border = `3px solid ${BORDER_COLOR}`; + input.style.borderRadius = '3px'; + input.style.position = 'absolute'; + input.style.top = `${e.clientY}px`; + input.style.left = `${e.clientX}px`; + + input.addEventListener('blur', handleInputBlur); + input.addEventListener('keyup', handleInputKeyup); + + document.body.appendChild(input); + input.focus(); +} + +/** + * Handle input.blur event + */ +function handleInputBlur() { + savePoint(); +} + +/** + * Handle input.keyup event + * + * @param {Event} e The DOM event to handle + */ +function handleInputKeyup(e) { + if (e.keyCode === 27) { + closeInput(); + } else if (e.keyCode === 13) { + savePoint(); + } +} + +/** + * Save a new point annotation from input + */ +function savePoint() { + if (input.value.trim().length > 0) { + let clientX = parseInt(input.style.left, 10); + let clientY = parseInt(input.style.top, 10); + let content = input.value.trim(); + let svg = findSVGAtPoint(clientX, clientY); + if (!svg) { + return; + } + + let rect = svg.getBoundingClientRect(); + let { documentId, pageNumber } = getMetadata(svg); + let annotation = Object.assign({ + type: 'point' + }, scaleDown(svg, { + x: clientX - rect.left, + y: clientY - rect.top + }) + ); + + PDFJSAnnotate.getStoreAdapter().addAnnotation(documentId, pageNumber, annotation) + .then((annotation) => { + PDFJSAnnotate.getStoreAdapter().addComment( + documentId, + annotation.uuid, + content + ); + + appendChild(svg, annotation); + }); + } + + closeInput(); +} + +/** + * Close the input element + */ +function closeInput() { + input.removeEventListener('blur', handleInputBlur); + input.removeEventListener('keyup', handleInputKeyup); + document.body.removeChild(input); + input = null; +} + +/** + * Enable point annotation behavior + */ +export function enablePoint() { + if (_enabled) { return; } + + _enabled = true; + document.addEventListener('mouseup', handleDocumentMouseup); +} + +/** + * Disable point annotation behavior + */ +export function disablePoint() { + if (!_enabled) { return; } + + _enabled = false; + document.removeEventListener('mouseup', handleDocumentMouseup); +} + diff --git a/src/UI/rect.js b/src/UI/rect.js new file mode 100644 index 0000000..7409af9 --- /dev/null +++ b/src/UI/rect.js @@ -0,0 +1,234 @@ +import PDFJSAnnotate from '../PDFJSAnnotate'; +import appendChild from '../render/appendChild'; +import { + BORDER_COLOR, + disableUserSelect, + enableUserSelect, + findSVGAtPoint, + getMetadata, + getOffset, + scaleDown, + scaleUp +} from './utils'; + +let _enabled = false; +let _type; +let overlay; +let originY; +let originX; + +/** + * Get the current window selection as rects + * + * @return {Array} An Array of rects + */ +function getSelectionRects() { + try { + let selection = window.getSelection(); + let range = selection.getRangeAt(0); + let rects = range.getClientRects(); + + if (rects.length > 0 && + rects[0].width > 0 && + rects[0].height > 0) { + return rects; + } + } catch (e) {} + + return null; +} + +/** + * Handle document.mousedown event + * + * @param {Event} e The DOM event to handle + */ +function handleDocumentMousedown(e) { + let svg; + if (_type !== 'area' || !(svg = findSVGAtPoint(e.clientX, e.clientY))) { + return; + } + + let rect = svg.getBoundingClientRect(); + originY = e.clientY; + originX = e.clientX; + + overlay = document.createElement('div'); + overlay.style.position = 'absolute'; + overlay.style.top = `${originY - rect.top}px`; + overlay.style.left = `${originX - rect.left}px`; + overlay.style.border = `3px solid ${BORDER_COLOR}`; + overlay.style.borderRadius = '3px'; + svg.parentNode.appendChild(overlay); + + document.addEventListener('mousemove', handleDocumentMousemove); + disableUserSelect(); +} + +/** + * Handle document.mousemove event + * + * @param {Event} e The DOM event to handle + */ +function handleDocumentMousemove(e) { + let svg = overlay.parentNode.querySelector('svg.annotationLayer'); + let rect = svg.getBoundingClientRect(); + + if (originX + (e.clientX - originX) < rect.right) { + overlay.style.width = `${e.clientX - originX}px`; + } + + if (originY + (e.clientY - originY) < rect.bottom) { + overlay.style.height = `${e.clientY - originY}px`; + } +} + +/** + * Handle document.mouseup event + * + * @param {Event} e The DOM event to handle + */ +function handleDocumentMouseup(e) { + let rects; + if (_type !== 'area' && (rects = getSelectionRects())) { + let svg = findSVGAtPoint(rects[0].left, rects[0].top); + saveRect(_type, [...rects].map((r) => { + return { + top: r.top, + left: r.left, + width: r.width, + height: r.height + }; + })); + } else if (_type === 'area' && overlay) { + let svg = overlay.parentNode.querySelector('svg.annotationLayer'); + let rect = svg.getBoundingClientRect(); + saveRect(_type, [{ + top: parseInt(overlay.style.top, 10) + rect.top, + left: parseInt(overlay.style.left, 10) + rect.left, + width: parseInt(overlay.style.width, 10), + height: parseInt(overlay.style.height, 10) + }]); + + overlay.parentNode.removeChild(overlay); + overlay = null; + + document.removeEventListener('mousemove', handleDocumentMousemove); + enableUserSelect(); + } +} + +/** + * Handle document.keyup event + * + * @param {Event} e The DOM event to handle + */ +function handleDocumentKeyup(e) { + // Cancel rect if Esc is pressed + if (e.keyCode === 27) { + let selection = window.getSelection(); + selection.removeAllRanges(); + if (overlay && overlay.parentNode) { + overlay.parentNode.removeChild(overlay); + overlay = null; + document.removeEventListener('mousemove', handleDocumentMousemove); + } + } +} + +/** + * Save a rect annotation + * + * @param {String} type The type of rect (area, highlight, strikeout) + * @param {Array} rects The rects to use for annotation + * @param {String} color The color of the rects + */ +function saveRect(type, rects, color) { + let svg = findSVGAtPoint(rects[0].left, rects[0].top); + let node; + let annotation; + + if (!svg) { + return; + } + + let boundingRect = svg.getBoundingClientRect(); + + if (!color) { + if (type === 'highlight') { + color = 'FFFF00'; + } else if (type === 'strikeout') { + color = 'FF0000'; + } + } + + // Initialize the annotation + annotation = { + type, + color, + rectangles: [...rects].map((r) => { + let offset = 0; + + if (type === 'strikeout') { + offset = r.height / 2; + } + + return scaleDown(svg, { + y: (r.top + offset) - boundingRect.top, + x: r.left - boundingRect.left, + width: r.width, + height: r.height + }); + }).filter((r) => r.width > 0 && r.height > 0 && r.x > -1 && r.y > -1) + }; + + // Short circuit if no rectangles exist + if (annotation.rectangles.length === 0) { + return; + } + + // Special treatment for area as it only supports a single rect + if (type === 'area') { + let rect = annotation.rectangles[0]; + delete annotation.rectangles; + annotation.x = rect.x; + annotation.y = rect.y; + annotation.width = rect.width; + annotation.height = rect.height; + } + + let { documentId, pageNumber } = getMetadata(svg); + + // Add the annotation + PDFJSAnnotate.getStoreAdapter().addAnnotation(documentId, pageNumber, annotation) + .then((annotation) => { + appendChild(svg, annotation); + }); +} + +/** + * Enable rect behavior + */ +export function enableRect(type) { + _type = type; + + if (_enabled) { return; } + + _enabled = true; + document.addEventListener('mouseup', handleDocumentMouseup); + document.addEventListener('mousedown', handleDocumentMousedown); + document.addEventListener('keyup', handleDocumentKeyup); +} + +/** + * Disable rect behavior + */ +export function disableRect() { + if (!_enabled) { return; } + + _enabled = false; + document.removeEventListener('mouseup', handleDocumentMouseup); + document.removeEventListener('mousedown', handleDocumentMousedown); + document.removeEventListener('keyup', handleDocumentKeyup); +} + diff --git a/src/UI/text.js b/src/UI/text.js new file mode 100644 index 0000000..d97f7fc --- /dev/null +++ b/src/UI/text.js @@ -0,0 +1,146 @@ +import PDFJSAnnotate from '../PDFJSAnnotate'; +import appendChild from '../render/appendChild'; +import { + BORDER_COLOR, + findSVGAtPoint, + getMetadata, + scaleDown +} from './utils'; + +let _enabled = false; +let input; +let _textSize; +let _textColor; + +/** + * Handle document.mouseup event + * + * @param {Event} e The DOM event to handle + */ +function handleDocumentMouseup(e) { + if (input || !findSVGAtPoint(e.clientX, e.clientY)) { + return; + } + + input = document.createElement('input'); + input.setAttribute('id', 'pdf-annotate-text-input'); + input.setAttribute('placeholder', 'Enter text'); + input.style.border = `3px solid ${BORDER_COLOR}`; + input.style.borderRadius = '3px'; + input.style.position = 'absolute'; + input.style.top = `${e.clientY}px`; + input.style.left = `${e.clientX}px`; + input.style.fontSize = `${_textSize}px`; + + input.addEventListener('blur', handleInputBlur); + input.addEventListener('keyup', handleInputKeyup); + + document.body.appendChild(input); + input.focus(); +} + +/** + * Handle input.blur event + */ +function handleInputBlur() { + saveText(); +} + +/** + * Handle input.keyup event + * + * @param {Event} e The DOM event to handle + */ +function handleInputKeyup(e) { + if (e.keyCode === 27) { + closeInput(); + } else if (e.keyCode === 13) { + saveText(); + } +} + +/** + * Save a text annotation from input + */ +function saveText() { + if (input.value.trim().length > 0) { + let clientX = parseInt(input.style.left, 10); + let clientY = parseInt(input.style.top, 10); + let svg = findSVGAtPoint(clientX, clientY); + if (!svg) { + return; + } + + let { documentId, pageNumber } = getMetadata(svg); + let rect = svg.getBoundingClientRect(); + let annotation = Object.assign({ + type: 'textbox', + size: _textSize, + color: _textColor, + content: input.value.trim() + }, scaleDown(svg, { + x: clientX - rect.left, + y: clientY - rect.top, + width: input.offsetWidth, + height: input.offsetHeight + }) + ); + + PDFJSAnnotate.getStoreAdapter().addAnnotation(documentId, pageNumber, annotation) + .then((annotation) => { + appendChild(svg, annotation); + }); + } + + closeInput(); +} + +/** + * Close the input + */ +function closeInput() { + try { + if (input) { + input.removeEventListener('blur', handleInputBlur); + input.removeEventListener('keyup', handleInputKeyup); + document.body.removeChild(input); + input = null; + } + } catch(e){ + console.log('Try/catch is necessary because exist a error in Safari'); + } +} + +/** + * Set the text attributes + * + * @param {Number} textSize The size of the text + * @param {String} textColor The color of the text + */ +export function setText(textSize = 12, textColor = '000000') { + _textSize = parseInt(textSize, 10); + _textColor = textColor; +} + + +/** + * Enable text behavior + */ +export function enableText() { + if (_enabled) { return; } + + _enabled = true; + document.addEventListener('mouseup', handleDocumentMouseup); +} + + +/** + * Disable text behavior + */ +export function disableText() { + if (!_enabled) { return; } + + _enabled = false; + document.removeEventListener('mouseup', handleDocumentMouseup); +} + diff --git a/src/UI/utils.js b/src/UI/utils.js new file mode 100644 index 0000000..fe66de2 --- /dev/null +++ b/src/UI/utils.js @@ -0,0 +1,315 @@ +import createStyleSheet from 'create-stylesheet'; + +export const BORDER_COLOR = '#00BFFF'; + +const userSelectStyleSheet = createStyleSheet({ + body: { + '-webkit-user-select': 'none', + '-moz-user-select': 'none', + '-ms-user-select': 'none', + 'user-select': 'none' + } +}); +userSelectStyleSheet.setAttribute('data-pdf-annotate-user-select', 'true'); + +/** + * Find the SVGElement that contains all the annotations for a page + * + * @param {Element} node An annotation within that container + * @return {SVGElement} The container SVG or null if it can't be found + */ +export function findSVGContainer(node) { + let parentNode = node; + + while ((parentNode = parentNode.parentNode) && + parentNode !== document) { + if (parentNode.nodeName.toUpperCase() === 'SVG' && + parentNode.getAttribute('data-pdf-annotate-container') === 'true') { + return parentNode; + } + } + + return null; +} + + +/** + * Find an SVGElement container at a given point + * + * @param {Number} x The x coordinate of the point + * @param {Number} y The y coordinate of the point + * @return {SVGElement} The container SVG or null if one can't be found + */ +export function findSVGAtPoint(x, y) { + let elements = document.querySelectorAll('svg[data-pdf-annotate-container="true"]'); + for (let i=0, l=elements.length; i= rect.top && y <= rect.bottom && x >= rect.left && x <= rect.right; +} + +/** + * Get the rect of an annotation element accounting for offset. + * + * @param {Element} el The element to get the rect of + * @return {Object} The dimensions of the element + */ +export function getOffsetAnnotationRect(el) { + let rect = getAnnotationRect(el); + let { offsetLeft, offsetTop } = getOffset(el); + + return { + top: rect.top + offsetTop, + left: rect.left + offsetLeft, + right: rect.right + offsetLeft, + bottom: rect.bottom + offsetTop + }; +} + +/** + * Get the rect of an annotation element. + * + * @param {Element} el The element to get the rect of + * @return {Object} The dimensions of the element + */ +export function getAnnotationRect(el) { + let h = 0, w = 0, x = 0, y = 0; + let rect = el.getBoundingClientRect(); + // TODO this should be calculated somehow + const LINE_OFFSET = 16; + // debugger; + switch (el.nodeName.toLowerCase()) { + case 'path': + let minX, maxX, minY, maxY; + + el.getAttribute('d').replace(/Z/, '').split('M').splice(1).forEach((p) => { + var s = p.split(' ').map(i => parseInt(i, 10)); + + if (typeof minX === 'undefined' || s[0] < minX) { minX = s[0]; } + if (typeof maxX === 'undefined' || s[2] > maxX) { maxX = s[2]; } + if (typeof minY === 'undefined' || s[1] < minY) { minY = s[1]; } + if (typeof maxY === 'undefined' || s[3] > maxY) { maxY = s[3]; } + }); + + h = maxY - minY; + w = maxX - minX; + x = minX; + y = minY; + break; + + case 'line': + h = parseInt(el.getAttribute('y2'), 10) - parseInt(el.getAttribute('y1'), 10); + w = parseInt(el.getAttribute('x2'), 10) - parseInt(el.getAttribute('x1'), 10); + x = parseInt(el.getAttribute('x1'), 10); + y = parseInt(el.getAttribute('y1'), 10); + + if (h === 0) { + h += LINE_OFFSET; + y -= (LINE_OFFSET / 2); + } + break; + + case 'text': + h = rect.height; + w = rect.width; + x = parseInt(el.getAttribute('x'), 10); + y = parseInt(el.getAttribute('y'), 10) - h; + break; + + case 'g': + let { offsetLeft, offsetTop } = getOffset(el); + h = rect.height; + w = rect.width; + x = rect.left - offsetLeft; + y = rect.top - offsetTop; + + if (el.getAttribute('data-pdf-annotate-type') === 'strikeout') { + h += LINE_OFFSET; + y -= (LINE_OFFSET / 2); + } + break; + + case 'rect': + case 'svg': + h = parseInt(el.getAttribute('height'), 10); + w = parseInt(el.getAttribute('width'), 10); + x = parseInt(el.getAttribute('x'), 10); + y = parseInt(el.getAttribute('y'), 10); + break; + } + + // Result provides same properties as getBoundingClientRect + let result = { + top: y, + left: x, + width: w, + height: h, + right: x + w, + bottom: y + h + }; + + // For the case of nested SVG (point annotations) and grouped + // lines or rects no adjustment needs to be made for scale. + // I assume that the scale is already being handled + // natively by virtue of the `transform` attribute. + if (!['svg', 'g'].includes(el.nodeName.toLowerCase())) { + result = scaleUp(findSVGAtPoint(rect.left, rect.top), result); + } + + // // comment point need to be scaled on FF + if(el.nodeName.toLowerCase() == 'svg' && $.browser.mozilla){ + result = scaleUp(findSVGAtPoint(rect.left, rect.top), result); + } + + return result; +} + +/** + * Adjust scale from normalized scale (100%) to rendered scale. + * + * @param {SVGElement} svg The SVG to gather metadata from + * @param {Object} rect A map of numeric values to scale + * @return {Object} A copy of `rect` with values scaled up + */ +export function scaleUp(svg, rect) { + let result = {}; + let { viewport } = getMetadata(svg); + + Object.keys(rect).forEach((key) => { + result[key] = rect[key] * viewport.scale; + }); + + return result; +} + +/** + * Adjust scale from rendered scale to a normalized scale (100%). + * + * @param {SVGElement} svg The SVG to gather metadata from + * @param {Object} rect A map of numeric values to scale + * @return {Object} A copy of `rect` with values scaled down + */ +export function scaleDown(svg, rect) { + let result = {}; + let { viewport } = getMetadata(svg); + + Object.keys(rect).forEach((key) => { + result[key] = rect[key] / viewport.scale; + }); + + return result; +} + +/** + * Get the scroll position of an element, accounting for parent elements + * + * @param {Element} el The element to get the scroll position for + * @return {Object} The scrollTop and scrollLeft position + */ +export function getScroll(el) { + let scrollTop = 0; + let scrollLeft = 0; + let parentNode = el; + + while ((parentNode = parentNode.parentNode) && + parentNode !== document) { + scrollTop += parentNode.scrollTop; + scrollLeft += parentNode.scrollLeft; + } + + return { scrollTop, scrollLeft }; +} + +/** + * Get the offset position of an element, accounting for parent elements + * + * @param {Element} el The element to get the offset position for + * @return {Object} The offsetTop and offsetLeft position + */ +export function getOffset(el) { + let parentNode = el; + + while ((parentNode = parentNode.parentNode) && + parentNode !== document) { + if (parentNode.nodeName.toUpperCase() === 'SVG') { + break; + } + } + + let rect = parentNode.getBoundingClientRect(); + + return { offsetLeft: rect.left, offsetTop: rect.top }; +} + +/** + * Disable user ability to select text on page + */ +export function disableUserSelect() { + if (!userSelectStyleSheet.parentNode) { + document.head.appendChild(userSelectStyleSheet); + } +} + + +/** + * Enable user ability to select text on page + */ +export function enableUserSelect() { + if (userSelectStyleSheet.parentNode) { + userSelectStyleSheet.parentNode.removeChild(userSelectStyleSheet); + } +} + +/** + * Get the metadata for a SVG container + * + * @param {SVGElement} svg The SVG container to get metadata for + */ +export function getMetadata(svg) { + return { + documentId: svg.getAttribute('data-pdf-annotate-document'), + pageNumber: parseInt(svg.getAttribute('data-pdf-annotate-page'), 10), + viewport: JSON.parse(svg.getAttribute('data-pdf-annotate-viewport')) + }; +} diff --git a/src/a11y/createScreenReaderOnly.js b/src/a11y/createScreenReaderOnly.js new file mode 100644 index 0000000..cfeff36 --- /dev/null +++ b/src/a11y/createScreenReaderOnly.js @@ -0,0 +1,20 @@ +/** + * Create a node that is only visible to screen readers + * + * @param {String} content The text content that should be read by screen reader + * @param {String} [annotationId] The ID of the annotation assocaited + * @return {Element} An Element that is only visible to screen readers + */ +export default function createScreenReaderOnly(content, annotationId) { + let node = document.createElement('div'); + let text = document.createTextNode(content); + node.appendChild(text); + node.setAttribute('id', `pdf-annotate-screenreader-${annotationId}`); + node.style.position = 'absolute'; + node.style.left = '-10000px'; + node.style.top = 'auto'; + node.style.width = '1px'; + node.style.height = '1px'; + node.style.overflow = 'hidden'; + return node; +} diff --git a/src/a11y/initEventHandlers.js b/src/a11y/initEventHandlers.js new file mode 100644 index 0000000..b75e9ff --- /dev/null +++ b/src/a11y/initEventHandlers.js @@ -0,0 +1,112 @@ +import insertScreenReaderHint from './insertScreenReaderHint'; +import renderScreenReaderHints from './renderScreenReaderHints'; +import insertScreenReaderComment from './insertScreenReaderComment'; +import renderScreenReaderComments from './renderScreenReaderComments'; +import { addEventListener } from '../UI/event'; +import PDFJSAnnotate from '../PDFJSAnnotate'; + +/** + * Initialize the event handlers for keeping screen reader hints synced with data + */ +export default function initEventHandlers() { + addEventListener('annotation:add', (documentId, pageNumber, annotation) => { + reorderAnnotationsByType(documentId, pageNumber, annotation.type); + }); + addEventListener('annotation:edit', (documentId, annotationId, annotation) => { + reorderAnnotationsByType(documentId, annotation.page, annotation.type); + }); + addEventListener('annotation:delete', removeAnnotation); + addEventListener('comment:add', insertComment); + addEventListener('comment:delete', removeComment); +} + +/** + * Reorder the annotation numbers by annotation type + * + * @param {String} documentId The ID of the document + * @param {Number} pageNumber The page number of the annotations + * @param {Strig} type The annotation type + */ +function reorderAnnotationsByType(documentId, pageNumber, type) { + PDFJSAnnotate.getStoreAdapter().getAnnotations(documentId) + .then((annotationsByPage) => { + let annotations = []; + for(const page of Object.keys(annotationsByPage)) + for(const annotation in annotationsByPage[page]){ + if(annotation.type == type) + annotations.push(annotation) + } + return annotations; + // annotationsByPage(page) = + // return annotationsByPage[page].filter((a) => { + // return a.type === type; + // }); + // return annotationsByPage; + }) + .then((annotations) => { + annotations.forEach((a) => { + removeAnnotation(documentId, a.uuid); + }); + + return annotations; + }) + .then(renderScreenReaderHints); +} + +/** + * Remove the screen reader hint for an annotation + * + * @param {String} documentId The ID of the document + * @param {String} annotationId The Id of the annotation + */ +function removeAnnotation(documentId, annotationId) { + removeElementById(`pdf-annotate-screenreader-${annotationId}`); + removeElementById(`pdf-annotate-screenreader-${annotationId}-end`); +} + +/** + * Insert a screen reader hint for a comment + * + * @param {String} documentId The ID of the document + * @param {String} annotationId The ID of tha assocated annotation + * @param {Object} comment The comment to insert a hint for + */ +function insertComment(documentId, annotationId, comment) { + let list = document.querySelector(`pdf-annotate-screenreader-comment-list-${annotationId}`); + let promise; + + if (!list) { + promise = renderScreenReaderComments(documentId, annotationId, []).then(() => { + list = document.querySelector(`pdf-annotate-screenreader-comment-list-${annotationId}`); + return true; + }); + } else { + promise = Promise.resolve(true); + } + + promise.then(() => { + insertScreenReaderComment(comment); + }); +} + +/** + * Remove a screen reader hint for a comment + * + * @param {String} documentId The ID of the document + * @param {String} commentId The ID of the comment + */ +function removeComment(documentId, commentId) { + removeElementById(`pdf-annotate-screenreader-comment-${commentId}`); +} + +/** + * Remove an element from the DOM by it's ID if it exists + * + * @param {String} elementID The ID of the element to be removed + */ +function removeElementById(elementId) { + let el = document.getElementById(elementId); + if (el) { + el.parentNode.removeChild(el); + } +} diff --git a/src/a11y/insertElementWithinChildren.js b/src/a11y/insertElementWithinChildren.js new file mode 100644 index 0000000..b4918fd --- /dev/null +++ b/src/a11y/insertElementWithinChildren.js @@ -0,0 +1,51 @@ +import insertElementWithinElement from './insertElementWithinElement'; +import { pointIntersectsRect } from '../UI/utils'; +import { scaleUp } from '../UI/utils'; + +/** + * Insert an element at a point within the document. + * This algorithm will try to insert between elements if possible. + * It will however use `insertElementWithinElement` if it is more accurate. + * + * @param {Element} el The element to be inserted + * @param {Number} x The x coordinate of the point + * @param {Number} y The y coordinate of the point + * @param {Number} pageNumber The page number to limit elements to + * @return {Boolean} True if element was able to be inserted, otherwise false + */ +export default function insertElementWithinChildren(el, x, y, pageNumber) { + // Try and use most accurate method of inserting within an element + if (insertElementWithinElement(el, x, y, pageNumber, true)) { + return true; + } + + // Fall back to inserting between elements + let svg = document.querySelector(`svg[data-pdf-annotate-page="${pageNumber}"]`); + let rect = svg.getBoundingClientRect(); + let nodes = [...svg.parentNode.querySelectorAll('.textLayer > div')]; + + y = scaleUp(svg, {y}).y + rect.top; + x = scaleUp(svg, {x}).x + rect.left; + + // Find the best node to insert before + for (let i=0, l=nodes.length; i') { + while(head.length) { + tail.unshift(head.pop()); + if (tail[0] === '<') { + break; + } + } + } + + // Check if width of temp based on current head value satisfies x + temp.innerHTML = head.join(''); + let width = scaleDown(svg, {width: temp.getBoundingClientRect().width}).width; + if (left + width <= x) { + break; + } + tail.unshift(head.pop()); + } + + // Update original node with new markup, including element to be inserted + node.innerHTML = head.join('') + el.outerHTML + tail.join(''); + temp.parentNode.removeChild(temp); + + return true; +} + +/** + * Get a text layer element at a given point on a page + * + * @param {Number} x The x coordinate of the point + * @param {Number} y The y coordinate of the point + * @param {Number} pageNumber The page to limit elements to + * @return {Element} First text layer element found at the point + */ +function textLayerElementFromPoint(x, y, pageNumber) { + let svg = document.querySelector(`svg[data-pdf-annotate-page="${pageNumber}"]`); + let rect = svg.getBoundingClientRect(); + y = scaleUp(svg, {y}).y + rect.top; + x = scaleUp(svg, {x}).x + rect.left; + return [...svg.parentNode.querySelectorAll('.textLayer [data-canvas-width]')].filter((el) => { + return pointIntersectsRect(x, y, el.getBoundingClientRect()); + })[0]; +} diff --git a/src/a11y/insertScreenReaderComment.js b/src/a11y/insertScreenReaderComment.js new file mode 100644 index 0000000..4f8fde1 --- /dev/null +++ b/src/a11y/insertScreenReaderComment.js @@ -0,0 +1,18 @@ +/** + * Insert a comment into the DOM to be available by screen reader + * + * @param {Object} comment The comment to be inserted + */ +export default function insertScreenReaderComment(comment) { + if (!comment) { + return; + } + + let list = document.querySelector(`#pdf-annotate-screenreader-${comment.annotation} ol`); + if (list) { + let item = document.createElement('li'); + item.setAttribute('id', `pdf-annotate-screenreader-comment-${comment.uuid}`); + item.appendChild(document.createTextNode(`${comment.content}`)); + list.appendChild(item); + } +} diff --git a/src/a11y/insertScreenReaderHint.js b/src/a11y/insertScreenReaderHint.js new file mode 100644 index 0000000..229dd36 --- /dev/null +++ b/src/a11y/insertScreenReaderHint.js @@ -0,0 +1,60 @@ +import createScreenReaderOnly from './createScreenReaderOnly'; +import insertElementWithinChildren from './insertElementWithinChildren'; +import insertElementWithinElement from './insertElementWithinElement'; +import renderScreenReaderComments from './renderScreenReaderComments'; + +// Annotation types that support comments +const COMMENT_TYPES = ['highlight', 'point', 'area']; + +/** + * Insert a hint into the DOM for screen readers for a specific annotation. + * + * @param {Object} annotation The annotation to insert a hint for + * @param {Number} num The number of the annotation out of all annotations of the same type + */ +export default function insertScreenReaderHint(annotation, num = 0) { + switch (annotation.type) { + case 'highlight': + case 'strikeout': + let rects = annotation.rectangles; + let first = rects[0]; + let last = rects[rects.length - 1]; + + insertElementWithinElement( + createScreenReaderOnly(`Begin ${annotation.type} annotation ${num}`, annotation.uuid), + first.x, first.y, annotation.page, true + ); + + insertElementWithinElement( + createScreenReaderOnly(`End ${annotation.type} annotation ${num}`, `${annotation.uuid}-end`), + last.x + last.width, last.y, annotation.page, false + ); + break; + + case 'textbox': + case 'point': + let text = annotation.type === 'textbox' ? ` (content: ${annotation.content})` : ''; + + insertElementWithinChildren( + createScreenReaderOnly(`${annotation.type} annotation ${num}${text}`, annotation.uuid), + annotation.x, annotation.y, annotation.page + ); + break; + + case 'drawing': + case 'area': + let x = typeof annotation.x !== 'undefined' ? annotation.x : annotation.lines[0][0]; + let y = typeof annotation.y !== 'undefined' ? annotation.y : annotation.lines[0][1]; + + insertElementWithinChildren( + createScreenReaderOnly(`Unlabeled drawing`, annotation.uuid), + x, y, annotation.page + ); + break; + } + + // Include comments in screen reader hint + if (COMMENT_TYPES.includes(annotation.type)) { + renderScreenReaderComments(annotation.documentId, annotation.uuid); + } +} diff --git a/src/a11y/renderScreenReaderComments.js b/src/a11y/renderScreenReaderComments.js new file mode 100644 index 0000000..562ffc9 --- /dev/null +++ b/src/a11y/renderScreenReaderComments.js @@ -0,0 +1,48 @@ +import PDFJSAnnotate from '../PDFJSAnnotate'; +import insertScreenReaderComment from './insertScreenReaderComment'; + +/** + * Insert the comments into the DOM to be available by screen reader + * + * Example output: + *
+ *
Begin highlight 1
+ *
    + *
  1. Foo
  2. + *
  3. Bar
  4. + *
  5. Baz
  6. + *
  7. Qux
  8. + *
+ *
+ *
Some highlighted text goes here...
+ *
End highlight 1
+ * + * NOTE: `screenReaderOnly` is not a real class, just used for brevity + * + * @param {String} documentId The ID of the document + * @param {String} annotationId The ID of the annotation + * @param {Array} [comments] Optionally preloaded comments to be rendered + * @return {Promise} + */ +export default function renderScreenReaderComments(documentId, annotationId, comments) { + let promise; + + if (Array.isArray(comments)) { + promise = Promise.resolve(comments); + } else { + promise = PDFJSAnnotate.getStoreAdapter().getComments(documentId, annotationId); + } + + return promise.then((comments) => { + // Node needs to be found by querying DOM as it may have been inserted as innerHTML + // leaving `screenReaderNode` as an invalid reference (see `insertElementWithinElement`). + let node = document.getElementById(`pdf-annotate-screenreader-${annotationId}`); + if (node) { + let list = document.createElement('ol'); + list.setAttribute('id', `pdf-annotate-screenreader-comment-list-${annotationId}`); + list.setAttribute('aria-label', 'Comments'); + node.appendChild(list); + comments.forEach(insertScreenReaderComment); + } + }); +} diff --git a/src/a11y/renderScreenReaderHints.js b/src/a11y/renderScreenReaderHints.js new file mode 100644 index 0000000..83bf98c --- /dev/null +++ b/src/a11y/renderScreenReaderHints.js @@ -0,0 +1,60 @@ +import insertScreenReaderHint from './insertScreenReaderHint'; +import initEventHandlers from './initEventHandlers'; + +// TODO This is not the right place for this to live +initEventHandlers(); + +/** + * Insert hints into the DOM for screen readers. + * + * @param {Array} annotations The annotations that hints are inserted for + */ +export default function renderScreenReaderHints(annotations) { + annotations = Array.isArray(annotations) ? annotations : []; + + // Insert hints for each type + Object.keys(SORT_TYPES).forEach((type) => { + let sortBy = SORT_TYPES[type]; + annotations + .filter((a) => a.type === type) + .sort(sortBy) + .forEach((a, i) => insertScreenReaderHint(a, i + 1)); + }); +} + +// Sort annotations first by y, then by x. +// This allows hints to be injected in the order they appear, +// which makes numbering them easier. +function sortByPoint(a, b) { + if (a.y < b.y) { + return a.x - b.x; + } else { + return 1; + } +} + +// Sort annotation by it's first rectangle +function sortByRectPoint(a, b) { + return sortByPoint(a.rectangles[0], b.rectangles[0]); +} + +// Sort annotation by it's first line +function sortByLinePoint(a, b) { + let lineA = a.lines[0]; + let lineB = b.lines[0]; + return sortByPoint( + {x: lineA[0], y: lineA[1]}, + {x: lineB[0], y: lineB[1]} + ); +} + +// Arrange supported types and associated sort methods +const SORT_TYPES = { + 'highlight': sortByRectPoint, + 'strikeout': sortByRectPoint, + 'drawing': sortByLinePoint, + 'textbox': sortByPoint, + 'point': sortByPoint, + 'area': sortByPoint +}; + diff --git a/src/adapter/CRFPAStoreAdapter.js b/src/adapter/CRFPAStoreAdapter.js new file mode 100644 index 0000000..cf1fc51 --- /dev/null +++ b/src/adapter/CRFPAStoreAdapter.js @@ -0,0 +1,211 @@ +import axios from 'axios'; +import uuid from '../utils/uuid'; +import StoreAdapter from './StoreAdapter'; +import {documentId as fileUuid} from '../initFile'; +import {renderComments} from "../UI/comments"; + +axios.defaults.xsrfCookieName = 'csrftoken'; +axios.defaults.xsrfHeaderName = 'X-CSRFToken'; + +export default class CRFPAStoreAdapter extends StoreAdapter { + constructor() { + + const API = axios.create({ + baseURL: '/pdfannotator', + timeout: 10000, + withCredentials: true, + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*' + } + }); + + + super({ + getAnnotations(documentId) { + + return API.get('/get-annotations/', { + params: { + fileUuid, + } + }).then(function (response) { + return response.data; + }); + + // return new Promise((resolve, reject) => { + // let annotations = getAnnotations(documentId).filter((i) => { + // return i.page === pageNumber && i.class === 'Annotation'; + // }); + // + // resolve({ + // documentId, + // pageNumber, + // annotations + // }); + // }); + }, + + getAnnotation(documentId, annotationId) { + return API.get('/get-annotation/', { + params: { + fileUuid, + annotationId + } + }).then(function (response) { + return response.data; + }); + }, + + addAnnotation(documentId, pageNumber, annotation) { + + annotation.class = 'Annotation'; + annotation.page = pageNumber; + annotation.uuid = uuid(); + + return API.post('/add-annotation/', { + fileUuid, + page: pageNumber, + annotation + }).then(function (response) { + return annotation; + }); + + // return new Promise((resolve, reject) => { + + // annotation.class = 'Annotation'; + // annotation.uuid = uuid(); + // annotation.page = pageNumber; + + // let annotations = getAnnotations(documentId); + // annotations.push(annotation); + // updateAnnotations(documentId, annotations); + + // resolve(annotation); + // }); + }, + + editAnnotation(documentId, annotationId, annotation) { + return API.post('/update-annotation/', { + fileUuid, + annotationId, + annotation + }).then(function (response) { + if(annotation.type==='point') + renderComments(); + return response; + }).then(function (response) { + return annotation; + }); + + // return new Promise((resolve, reject) => { + // let annotations = getAnnotations(documentId); + // annotations[findAnnotation(documentId, annotationId)] = annotation; + // updateAnnotations(documentId, annotations); + // + // resolve(annotation); + // }); + }, + + deleteAnnotation(documentId, annotationId) { + return API.post('/delete-annotation/', { + annotationId, + fileUuid + }).then(function (response) { + renderComments(); + return response; + }).then(function (response) { + return true; + }); + + // return new Promise((resolve, reject) => { + // let index = findAnnotation(documentId, annotationId); + // if (index > -1) { + // let annotations = getAnnotations(documentId); + // annotations.splice(index, 1); + // updateAnnotations(documentId, annotations); + // } + // + // resolve(true); + // }); + }, + + getComments(documentId) { + return API.get('/get-comments/', { + params: { + fileUuid + } + }).then(function (response) { + return response.data; + }); + + // return new Promise((resolve, reject) => { + // resolve(getAnnotations(documentId).filter((i) => { + // return i.class === 'Comment' && i.annotation === annotationId; + // })); + // }); + }, + + addComment(documentId, annotationId, content) { + + return API.post('/add-comment/', { + fileUuid, + annotationId, + content + }).then(function (response) { + renderComments(); + return response; + }).then(function (response) { + return content; + }); + + // return new Promise((resolve, reject) => { + // let comment = { + // class: 'Comment', + // uuid: uuid(), + // annotation: annotationId, + // content: content + // }; + // + // + // + // let annotations = getAnnotations(documentId); + // annotations.push(comment); + // updateAnnotations(documentId, annotations); + // + // resolve(comment); + // }); + }, + + // deleteComment(documentId, commentId) { + // + // return API.post('/delete-comment/', { + // fileUuid, + // commentId, + // }).then(function (response) { + // return true; + // }); + // } + }); + } +} +// +// function getAnnotations(documentId) { +// return JSON.parse(localStorage.getItem(`${documentId}/annotations`)) || []; +// } +// +// function updateAnnotations(documentId, annotations) { +// localStorage.setItem(`${documentId}/annotations`, JSON.stringify(annotations)); +// } + +// function findAnnotation(documentId, annotationId) { +// let index = -1; +// let annotations = getAnnotations(documentId); +// for (let i=0, l=annotations.length; i { + let annotations = getAnnotations(documentId).filter((i) => { + return i.page === pageNumber && i.class === 'Annotation'; + }); + + resolve({ + documentId, + pageNumber, + annotations + }); + }); + }, + + getAnnotation(documentId, annotationId) { + return Promise.resolve(getAnnotations(documentId)[findAnnotation(documentId, annotationId)]); + }, + + addAnnotation(documentId, pageNumber, annotation) { + return new Promise((resolve, reject) => { + + annotation.class = 'Annotation'; + annotation.uuid = uuid(); + annotation.page = pageNumber; + + let annotations = getAnnotations(documentId); + annotations.push(annotation); + updateAnnotations(documentId, annotations); + + resolve(annotation); + }); + }, + + editAnnotation(documentId, annotationId, annotation) { + return new Promise((resolve, reject) => { + let annotations = getAnnotations(documentId); + annotations[findAnnotation(documentId, annotationId)] = annotation; + updateAnnotations(documentId, annotations); + + resolve(annotation); + }); + }, + + deleteAnnotation(documentId, annotationId) { + return new Promise((resolve, reject) => { + let index = findAnnotation(documentId, annotationId); + if (index > -1) { + let annotations = getAnnotations(documentId); + annotations.splice(index, 1); + updateAnnotations(documentId, annotations); + } + + resolve(true); + }); + }, + + getComments(documentId, annotationId) { + return new Promise((resolve, reject) => { + resolve(getAnnotations(documentId).filter((i) => { + return i.class === 'Comment' && i.annotation === annotationId; + })); + }); + }, + + addComment(documentId, annotationId, content) { + return new Promise((resolve, reject) => { + let comment = { + class: 'Comment', + uuid: uuid(), + annotation: annotationId, + content: content + }; + + + + let annotations = getAnnotations(documentId); + annotations.push(comment); + updateAnnotations(documentId, annotations); + + resolve(comment); + }); + }, + + deleteComment(documentId, commentId) { + return new Promise((resolve, reject) => { + getAnnotations(documentId); + let index = -1; + let annotations = getAnnotations(documentId); + for (let i=0, l=annotations.length; i -1) { + annotations.splice(index, 1); + updateAnnotations(documentId, annotations); + } + + resolve(true); + }); + } + }); + } +} + +function getAnnotations(documentId) { + return JSON.parse(localStorage.getItem(`${documentId}/annotations`)) || []; +} + +function updateAnnotations(documentId, annotations) { + localStorage.setItem(`${documentId}/annotations`, JSON.stringify(annotations)); +} + +function findAnnotation(documentId, annotationId) { + let index = -1; + let annotations = getAnnotations(documentId); + for (let i=0, l=annotations.length; i { + if (typeof definition[key] === 'function' && + typeof this[key] === 'function') { + this[key] = definition[key]; + } + }); + } + + /** + * Get all the annotations for a given document and page number. + * + * @param {String} documentId The ID for the document the annotations belong to + * @param {Number} pageNumber The number of the page the annotations belong to + * @return {Promise} + */ + __getAnnotations(documentId) { abstractFunction('getAnnotations'); } + get getAnnotations() { return this.__getAnnotations; } + set getAnnotations(fn) { + this.__getAnnotations = function getAnnotations(documentId) { + return fn(...arguments).then((annotations) => { + // TODO may be best to have this happen on the server + // if (annotations) { + // annotations.forEach((a) => { + // a.documentId = documentId; + // }); + // } + return annotations; + }); + }; + } + + /** + * Get the definition for a specific annotation. + * + * @param {String} documentId The ID for the document the annotation belongs to + * @param {String} annotationId The ID for the annotation + * @return {Promise} + */ + getAnnotation(documentId, annotationId) { abstractFunction('getAnnotation'); } + + /** + * Add an annotation + * + * @param {String} documentId The ID for the document to add the annotation to + * @param {String} pageNumber The page number to add the annotation to + * @param {Object} annotation The definition for the new annotation + * @return {Promise} + */ + __addAnnotation(documentId, pageNumber, annotation) { abstractFunction('addAnnotation'); } + get addAnnotation() { return this.__addAnnotation; } + set addAnnotation(fn) { + this.__addAnnotation = function addAnnotation(documentId, pageNumber, annotation) { + return fn(...arguments).then((annotation) => { + fireEvent('annotation:add', documentId, pageNumber, annotation); + return annotation; + }); + }; + } + + /** + * Edit an annotation + * + * @param {String} documentId The ID for the document + * @param {String} pageNumber the page number of the annotation + * @param {Object} annotation The definition of the modified annotation + * @return {Promise} + */ + __editAnnotation(documentId, pageNumber, annotation) { abstractFunction('editAnnotation'); } + get editAnnotation() { return this.__editAnnotation; } + set editAnnotation(fn) { + this.__editAnnotation = function editAnnotation(documentId, annotationId, annotation) { + return fn(...arguments).then((annotation) => { + fireEvent('annotation:edit', documentId, annotationId, annotation); + return annotation; + }); + }; + } + + /** + * Delete an annotation + * + * @param {String} documentId The ID for the document + * @param {String} annotationId The ID for the annotation + * @return {Promise} + */ + __deleteAnnotation(documentId, annotationId) { abstractFunction('deleteAnnotation'); } + get deleteAnnotation() { return this.__deleteAnnotation; } + set deleteAnnotation(fn) { + this.__deleteAnnotation = function deleteAnnotation(documentId, annotationId) { + return fn(...arguments).then((success) => { + if (success) { + fireEvent('annotation:delete', documentId, annotationId); + } + return success; + }); + }; + } + + /** + * Get all the comments for an annotation + * + * @param {String} documentId The ID for the document + * @param {String} annotationId The ID for the annotation + * @return {Promise} + */ + getComments(documentId, annotationId) { abstractFunction('getComments'); } + + /** + * Add a new comment + * + * @param {String} documentId The ID for the document + * @param {String} annotationId The ID for the annotation + * @param {Object} content The definition of the comment + * @return {Promise} + */ + __addComment(documentId, annotationId, content) { abstractFunction('addComment'); } + get addComment() { return this.__addComment; } + set addComment(fn) { + this.__addComment = function addComment(documentId, annotationId, content) { + return fn(...arguments).then((comment) => { + fireEvent('comment:add', documentId, annotationId, comment); + return comment; + }); + }; + } + + /** + * Delete a comment + * + * @param {String} documentId The ID for the document + * @param {String} commentId The ID for the comment + * @return {Promise} + */ + __deleteComment(documentId, commentId) { abstractFunction('deleteComment'); } + get deleteComment() { return this.__deleteComment; } + set deleteComment(fn) { + this.__deleteComment = function deleteComment(documentId, commentId) { + return fn(...arguments).then((success) => { + if (success) { + fireEvent('comment:delete', documentId, commentId); + } + return success; + }); + }; + } +} diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..eecde88 --- /dev/null +++ b/src/index.js @@ -0,0 +1,314 @@ +import PDFJSAnnotate from './PDFJSAnnotate'; +import {documentId, documentUrl, readonly} from './initFile'; +export default PDFJSAnnotate; + +import twitter from 'twitter-text'; +import initColorPicker from './initColorPicker'; + +const { UI } = PDFJSAnnotate; +import {renderComments} from "./UI/comments"; + +let PAGE_HEIGHT; +let RENDER_OPTIONS = { + documentId:documentUrl, + pdfDocument: null, + enhanceTextSelection:true, + scale: parseFloat(localStorage.getItem(`${documentId}/scale`), 10) || 1.33, + rotate: parseInt(localStorage.getItem(`${documentId}/rotate`), 10) || 0 +}; + +PDFJSAnnotate.setStoreAdapter(new PDFJSAnnotate.CRFPAStoreAdapter()); +// pdfjsLib.workerSrc = '/static/pdfannotator/pdf.worker.js'; + +// Render stuff + +// let renderedPages = {}; +// document.getElementById('content-wrapper').addEventListener('scroll', function (e) { +// let visiblePageNum = Math.round(e.target.scrollTop / PAGE_HEIGHT) + 1; +// let visiblePage = document.querySelector(`.page[data-page-number="${visiblePageNum}"][data-loaded="false"]`); +// if (visiblePage) { +// // Prevent invoking UI.renderPage on the same page more than once. +// if ( !renderedPages[visiblePageNum] ) { +// renderedPages[visiblePageNum] = true; +// setTimeout(function () { +// UI.renderPage(visiblePageNum, RENDER_OPTIONS); +// }); +// } +// } +// }); + +let NUM_PAGES = 0; +function render() { + + pdfjsLib.getDocument(RENDER_OPTIONS.documentId).then((pdf) => { + RENDER_OPTIONS.pdfDocument = pdf; + + let viewer = document.getElementById('viewer'); + viewer.innerHTML = ''; + NUM_PAGES = pdf._pdfInfo.numPages; + for (let i=0; i{ + for(let num = 1; num <= NUM_PAGES; num++) { + pdf.getPage(num).then(function () { + UI.renderPage(num, annotations, RENDER_OPTIONS).then(([pdfPage, annotations]) => { + let viewport = pdfPage.getViewport(RENDER_OPTIONS.scale, RENDER_OPTIONS.rotate); + PAGE_HEIGHT = viewport.height; + if($.browser.mozilla) + $('.textLayer>.endOfContent').remove(); + }); + + }); + } + }); + }); +} +render(); + +if(!readonly) { +// Text stuff + (function () { + let textSize; + let textColor; + + function initText() { + // let size = document.querySelector('.toolbar .text-size'); + // [8, 9, 10, 11, 12, 14, 18, 24, 30, 36, 48, 60, 72, 96].forEach((s) => { + // size.appendChild(new Option(s, s)); + // }); + // + // setText( + // localStorage.getItem(`${RENDER_OPTIONS.documentId}/text/size`) || 12, + // localStorage.getItem(`${RENDER_OPTIONS.documentId}/text/color`) || '#EF4437' + // ); + setText( + 12, '#EF4437' + ); + + // initColorPicker(document.querySelector('.text-color'), textColor, function (value) { + // setText(textSize, value); + // }); + } + + function setText(size, color) { + // let modified = false; + // + // if (textSize !== size) { + // modified = true; + // textSize = size; + // localStorage.setItem(`${RENDER_OPTIONS.documentId}/text/size`, textSize); + // // document.querySelector('.toolbar .text-size').value = textSize; + // } + // + // if (textColor !== color) { + // modified = true; + // textColor = color; + // localStorage.setItem(`${RENDER_OPTIONS.documentId}/text/color`, textColor); + // + // let selected = document.querySelector('.toolbar .text-color.color-selected'); + // if (selected) { + // selected.classList.remove('color-selected'); + // selected.removeAttribute('aria-selected'); + // } + // + // selected = document.querySelector(`.toolbar .text-color[data-color="${color}"]`); + // if (selected) { + // selected.classList.add('color-selected'); + // selected.setAttribute('aria-selected', true); + // } + // + // } + + // if (modified) { + UI.setText(size, color); + // } + } + + // function handleTextSizeChange(e) { + // setText(e.target.value, textColor); + // } + + // document.querySelector('.toolbar .text-size').addEventListener('change', handleTextSizeChange); + + initText(); + })(); + +// Pen stuff + (function () { + let penSize; + let penColor; + + function initPen() { + let size = document.querySelector('.toolbar .pen-size'); + for (let i = 0; i < 20; i++) { + size.appendChild(new Option(i + 1, i + 1)); + } + + setPen( + localStorage.getItem(`${RENDER_OPTIONS.documentId}/pen/size`) || 1, + localStorage.getItem(`${RENDER_OPTIONS.documentId}/pen/color`) || '#000000' + ); + + initColorPicker(document.querySelector('.pen-color'), penColor, function (value) { + setPen(penSize, value); + }); + } + + function setPen(size, color) { + let modified = false; + + if (penSize !== size) { + modified = true; + penSize = size; + localStorage.setItem(`${RENDER_OPTIONS.documentId}/pen/size`, penSize); + document.querySelector('.toolbar .pen-size').value = penSize; + } + + if (penColor !== color) { + modified = true; + penColor = color; + localStorage.setItem(`${RENDER_OPTIONS.documentId}/pen/color`, penColor); + + let selected = document.querySelector('.toolbar .pen-color.color-selected'); + if (selected) { + selected.classList.remove('color-selected'); + selected.removeAttribute('aria-selected'); + } + + selected = document.querySelector(`.toolbar .pen-color[data-color="${color}"]`); + if (selected) { + selected.classList.add('color-selected'); + selected.setAttribute('aria-selected', true); + } + } + + if (modified) { + UI.setPen(penSize, penColor); + } + } + + function handlePenSizeChange(e) { + setPen(e.target.value, penColor); + } + + document.querySelector('.toolbar .pen-size').addEventListener('change', handlePenSizeChange); + + initPen(); + })(); + +// Toolbar buttons + (function () { + let tooltype = localStorage.getItem(`${RENDER_OPTIONS.documentId}/tooltype`) || 'cursor'; + if (tooltype) { + setActiveToolbarItem(tooltype, document.querySelector(`.toolbar button[data-tooltype=${tooltype}]`)); + } + + function setActiveToolbarItem(type, button) { + let active = document.querySelector('.toolbar button.active'); + if (active) { + active.classList.remove('active'); + + switch (tooltype) { + case 'cursor': + UI.disableEdit(); + break; + case 'draw': + UI.disablePen(); + break; + case 'text': + UI.disableText(); + break; + case 'point': + UI.disablePoint(); + break; + case 'area': + case 'highlight': + case 'strikeout': + UI.disableRect(); + break; + } + } + + if (button) { + button.classList.add('active'); + } + if (tooltype !== type) { + localStorage.setItem(`${RENDER_OPTIONS.documentId}/tooltype`, type); + } + tooltype = type; + + switch (type) { + case 'cursor': + UI.enableEdit(); + break; + case 'draw': + UI.enablePen(); + break; + case 'text': + UI.enableText(); + break; + case 'point': + UI.enablePoint(); + break; + case 'area': + case 'highlight': + case 'strikeout': + UI.enableRect(type); + break; + } + } + + function handleToolbarClick(e) { + if (e.target.nodeName === 'BUTTON') { + setActiveToolbarItem(e.target.getAttribute('data-tooltype'), e.target); + } + } + + document.querySelector('.toolbar').addEventListener('click', handleToolbarClick); + })(); +} + +if(readonly) + UI.enableEdit(); + +// Scale/rotate +(function () { + function setScaleRotate(scale, rotate) { + scale = parseFloat(scale, 10); + rotate = parseInt(rotate, 10); + + if (RENDER_OPTIONS.scale !== scale || RENDER_OPTIONS.rotate !== rotate) { + RENDER_OPTIONS.scale = scale; + RENDER_OPTIONS.rotate = rotate; + + localStorage.setItem(`${RENDER_OPTIONS.documentId}/scale`, RENDER_OPTIONS.scale); + localStorage.setItem(`${RENDER_OPTIONS.documentId}/rotate`, RENDER_OPTIONS.rotate % 360); + + render(); + } + } + + function handleScaleChange(e) { + setScaleRotate(e.target.value, RENDER_OPTIONS.rotate); + } + + function handleRotateCWClick() { + setScaleRotate(RENDER_OPTIONS.scale, RENDER_OPTIONS.rotate + 90); + } + + function handleRotateCCWClick() { + setScaleRotate(RENDER_OPTIONS.scale, RENDER_OPTIONS.rotate - 90); + } + + document.querySelector('.toolbar select.scale').value = RENDER_OPTIONS.scale; + document.querySelector('.toolbar select.scale').addEventListener('change', handleScaleChange); + document.querySelector('.toolbar .rotate-ccw').addEventListener('click', handleRotateCCWClick); + document.querySelector('.toolbar .rotate-cw').addEventListener('click', handleRotateCWClick); +})(); + + +renderComments(documentId); + diff --git a/src/initColorPicker.js b/src/initColorPicker.js new file mode 100644 index 0000000..3a0b833 --- /dev/null +++ b/src/initColorPicker.js @@ -0,0 +1,94 @@ +// Color picker component +const COLORS = [ + {hex: '#000000', name: 'Black'}, + {hex: '#EF4437', name: 'Red'}, + {hex: '#E71F63', name: 'Pink'}, + {hex: '#8F3E97', name: 'Purple'}, + {hex: '#65499D', name: 'Deep Purple'}, + {hex: '#4554A4', name: 'Indigo'}, + {hex: '#2083C5', name: 'Blue'}, + {hex: '#35A4DC', name: 'Light Blue'}, + {hex: '#09BCD3', name: 'Cyan'}, + {hex: '#009688', name: 'Teal'}, + {hex: '#43A047', name: 'Green'}, + {hex: '#8BC34A', name: 'Light Green'}, + {hex: '#FDC010', name: 'Yellow'}, + {hex: '#F8971C', name: 'Orange'}, + {hex: '#F0592B', name: 'Deep Orange'}, + {hex: '#F06291', name: 'Light Pink'} +]; + +export default function initColorPicker(el, value, onChange) { + function setColor(value, fireOnChange = true) { + currentValue = value; + a.setAttribute('data-color', value); + a.style.background = value; + if (fireOnChange && typeof onChange === 'function') { + onChange(value); + } + closePicker(); + } + + function togglePicker() { + if (isPickerOpen) { + closePicker(); + } else { + openPicker(); + } + } + + function closePicker() { + document.removeEventListener('keyup', handleDocumentKeyup); + if (picker && picker.parentNode) { + picker.parentNode.removeChild(picker); + } + isPickerOpen = false; + a.focus(); + } + + function openPicker() { + if (!picker) { + picker = document.createElement('div'); + picker.style.background = '#fff'; + picker.style.border = '1px solid #ccc'; + picker.style.padding = '2px'; + picker.style.position = 'absolute'; + picker.style.width = '122px'; + el.style.position = 'relative'; + + COLORS.map(createColorOption).forEach((c) => { + c.style.margin = '2px'; + c.onclick = function () { setColor(c.getAttribute('data-color')); }; + picker.appendChild(c); + }); + } + + document.addEventListener('keyup', handleDocumentKeyup); + el.appendChild(picker); + isPickerOpen = true; + } + + function createColorOption(color) { + let e = document.createElement('a'); + e.className = 'color'; + e.setAttribute('href', 'javascript://'); + e.setAttribute('title', color.name); + e.setAttribute('data-color', color.hex); + e.style.background = color.hex; + return e; + } + + function handleDocumentKeyup(e) { + if (e.keyCode === 27) { + closePicker(); + } + } + + let picker; + let isPickerOpen = false; + let currentValue; + let a = createColorOption({hex: value}); + a.onclick = togglePicker; + el.appendChild(a); + setColor(value, false); +} diff --git a/src/initFile.js b/src/initFile.js new file mode 100644 index 0000000..977b450 --- /dev/null +++ b/src/initFile.js @@ -0,0 +1,3 @@ +export const documentUrl = document.getElementById('pdf-data').dataset.filepath; +export const documentId = document.getElementById('pdf-data').dataset.uuid; +export const readonly = document.getElementById('pdf-data').dataset.readonly === 'True'; \ No newline at end of file diff --git a/src/render/appendChild.js b/src/render/appendChild.js new file mode 100644 index 0000000..dfc7804 --- /dev/null +++ b/src/render/appendChild.js @@ -0,0 +1,147 @@ +import objectAssign from 'object-assign'; +import renderLine from './renderLine'; +import renderPath from './renderPath'; +import renderPoint from './renderPoint'; +import renderRect from './renderRect'; +import renderText from './renderText'; + +const isFirefox = /firefox/i.test(navigator.userAgent); + +/** + * Get the x/y translation to be used for transforming the annotations + * based on the rotation of the viewport. + * + * @param {Object} viewport The viewport data from the page + * @return {Object} + */ +function getTranslation(viewport) { + let x; + let y; + + // Modulus 360 on the rotation so that we only + // have to worry about four possible values. + switch(viewport.rotation % 360) { + case 0: + x = y = 0; + break; + case 90: + x = 0; + y = (viewport.width / viewport.scale) * -1; + break; + case 180: + x = (viewport.width / viewport.scale) * -1; + y = (viewport.height / viewport.scale) * -1; + break; + case 270: + x = (viewport.height / viewport.scale) * -1; + y = 0; + break; + } + + return { x, y }; +} + +/** + * Transform the rotation and scale of a node using SVG's native transform attribute. + * + * @param {Node} node The node to be transformed + * @param {Object} viewport The page's viewport data + * @return {Node} + */ +function transform(node, viewport) { + let trans = getTranslation(viewport); + + // Let SVG natively transform the element + node.setAttribute('transform', `scale(${viewport.scale}) rotate(${viewport.rotation}) translate(${trans.x}, ${trans.y})`); + + // Manually adjust x/y for nested SVG nodes + if (!isFirefox && node.nodeName.toLowerCase() === 'svg') { + node.setAttribute('x', parseInt(node.getAttribute('x'), 10) * viewport.scale); + node.setAttribute('y', parseInt(node.getAttribute('y'), 10) * viewport.scale); + + let x = parseInt(node.getAttribute('x', 10)); + let y = parseInt(node.getAttribute('y', 10)); + let width = parseInt(node.getAttribute('width'), 10); + let height = parseInt(node.getAttribute('height'), 10); + let path = node.querySelector('path'); + let svg = path.parentNode; + + // Scale width/height + [node, svg, path, node.querySelector('rect')].forEach((n) => { + n.setAttribute('width', parseInt(n.getAttribute('width'), 10) * viewport.scale); + n.setAttribute('height', parseInt(n.getAttribute('height'), 10) * viewport.scale); + }); + + // Transform path but keep scale at 100% since it will be handled natively + transform(path, objectAssign({}, viewport, { scale: 1 })); + + switch(viewport.rotation % 360) { + case 90: + node.setAttribute('x', viewport.width - y - width); + node.setAttribute('y', x); + svg.setAttribute('x', 1); + svg.setAttribute('y', 0); + break; + case 180: + node.setAttribute('x', viewport.width - x - width); + node.setAttribute('y', viewport.height - y - height); + svg.setAttribute('y', 2); + break; + case 270: + node.setAttribute('x', y); + node.setAttribute('y', viewport.height - x - height); + svg.setAttribute('x', -1); + svg.setAttribute('y', 0); + break; + } + } + + return node; +} + +/** + * Append an annotation as a child of an SVG. + * + * @param {SVGElement} svg The SVG element to append the annotation to + * @param {Object} annotation The annotation definition to render and append + * @param {Object} viewport The page's viewport data + * @return {SVGElement} A node that was created and appended by this function + */ +export default function appendChild(svg, annotation, viewport) { + if (!viewport) { + viewport = JSON.parse(svg.getAttribute('data-pdf-annotate-viewport')); + } + + let child; + switch (annotation.type) { + case 'area': + case 'highlight': + child = renderRect(annotation); + break; + case 'strikeout': + child = renderLine(annotation); + break; + case 'point': + child = renderPoint(annotation); + break; + case 'textbox': + child = renderText(annotation); + break; + case 'drawing': + child = renderPath(annotation); + break; + } + + // If no type was provided for an annotation it will result in node being null. + // Skip appending/transforming if node doesn't exist. + if (child) { + // Set attributes + child.setAttribute('data-pdf-annotate-id', annotation.uuid); + child.setAttribute('data-pdf-annotate-type', annotation.type); + child.setAttribute('aria-hidden', true); + + svg.appendChild(transform(child, viewport)); + } + + return child; +} diff --git a/src/render/index.js b/src/render/index.js new file mode 100644 index 0000000..9eb0025 --- /dev/null +++ b/src/render/index.js @@ -0,0 +1,45 @@ +import PDFJSAnnotate from '../PDFJSAnnotate'; +import appendChild from './appendChild'; +import renderScreenReaderHints from '../a11y/renderScreenReaderHints'; + +/** + * Render the response from PDFJSAnnotate.getStoreAdapter().getAnnotations to SVG + * + * @param {SVGElement} svg The SVG element to render the annotations to + * @param {Object} viewport The page viewport data + * @param {Object} data The response from PDFJSAnnotate.getStoreAdapter().getAnnotations + * @return {Promise} Settled once rendering has completed + * A settled Promise will be either: + * - fulfilled: SVGElement + * - rejected: Error + */ +export default function render(svg, viewport, data) { + return new Promise((resolve, reject) => { + // Reset the content of the SVG + svg.innerHTML = ''; + svg.setAttribute('data-pdf-annotate-container', true); + svg.setAttribute('data-pdf-annotate-viewport', JSON.stringify(viewport)); + svg.removeAttribute('data-pdf-annotate-document'); + svg.removeAttribute('data-pdf-annotate-page'); + + // If there's no data nothing can be done + if (!data) { + return resolve(svg); + } + + svg.setAttribute('data-pdf-annotate-document', data.documentId); + svg.setAttribute('data-pdf-annotate-page', data.pageNumber); + + // Make sure annotations is an array + if (!Array.isArray(data.annotations) || data.annotations.length === 0) { + return resolve(svg); + } + + // Append annotation to svg + data.annotations.forEach((a) => { + appendChild(svg, a, viewport); + }); + + resolve(svg); + }); +} diff --git a/src/render/renderLine.js b/src/render/renderLine.js new file mode 100644 index 0000000..336ddea --- /dev/null +++ b/src/render/renderLine.js @@ -0,0 +1,32 @@ +import setAttributes from '../utils/setAttributes'; +import normalizeColor from '../utils/normalizeColor'; + +/** + * Create SVGLineElements from an annotation definition. + * This is used for anntations of type `strikeout`. + * + * @param {Object} a The annotation definition + * @return {SVGGElement} A group of all lines to be rendered + */ +export default function renderLine(a) { + let group = document.createElementNS('http://www.w3.org/2000/svg', 'g'); + setAttributes(group, { + stroke: normalizeColor(a.color || '#f00'), + strokeWidth: 1 + }); + + a.rectangles.forEach((r) => { + let line = document.createElementNS('http://www.w3.org/2000/svg', 'line'); + + setAttributes(line, { + x1: r.x, + y1: r.y, + x2: r.x + r.width, + y2: r.y, + }); + + group.appendChild(line); + }); + + return group; +} diff --git a/src/render/renderPath.js b/src/render/renderPath.js new file mode 100644 index 0000000..a25297e --- /dev/null +++ b/src/render/renderPath.js @@ -0,0 +1,31 @@ +import setAttributes from '../utils/setAttributes'; +import normalizeColor from '../utils/normalizeColor'; + +/** + * Create SVGPathElement from an annotation definition. + * This is used for anntations of type `drawing`. + * + * @param {Object} a The annotation definition + * @return {SVGPathElement} The path to be rendered + */ +export default function renderPath(a) { + let d = []; + let path = document.createElementNS('http://www.w3.org/2000/svg', 'path'); + + for (let i=0, l=a.lines.length; i { + group.appendChild(createRect(r)); + }); + + return group; + } else { + let rect = createRect(a); + setAttributes(rect, { + stroke: normalizeColor(a.color || '#f00'), + fill: 'none' + }); + + return rect; + } +} + +function createRect(r) { + let rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect'); + + setAttributes(rect, { + x: r.x, + y: r.y, + width: r.width, + height: r.height + }); + + return rect; +} diff --git a/src/render/renderText.js b/src/render/renderText.js new file mode 100644 index 0000000..5eac76c --- /dev/null +++ b/src/render/renderText.js @@ -0,0 +1,23 @@ +import setAttributes from '../utils/setAttributes'; +import normalizeColor from '../utils/normalizeColor'; + +/** + * Create SVGTextElement from an annotation definition. + * This is used for anntations of type `textbox`. + * + * @param {Object} a The annotation definition + * @return {SVGTextElement} A text to be rendered + */ +export default function renderText(a) { + var text = document.createElementNS('http://www.w3.org/2000/svg', 'text'); + + setAttributes(text, { + x: a.x, + y: a.y + parseInt(a.size, 10), + fill: normalizeColor(a.color || '#000'), + fontSize: a.size + }); + text.innerHTML = a.content; + + return text; +} diff --git a/src/utils/abstractFunction.js b/src/utils/abstractFunction.js new file mode 100644 index 0000000..25edcbf --- /dev/null +++ b/src/utils/abstractFunction.js @@ -0,0 +1,8 @@ +/** + * Throw an Error for an abstract function that hasn't been implemented. + * + * @param {String} name The name of the abstract function + */ +export default function abstractFunction(name) { + throw new Error(name + ' is not implemented'); +} diff --git a/src/utils/normalizeColor.js b/src/utils/normalizeColor.js new file mode 100644 index 0000000..bb416f5 --- /dev/null +++ b/src/utils/normalizeColor.js @@ -0,0 +1,14 @@ +const REGEX_HASHLESS_HEX = /^([a-f0-9]{6}|[a-f0-9]{3})$/i; + +/** + * Normalize a color value + * + * @param {String} color The color to normalize + * @return {String} + */ +export default function normalizeColor(color) { + if (REGEX_HASHLESS_HEX.test(color)) { + color = `#${color}`; + } + return color; +} diff --git a/src/utils/setAttributes.js b/src/utils/setAttributes.js new file mode 100644 index 0000000..65554d3 --- /dev/null +++ b/src/utils/setAttributes.js @@ -0,0 +1,25 @@ +const UPPER_REGEX = /[A-Z]/g; + +// Don't convert these attributes from camelCase to hyphenated-attributes +const BLACKLIST = [ + 'viewBox' +]; + +let keyCase = (key) => { + if (BLACKLIST.indexOf(key) === -1) { + key = key.replace(UPPER_REGEX, match => '-' + match.toLowerCase()); + } + return key; +} + +/** + * Set attributes for a node from a map + * + * @param {Node} node The node to set attributes on + * @param {Object} attributes The map of key/value pairs to use for attributes + */ +export default function setAttributes(node, attributes) { + Object.keys(attributes).forEach((key) => { + node.setAttribute(keyCase(key), attributes[key]); + }); +} diff --git a/src/utils/uuid.js b/src/utils/uuid.js new file mode 100644 index 0000000..b25f785 --- /dev/null +++ b/src/utils/uuid.js @@ -0,0 +1,17 @@ +const REGEXP = /[xy]/g +const PATTERN = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'; + +function replacement(c) { + let r = Math.random()*16|0; + let v = c == 'x' ? r : (r&0x3|0x8); + return v.toString(16); +} + +/** + * Generate a univierally unique identifier + * + * @return {String} + */ +export default function uuid() { + return PATTERN.replace(REGEXP, replacement); +} diff --git a/static/pdfannotator/pdf-annotate.min.js b/static/pdfannotator/pdf-annotate.min.js new file mode 100644 index 0000000..409f202 --- /dev/null +++ b/static/pdfannotator/pdf-annotate.min.js @@ -0,0 +1,14 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.PDFAnnotate=t():e.PDFAnnotate=t()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var a=n[r]={exports:{},id:r,loaded:!1};return e[r].call(a.exports,a,a.exports,t),a.loaded=!0,a.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function a(){pdfjsLib.getDocument(g.documentId).then(function(e){g.pdfDocument=e;var t=document.getElementById("viewer");t.innerHTML="",m=e._pdfInfo.numPages;for(var n=0;n.endOfContent").remove()})})},r=1;r<=m;r++)n(r)})})}Object.defineProperty(t,"__esModule",{value:!0});var u=function(){function e(e,t){var n=[],r=!0,a=!1,u=void 0;try{for(var i,o=e[Symbol.iterator]();!(r=(i=o.next()).done)&&(n.push(i.value),!t||n.length!==t);r=!0);}catch(d){a=!0,u=d}finally{try{!r&&o["return"]&&o["return"]()}finally{if(a)throw u}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=n(1),o=r(i),d=n(37),s=n(39),c=(r(s),n(65)),l=r(c),f=n(38);t["default"]=o["default"];var p=o["default"].UI,h=void 0,g={documentId:d.documentUrl,pdfDocument:null,enhanceTextSelection:!0,scale:parseFloat(localStorage.getItem(d.documentId+"/scale"),10)||1.33,rotate:parseInt(localStorage.getItem(d.documentId+"/rotate"),10)||0};o["default"].setStoreAdapter(new o["default"].CRFPAStoreAdapter);var m=0;a(),d.readonly||(!function(){function e(){var e=document.querySelector(".toolbar .text-size");[8,9,10,11,12,14,18,24,30,36,48,60,72,96].forEach(function(t){e.appendChild(new Option(t,t))}),t(localStorage.getItem(g.documentId+"/text/size")||10,localStorage.getItem(g.documentId+"/text/color")||"#000000"),(0,l["default"])(document.querySelector(".text-color"),a,function(e){t(r,e)})}function t(e,t){var n=!1;if(r!==e&&(n=!0,r=e,localStorage.setItem(g.documentId+"/text/size",r),document.querySelector(".toolbar .text-size").value=r),a!==t){n=!0,a=t,localStorage.setItem(g.documentId+"/text/color",a);var u=document.querySelector(".toolbar .text-color.color-selected");u&&(u.classList.remove("color-selected"),u.removeAttribute("aria-selected")),u=document.querySelector('.toolbar .text-color[data-color="'+t+'"]'),u&&(u.classList.add("color-selected"),u.setAttribute("aria-selected",!0))}n&&p.setText(r,a)}function n(e){t(e.target.value,a)}var r=void 0,a=void 0;document.querySelector(".toolbar .text-size").addEventListener("change",n),e()}(),function(){function e(){for(var e=document.querySelector(".toolbar .pen-size"),n=0;n<20;n++)e.appendChild(new Option(n+1,n+1));t(localStorage.getItem(g.documentId+"/pen/size")||1,localStorage.getItem(g.documentId+"/pen/color")||"#000000"),(0,l["default"])(document.querySelector(".pen-color"),a,function(e){t(r,e)})}function t(e,t){var n=!1;if(r!==e&&(n=!0,r=e,localStorage.setItem(g.documentId+"/pen/size",r),document.querySelector(".toolbar .pen-size").value=r),a!==t){n=!0,a=t,localStorage.setItem(g.documentId+"/pen/color",a);var u=document.querySelector(".toolbar .pen-color.color-selected");u&&(u.classList.remove("color-selected"),u.removeAttribute("aria-selected")),u=document.querySelector('.toolbar .pen-color[data-color="'+t+'"]'),u&&(u.classList.add("color-selected"),u.setAttribute("aria-selected",!0))}n&&p.setPen(r,a)}function n(e){t(e.target.value,a)}var r=void 0,a=void 0;document.querySelector(".toolbar .pen-size").addEventListener("change",n),e()}(),function(){function e(e,t){var r=document.querySelector(".toolbar button.active");if(r)switch(r.classList.remove("active"),n){case"cursor":p.disableEdit();break;case"draw":p.disablePen();break;case"text":p.disableText();break;case"point":p.disablePoint();break;case"area":case"highlight":case"strikeout":p.disableRect()}switch(t&&t.classList.add("active"),n!==e&&localStorage.setItem(g.documentId+"/tooltype",e),n=e,e){case"cursor":p.enableEdit();break;case"draw":p.enablePen();break;case"text":p.enableText();break;case"point":p.enablePoint();break;case"area":case"highlight":case"strikeout":p.enableRect(e)}}function t(t){"BUTTON"===t.target.nodeName&&e(t.target.getAttribute("data-tooltype"),t.target)}var n=localStorage.getItem(g.documentId+"/tooltype")||"cursor";n&&e(n,document.querySelector(".toolbar button[data-tooltype="+n+"]")),document.querySelector(".toolbar").addEventListener("click",t)}()),d.readonly&&p.enableEdit(),function(){function e(e,t){e=parseFloat(e,10),t=parseInt(t,10),g.scale===e&&g.rotate===t||(g.scale=e,g.rotate=t,localStorage.setItem(g.documentId+"/scale",g.scale),localStorage.setItem(g.documentId+"/rotate",g.rotate%360),a())}function t(t){e(t.target.value,g.rotate)}function n(){e(g.scale,g.rotate+90)}function r(){e(g.scale,g.rotate-90)}document.querySelector(".toolbar select.scale").value=g.scale,document.querySelector(".toolbar select.scale").addEventListener("change",t),document.querySelector(".toolbar .rotate-ccw").addEventListener("click",r),document.querySelector(".toolbar .rotate-cw").addEventListener("click",n)}(),(0,f.renderComments)(d.documentId),e.exports=t["default"]},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var a=n(2),u=r(a),i=n(8),o=r(i),d=n(50),s=r(d),c=n(59),l=r(c);t["default"]={StoreAdapter:u["default"],CRFPAStoreAdapter:o["default"],__storeAdapter:new u["default"],getStoreAdapter:function(){return this.__storeAdapter},setStoreAdapter:function(e){this.__storeAdapter=e},UI:l["default"],render:s["default"],getAnnotations:function(e){var t;return(t=this.getStoreAdapter()).getAnnotations.apply(t,arguments)}},e.exports=t["default"]},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var u=function(){function e(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};a(this,e),Object.keys(n).forEach(function(e){"function"==typeof n[e]&&"function"==typeof t[e]&&(t[e]=n[e])})}return u(e,[{key:"__getAnnotations",value:function(e){(0,o["default"])("getAnnotations")}},{key:"getAnnotation",value:function(e,t){(0,o["default"])("getAnnotation")}},{key:"__addAnnotation",value:function(e,t,n){(0,o["default"])("addAnnotation")}},{key:"__editAnnotation",value:function(e,t,n){(0,o["default"])("editAnnotation")}},{key:"__deleteAnnotation",value:function(e,t){(0,o["default"])("deleteAnnotation")}},{key:"getComments",value:function(e,t){(0,o["default"])("getComments")}},{key:"__addComment",value:function(e,t,n){(0,o["default"])("addComment")}},{key:"__deleteComment",value:function(e,t){(0,o["default"])("deleteComment")}},{key:"getAnnotations",get:function(){return this.__getAnnotations},set:function(e){this.__getAnnotations=function(t){return e.apply(void 0,arguments).then(function(e){return e})}}},{key:"addAnnotation",get:function(){return this.__addAnnotation},set:function(e){this.__addAnnotation=function(t,n,r){return e.apply(void 0,arguments).then(function(e){return(0,d.fireEvent)("annotation:add",t,n,e),e})}}},{key:"editAnnotation",get:function(){return this.__editAnnotation},set:function(e){this.__editAnnotation=function(t,n,r){return e.apply(void 0,arguments).then(function(e){return(0,d.fireEvent)("annotation:edit",t,n,e),e})}}},{key:"deleteAnnotation",get:function(){return this.__deleteAnnotation},set:function(e){this.__deleteAnnotation=function(t,n){return e.apply(void 0,arguments).then(function(e){return e&&(0,d.fireEvent)("annotation:delete",t,n),e})}}},{key:"addComment",get:function(){return this.__addComment},set:function(e){this.__addComment=function(t,n,r){return e.apply(void 0,arguments).then(function(e){return(0,d.fireEvent)("comment:add",t,n,e),e})}}},{key:"deleteComment",get:function(){return this.__deleteComment},set:function(e){this.__deleteComment=function(t,n){return e.apply(void 0,arguments).then(function(e){return e&&(0,d.fireEvent)("comment:delete",t,n),e})}}}]),e}();t["default"]=s,e.exports=t["default"]},function(e,t){"use strict";function n(e){throw new Error(e+" is not implemented")}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=n,e.exports=t["default"]},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function a(){c.emit.apply(c,arguments)}function u(){c.on.apply(c,arguments)}function i(){c.removeListener.apply(c,arguments)}Object.defineProperty(t,"__esModule",{value:!0}),t.fireEvent=a,t.addEventListener=u,t.removeEventListener=i;var o=n(5),d=r(o),s=n(6),c=new d["default"],l=void 0;document.addEventListener("click",function(e){if((0,s.findSVGAtPoint)(e.clientX,e.clientY)){var t=(0,s.findAnnotationAtPoint)(e.clientX,e.clientY);l&&l!==t&&c.emit("annotation:blur",l),t&&c.emit("annotation:click",t),l=t}})},function(e,t){function n(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function r(e){return"function"==typeof e}function a(e){return"number"==typeof e}function u(e){return"object"==typeof e&&null!==e}function i(e){return void 0===e}e.exports=n,n.EventEmitter=n,n.prototype._events=void 0,n.prototype._maxListeners=void 0,n.defaultMaxListeners=10,n.prototype.setMaxListeners=function(e){if(!a(e)||e<0||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},n.prototype.emit=function(e){var t,n,a,o,d,s;if(this._events||(this._events={}),"error"===e&&(!this._events.error||u(this._events.error)&&!this._events.error.length)){if(t=arguments[1],t instanceof Error)throw t;var c=new Error('Uncaught, unspecified "error" event. ('+t+")");throw c.context=t,c}if(n=this._events[e],i(n))return!1;if(r(n))switch(arguments.length){case 1:n.call(this);break;case 2:n.call(this,arguments[1]);break;case 3:n.call(this,arguments[1],arguments[2]);break;default:o=Array.prototype.slice.call(arguments,1),n.apply(this,o)}else if(u(n))for(o=Array.prototype.slice.call(arguments,1),s=n.slice(),a=s.length,d=0;d0&&this._events[e].length>a&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace())),this},n.prototype.on=n.prototype.addListener,n.prototype.once=function(e,t){function n(){this.removeListener(e,n),a||(a=!0,t.apply(this,arguments))}if(!r(t))throw TypeError("listener must be a function");var a=!1;return n.listener=t,this.on(e,n),this},n.prototype.removeListener=function(e,t){var n,a,i,o;if(!r(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(n=this._events[e],i=n.length,a=-1,n===t||r(n.listener)&&n.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(u(n)){for(o=i;o-- >0;)if(n[o]===t||n[o].listener&&n[o].listener===t){a=o;break}if(a<0)return this;1===n.length?(n.length=0,delete this._events[e]):n.splice(a,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},n.prototype.removeAllListeners=function(e){var t,n;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(n=this._events[e],r(n))this.removeListener(e,n);else if(n)for(;n.length;)this.removeListener(e,n[n.length-1]);return delete this._events[e],this},n.prototype.listeners=function(e){var t;return t=this._events&&this._events[e]?r(this._events[e])?[this._events[e]]:this._events[e].slice():[]},n.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(r(t))return 1;if(t)return t.length}return 0},n.listenerCount=function(e,t){return e.listenerCount(t)}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function a(e){for(var t=e;(t=t.parentNode)&&t!==document;)if("SVG"===t.nodeName.toUpperCase()&&"true"===t.getAttribute("data-pdf-annotate-container"))return t;return null}function u(e,t){for(var n=document.querySelectorAll('svg[data-pdf-annotate-container="true"]'),r=0,a=n.length;r=n.top&&t<=n.bottom&&e>=n.left&&e<=n.right}function d(e){var t=s(e),n=p(e),r=n.offsetLeft,a=n.offsetTop;return{top:t.top+a,left:t.left+r,right:t.right+r,bottom:t.bottom+a}}function s(e){var t=0,n=0,r=0,a=0,i=e.getBoundingClientRect(),o=16;switch(e.nodeName.toLowerCase()){case"path":var d=void 0,s=void 0,l=void 0,f=void 0;e.getAttribute("d").replace(/Z/,"").split("M").splice(1).forEach(function(e){var t=e.split(" ").map(function(e){return parseInt(e,10)});("undefined"==typeof d||t[0]s)&&(s=t[2]),("undefined"==typeof l||t[1]f)&&(f=t[3])}),t=f-l,n=s-d,r=d,a=l;break;case"line":t=parseInt(e.getAttribute("y2"),10)-parseInt(e.getAttribute("y1"),10),n=parseInt(e.getAttribute("x2"),10)-parseInt(e.getAttribute("x1"),10),r=parseInt(e.getAttribute("x1"),10),a=parseInt(e.getAttribute("y1"),10),0===t&&(t+=o,a-=o/2);break;case"text":t=i.height,n=i.width,r=parseInt(e.getAttribute("x"),10),a=parseInt(e.getAttribute("y"),10)-t;break;case"g":var h=p(e),g=h.offsetLeft,m=h.offsetTop;t=i.height,n=i.width,r=i.left-g,a=i.top-m,"strikeout"===e.getAttribute("data-pdf-annotate-type")&&(t+=o,a-=o/2);break;case"rect":case"svg":t=parseInt(e.getAttribute("height"),10),n=parseInt(e.getAttribute("width"),10),r=parseInt(e.getAttribute("x"),10),a=parseInt(e.getAttribute("y"),10)}var v={top:a,left:r,width:n,height:t,right:r+n,bottom:a+t};return["svg","g"].includes(e.nodeName.toLowerCase())||(v=c(u(i.left,i.top),v)),"svg"==e.nodeName.toLowerCase()&&$.browser.mozilla&&(v=c(u(i.left,i.top),v)),v}function c(e,t){var n={},r=m(e),a=r.viewport;return Object.keys(t).forEach(function(e){n[e]=t[e]*a.scale}),n}function l(e,t){var n={},r=m(e),a=r.viewport;return Object.keys(t).forEach(function(e){n[e]=t[e]/a.scale}),n}function f(e){for(var t=0,n=0,r=e;(r=r.parentNode)&&r!==document;)t+=r.scrollTop,n+=r.scrollLeft;return{scrollTop:t,scrollLeft:n}}function p(e){for(var t=e;(t=t.parentNode)&&t!==document&&"SVG"!==t.nodeName.toUpperCase(););var n=t.getBoundingClientRect();return{offsetLeft:n.left,offsetTop:n.top}}function h(){x.parentNode||document.head.appendChild(x)}function g(){x.parentNode&&x.parentNode.removeChild(x)}function m(e){return{documentId:e.getAttribute("data-pdf-annotate-document"),pageNumber:parseInt(e.getAttribute("data-pdf-annotate-page"),10),viewport:JSON.parse(e.getAttribute("data-pdf-annotate-viewport"))}}Object.defineProperty(t,"__esModule",{value:!0}),t.BORDER_COLOR=void 0,t.findSVGContainer=a,t.findSVGAtPoint=u,t.findAnnotationAtPoint=i,t.pointIntersectsRect=o,t.getOffsetAnnotationRect=d,t.getAnnotationRect=s,t.scaleUp=c,t.scaleDown=l,t.getScroll=f,t.getOffset=p,t.disableUserSelect=h,t.enableUserSelect=g,t.getMetadata=m;var v=n(7),b=r(v),x=(t.BORDER_COLOR="#00BFFF",(0,b["default"])({body:{"-webkit-user-select":"none","-moz-user-select":"none","-ms-user-select":"none","user-select":"none"}}));x.setAttribute("data-pdf-annotate-user-select","true")},function(e,t){function n(e,t){return e+" {\n"+r(t)+"\n}"}function r(e){return Object.keys(e).map(function(t){return a(t,e[t])}).join("\n")}function a(e,t){return isNaN(t)||0==t||(t+="px"),u(e)+": "+t+";"}function u(e){return e.replace(/[A-Z]/g,function(e){return"-"+e.toLowerCase()})}e.exports=function(e){var t=document.createElement("style"),r=Object.keys(e).map(function(t){return n(t,e[t])}).join("\n");return t.setAttribute("type","text/css"),t.appendChild(document.createTextNode(r)),t}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function u(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var o=n(9),d=r(o),s=n(36),c=r(s),l=n(2),f=r(l),p=n(37),h=n(38);d["default"].defaults.xsrfCookieName="csrftoken",d["default"].defaults.xsrfHeaderName="X-CSRFToken";var g=function(e){function t(){a(this,t);var e=d["default"].create({baseURL:"/pdfannotator",timeout:1e4,withCredentials:!0,headers:{Accept:"application/json","Content-Type":"application/json","Access-Control-Allow-Origin":"*"}});return u(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,{getAnnotations:function(t){return e.get("/get-annotations/",{params:{fileUuid:p.documentId}}).then(function(e){return e.data})},getAnnotation:function(t,n){return e.get("/get-annotation/",{params:{fileUuid:p.documentId,annotationId:n}}).then(function(e){return e.data})},addAnnotation:function(t,n,r){return r["class"]="Annotation",r.page=n,r.uuid=(0,c["default"])(),e.post("/add-annotation/",{fileUuid:p.documentId,page:n,annotation:r}).then(function(e){return r})},editAnnotation:function(t,n,r){return e.post("/update-annotation/",{fileUuid:p.documentId,annotationId:n,annotation:r}).then(function(e){return"point"===r.type&&(0,h.renderComments)(),e}).then(function(e){return r})},deleteAnnotation:function(t,n){return e.post("/delete-annotation/",{annotationId:n,fileUuid:p.documentId}).then(function(e){return(0,h.renderComments)(),e}).then(function(e){return!0})},getComments:function(t){return e.get("/get-comments/",{params:{fileUuid:p.documentId}}).then(function(e){return e.data})},addComment:function(t,n,r){return e.post("/add-comment/",{fileUuid:p.documentId,annotationId:n,content:r}).then(function(e){return(0,h.renderComments)(),e}).then(function(e){return r})}}))}return i(t,e),t}(f["default"]);t["default"]=g,e.exports=t["default"]},function(e,t,n){e.exports=n(10)},function(e,t,n){"use strict";function r(e){var t=new i(e),n=u(i.prototype.request,t);return a.extend(n,i.prototype,t),a.extend(n,t),n}var a=n(11),u=n(12),i=n(14),o=n(15),d=r(o);d.Axios=i,d.create=function(e){return r(a.merge(o,e))},d.Cancel=n(33),d.CancelToken=n(34),d.isCancel=n(30),d.all=function(e){return Promise.all(e)},d.spread=n(35),e.exports=d,e.exports["default"]=d},function(e,t,n){"use strict";function r(e){return"[object Array]"===_.call(e)}function a(e){return"[object ArrayBuffer]"===_.call(e)}function u(e){return"undefined"!=typeof FormData&&e instanceof FormData}function i(e){var t;return t="undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&e.buffer instanceof ArrayBuffer}function o(e){return"string"==typeof e}function d(e){return"number"==typeof e}function s(e){return"undefined"==typeof e}function c(e){return null!==e&&"object"==typeof e}function l(e){return"[object Date]"===_.call(e)}function f(e){return"[object File]"===_.call(e)}function p(e){return"[object Blob]"===_.call(e)}function h(e){return"[object Function]"===_.call(e)}function g(e){return c(e)&&h(e.pipe)}function m(e){return"undefined"!=typeof URLSearchParams&&e instanceof URLSearchParams}function v(e){return e.replace(/^\s*/,"").replace(/\s*$/,"")}function b(){return("undefined"==typeof navigator||"ReactNative"!==navigator.product)&&("undefined"!=typeof window&&"undefined"!=typeof document)}function x(e,t){if(null!==e&&"undefined"!=typeof e)if("object"!=typeof e&&(e=[e]),r(e))for(var n=0,a=e.length;n + * @license MIT + */ +e.exports=function(e){return null!=e&&(n(e)||r(e)||!!e._isBuffer)}},function(e,t,n){"use strict";function r(e){this.defaults=e,this.interceptors={request:new i,response:new i}}var a=n(15),u=n(11),i=n(27),o=n(28);r.prototype.request=function(e){"string"==typeof e&&(e=u.merge({url:arguments[0]},arguments[1])),e=u.merge(a,{method:"get"},this.defaults,e),e.method=e.method.toLowerCase();var t=[o,void 0],n=Promise.resolve(e);for(this.interceptors.request.forEach(function(e){t.unshift(e.fulfilled,e.rejected)}),this.interceptors.response.forEach(function(e){t.push(e.fulfilled,e.rejected)});t.length;)n=n.then(t.shift(),t.shift());return n},u.forEach(["delete","get","head","options"],function(e){r.prototype[e]=function(t,n){return this.request(u.merge(n||{},{method:e,url:t}))}}),u.forEach(["post","put","patch"],function(e){r.prototype[e]=function(t,n,r){return this.request(u.merge(r||{},{method:e,url:t,data:n}))}}),e.exports=r},function(e,t,n){(function(t){"use strict";function r(e,t){!u.isUndefined(e)&&u.isUndefined(e["Content-Type"])&&(e["Content-Type"]=t)}function a(){var e;return"undefined"!=typeof XMLHttpRequest?e=n(18):"undefined"!=typeof t&&(e=n(18)),e}var u=n(11),i=n(17),o={"Content-Type":"application/x-www-form-urlencoded"},d={adapter:a(),transformRequest:[function(e,t){return i(t,"Content-Type"),u.isFormData(e)||u.isArrayBuffer(e)||u.isBuffer(e)||u.isStream(e)||u.isFile(e)||u.isBlob(e)?e:u.isArrayBufferView(e)?e.buffer:u.isURLSearchParams(e)?(r(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString()):u.isObject(e)?(r(t,"application/json;charset=utf-8"),JSON.stringify(e)):e}],transformResponse:[function(e){if("string"==typeof e)try{e=JSON.parse(e)}catch(t){}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,validateStatus:function(e){return e>=200&&e<300}};d.headers={common:{Accept:"application/json, text/plain, */*"}},u.forEach(["delete","get","head"],function(e){d.headers[e]={}}),u.forEach(["post","put","patch"],function(e){d.headers[e]=u.merge(o)}),e.exports=d}).call(t,n(16))},function(e,t){function n(){throw new Error("setTimeout has not been defined")}function r(){throw new Error("clearTimeout has not been defined")}function a(e){if(c===setTimeout)return setTimeout(e,0);if((c===n||!c)&&setTimeout)return c=setTimeout,setTimeout(e,0);try{return c(e,0)}catch(t){try{return c.call(null,e,0)}catch(t){return c.call(this,e,0)}}}function u(e){if(l===clearTimeout)return clearTimeout(e);if((l===r||!l)&&clearTimeout)return l=clearTimeout,clearTimeout(e);try{return l(e)}catch(t){try{return l.call(null,e)}catch(t){return l.call(this,e)}}}function i(){g&&p&&(g=!1,p.length?h=p.concat(h):m=-1,h.length&&o())}function o(){if(!g){var e=a(i);g=!0;for(var t=h.length;t;){for(p=h,h=[];++m1)for(var n=1;n=0)return;"set-cookie"===t?i[t]=(i[t]?i[t]:[]).concat([n]):i[t]=i[t]?i[t]+", "+n:n}}),i):i}},function(e,t,n){"use strict";var r=n(11);e.exports=r.isStandardBrowserEnv()?function(){function e(e){var t=e;return n&&(a.setAttribute("href",t),t=a.href),a.setAttribute("href",t),{href:a.href,protocol:a.protocol?a.protocol.replace(/:$/,""):"",host:a.host,search:a.search?a.search.replace(/^\?/,""):"",hash:a.hash?a.hash.replace(/^#/,""):"",hostname:a.hostname,port:a.port,pathname:"/"===a.pathname.charAt(0)?a.pathname:"/"+a.pathname}}var t,n=/(msie|trident)/i.test(navigator.userAgent),a=document.createElement("a");return t=e(window.location.href),function(n){var a=r.isString(n)?e(n):n;return a.protocol===t.protocol&&a.host===t.host}}():function(){return function(){return!0}}()},function(e,t){"use strict";function n(){this.message="String contains an invalid character"}function r(e){for(var t,r,u=String(e),i="",o=0,d=a;u.charAt(0|o)||(d="=",o%1);i+=d.charAt(63&t>>8-o%1*8)){if(r=u.charCodeAt(o+=.75),r>255)throw new n;t=t<<8|r}return i}var a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";n.prototype=new Error,n.prototype.code=5,n.prototype.name="InvalidCharacterError",e.exports=r},function(e,t,n){"use strict";var r=n(11);e.exports=r.isStandardBrowserEnv()?function(){return{write:function(e,t,n,a,u,i){var o=[];o.push(e+"="+encodeURIComponent(t)),r.isNumber(n)&&o.push("expires="+new Date(n).toGMTString()),r.isString(a)&&o.push("path="+a),r.isString(u)&&o.push("domain="+u),i===!0&&o.push("secure"),document.cookie=o.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}()},function(e,t,n){"use strict";function r(){this.handlers=[]}var a=n(11);r.prototype.use=function(e,t){return this.handlers.push({fulfilled:e,rejected:t}),this.handlers.length-1},r.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},r.prototype.forEach=function(e){a.forEach(this.handlers,function(t){null!==t&&e(t)})},e.exports=r},function(e,t,n){"use strict";function r(e){e.cancelToken&&e.cancelToken.throwIfRequested()}var a=n(11),u=n(29),i=n(30),o=n(15),d=n(31),s=n(32);e.exports=function(e){r(e),e.baseURL&&!d(e.url)&&(e.url=s(e.baseURL,e.url)),e.headers=e.headers||{},e.data=u(e.data,e.headers,e.transformRequest),e.headers=a.merge(e.headers.common||{},e.headers[e.method]||{},e.headers||{}),a.forEach(["delete","get","head","post","put","patch","common"],function(t){delete e.headers[t]});var t=e.adapter||o.adapter;return t(e).then(function(t){return r(e),t.data=u(t.data,t.headers,e.transformResponse),t},function(t){return i(t)||(r(e),t&&t.response&&(t.response.data=u(t.response.data,t.response.headers,e.transformResponse))),Promise.reject(t)})}},function(e,t,n){"use strict";var r=n(11);e.exports=function(e,t,n){return r.forEach(n,function(n){e=n(e,t)}),e}},function(e,t){"use strict";e.exports=function(e){return!(!e||!e.__CANCEL__)}},function(e,t){"use strict";e.exports=function(e){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e)}},function(e,t){"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},function(e,t){"use strict";function n(e){this.message=e}n.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},n.prototype.__CANCEL__=!0,e.exports=n},function(e,t,n){"use strict";function r(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise(function(e){t=e});var n=this;e(function(e){n.reason||(n.reason=new a(e),t(n.reason))})}var a=n(33);r.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},r.source=function(){var e,t=new r(function(t){e=t});return{token:t,cancel:e}},e.exports=r},function(e,t){"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}},function(e,t){"use strict";function n(e){var t=16*Math.random()|0,n="x"==e?t:3&t|8;return n.toString(16)}function r(){return u.replace(a,n)}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=r;var a=/[xy]/g,u="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx";e.exports=t["default"]},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.documentUrl=document.getElementById("pdf-data").dataset.filepath,t.documentId=document.getElementById("pdf-data").dataset.uuid,t.readonly="True"===document.getElementById("pdf-data").dataset.readonly},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function a(e){c["default"].getStoreAdapter().getComments(e).then(function(e){h.html(""),g.hide(),e.forEach(u)})}function u(e){var t=$("
");t.addClass("comment-list-item"),t.attr("uuid",e.annotation),t.html(f["default"].autoLink(f["default"].htmlEscape(e.content))),t.bind("click",i),h.append(t)}function i(e){var t=$(e.target);d(t.attr("uuid"))}function o(e){var t=e.offset().top;if(!e.is(":visible")){e.css({visibility:"hidden"}).show();var t=e.offset().top;e.css({visibility:"",display:""})}var n=$(window).scrollTop(),r=n+window.innerHeight;return!(tr)||(e.hasClass("comment-list-item")?$(".comment-list-container").animate({scrollTop:t-window.innerHeight/3},300):$("#content-wrapper").animate({scrollTop:t-window.innerHeight/3},300),!1)}function d(e){var t=$(".comment-list-item[uuid="+e+"]");$(".comment-list-item").removeClass("selected"),t.addClass("selected");var n=$("[data-pdf-annotate-id="+e+"]")[0];(0,p.createEditOverlay)(n),o($(n)),o(t)}Object.defineProperty(t,"__esModule",{value:!0}),t.renderComments=a,t.selectComment=d;var s=n(1),c=r(s),l=n(39),f=r(l),p=(n(4),n(40)),h=$("#comment-wrapper .comment-list-container"),g=$("#comment-wrapper .comment-list-form")},function(e,t,n){var r,a,u;!function(){function n(e,t){return t=t||"","string"!=typeof e&&(e.global&&t.indexOf("g")<0&&(t+="g"),e.ignoreCase&&t.indexOf("i")<0&&(t+="i"),e.multiline&&t.indexOf("m")<0&&(t+="m"),e=e.source),new RegExp(e.replace(/#\{(\w+)\}/g,function(e,t){var n=s.txt.regexen[t]||"";return"string"!=typeof n&&(n=n.source),n}),t)}function i(e,t){return e.replace(/#\{(\w+)\}/g,function(e,n){return t[n]||""})}function o(e){var t={};for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}function d(e,t,n){return n?!e||e.match(t)&&RegExp["$&"]===e:"string"==typeof e&&e.match(t)&&RegExp["$&"]===e}if("undefined"==typeof s||null===s)var s={};s.txt={},s.txt.regexen={};var c={"&":"&",">":">","<":"<",'"':""","'":"'"};s.txt.htmlEscape=function(e){return e&&e.replace(/[&"'><]/g,function(e){return c[e]})},s.txt.regexSupplant=n,s.txt.stringSupplant=i,s.txt.regexen.spaces_group=/\x09-\x0D\x20\x85\xA0\u1680\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000/,s.txt.regexen.spaces=n(/[#{spaces_group}]/),s.txt.regexen.invalid_chars_group=/\uFFFE\uFEFF\uFFFF\u202A-\u202E/,s.txt.regexen.invalid_chars=n(/[#{invalid_chars_group}]/),s.txt.regexen.punct=/\!'#%&'\(\)*\+,\\\-\.\/:;<=>\?@\[\]\^_{|}~\$/,s.txt.regexen.rtl_chars=/[\u0600-\u06FF]|[\u0750-\u077F]|[\u0590-\u05FF]|[\uFE70-\uFEFF]/gm,s.txt.regexen.non_bmp_code_pairs=/[\uD800-\uDBFF][\uDC00-\uDFFF]/gm,s.txt.regexen.latinAccentChars=/\xC0-\xD6\xD8-\xF6\xF8-\xFF\u0100-\u024F\u0253\u0254\u0256\u0257\u0259\u025B\u0263\u0268\u026F\u0272\u0289\u028B\u02BB\u0300-\u036F\u1E00-\u1EFF/,s.txt.regexen.bmpLetterAndMarks=/A-Za-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0300-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u0483-\u052f\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u05d0-\u05ea\u05f0-\u05f2\u0610-\u061a\u0620-\u065f\u066e-\u06d3\u06d5-\u06dc\u06df-\u06e8\u06ea-\u06ef\u06fa-\u06fc\u06ff\u0710-\u074a\u074d-\u07b1\u07ca-\u07f5\u07fa\u0800-\u082d\u0840-\u085b\u08a0-\u08b2\u08e4-\u0963\u0971-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7\u09c8\u09cb-\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09f0\u09f1\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a70-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b71\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0c00-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c58\u0c59\u0c60-\u0c63\u0c81-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0cf1\u0cf2\u0d01-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4e\u0d57\u0d60-\u0d63\u0d7a-\u0d7f\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e01-\u0e3a\u0e40-\u0e4e\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0edc-\u0edf\u0f00\u0f18\u0f19\u0f35\u0f37\u0f39\u0f3e-\u0f47\u0f49-\u0f6c\u0f71-\u0f84\u0f86-\u0f97\u0f99-\u0fbc\u0fc6\u1000-\u103f\u1050-\u108f\u109a-\u109d\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135d-\u135f\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16f1-\u16f8\u1700-\u170c\u170e-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772\u1773\u1780-\u17d3\u17d7\u17dc\u17dd\u180b-\u180d\u1820-\u1877\u1880-\u18aa\u18b0-\u18f5\u1900-\u191e\u1920-\u192b\u1930-\u193b\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a1b\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f\u1aa7\u1ab0-\u1abe\u1b00-\u1b4b\u1b6b-\u1b73\u1b80-\u1baf\u1bba-\u1bf3\u1c00-\u1c37\u1c4d-\u1c4f\u1c5a-\u1c7d\u1cd0-\u1cd2\u1cd4-\u1cf6\u1cf8\u1cf9\u1d00-\u1df5\u1dfc-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u20d0-\u20f0\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2183\u2184\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d7f-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2de0-\u2dff\u2e2f\u3005\u3006\u302a-\u302f\u3031-\u3035\u303b\u303c\u3041-\u3096\u3099\u309a\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua672\ua674-\ua67d\ua67f-\ua69d\ua69f-\ua6e5\ua6f0\ua6f1\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua7ad\ua7b0\ua7b1\ua7f7-\ua827\ua840-\ua873\ua880-\ua8c4\ua8e0-\ua8f7\ua8fb\ua90a-\ua92d\ua930-\ua953\ua960-\ua97c\ua980-\ua9c0\ua9cf\ua9e0-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa36\uaa40-\uaa4d\uaa60-\uaa76\uaa7a-\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf6\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab5f\uab64\uab65\uabc0-\uabea\uabec\uabed\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf870-\uf87f\uf882\uf884-\uf89f\uf8b8\uf8c1-\uf8d6\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe00-\ufe0f\ufe20-\ufe2d\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc/,s.txt.regexen.astralLetterAndMarks=/\ud800[\udc00-\udc0b\udc0d-\udc26\udc28-\udc3a\udc3c\udc3d\udc3f-\udc4d\udc50-\udc5d\udc80-\udcfa\uddfd\ude80-\ude9c\udea0-\uded0\udee0\udf00-\udf1f\udf30-\udf40\udf42-\udf49\udf50-\udf7a\udf80-\udf9d\udfa0-\udfc3\udfc8-\udfcf]|\ud801[\udc00-\udc9d\udd00-\udd27\udd30-\udd63\ude00-\udf36\udf40-\udf55\udf60-\udf67]|\ud802[\udc00-\udc05\udc08\udc0a-\udc35\udc37\udc38\udc3c\udc3f-\udc55\udc60-\udc76\udc80-\udc9e\udd00-\udd15\udd20-\udd39\udd80-\uddb7\uddbe\uddbf\ude00-\ude03\ude05\ude06\ude0c-\ude13\ude15-\ude17\ude19-\ude33\ude38-\ude3a\ude3f\ude60-\ude7c\ude80-\ude9c\udec0-\udec7\udec9-\udee6\udf00-\udf35\udf40-\udf55\udf60-\udf72\udf80-\udf91]|\ud803[\udc00-\udc48]|\ud804[\udc00-\udc46\udc7f-\udcba\udcd0-\udce8\udd00-\udd34\udd50-\udd73\udd76\udd80-\uddc4\uddda\ude00-\ude11\ude13-\ude37\udeb0-\udeea\udf01-\udf03\udf05-\udf0c\udf0f\udf10\udf13-\udf28\udf2a-\udf30\udf32\udf33\udf35-\udf39\udf3c-\udf44\udf47\udf48\udf4b-\udf4d\udf57\udf5d-\udf63\udf66-\udf6c\udf70-\udf74]|\ud805[\udc80-\udcc5\udcc7\udd80-\uddb5\uddb8-\uddc0\ude00-\ude40\ude44\ude80-\udeb7]|\ud806[\udca0-\udcdf\udcff\udec0-\udef8]|\ud808[\udc00-\udf98]|\ud80c[\udc00-\udfff]|\ud80d[\udc00-\udc2e]|\ud81a[\udc00-\ude38\ude40-\ude5e\uded0-\udeed\udef0-\udef4\udf00-\udf36\udf40-\udf43\udf63-\udf77\udf7d-\udf8f]|\ud81b[\udf00-\udf44\udf50-\udf7e\udf8f-\udf9f]|\ud82c[\udc00\udc01]|\ud82f[\udc00-\udc6a\udc70-\udc7c\udc80-\udc88\udc90-\udc99\udc9d\udc9e]|\ud834[\udd65-\udd69\udd6d-\udd72\udd7b-\udd82\udd85-\udd8b\uddaa-\uddad\ude42-\ude44]|\ud835[\udc00-\udc54\udc56-\udc9c\udc9e\udc9f\udca2\udca5\udca6\udca9-\udcac\udcae-\udcb9\udcbb\udcbd-\udcc3\udcc5-\udd05\udd07-\udd0a\udd0d-\udd14\udd16-\udd1c\udd1e-\udd39\udd3b-\udd3e\udd40-\udd44\udd46\udd4a-\udd50\udd52-\udea5\udea8-\udec0\udec2-\udeda\udedc-\udefa\udefc-\udf14\udf16-\udf34\udf36-\udf4e\udf50-\udf6e\udf70-\udf88\udf8a-\udfa8\udfaa-\udfc2\udfc4-\udfcb]|\ud83a[\udc00-\udcc4\udcd0-\udcd6]|\ud83b[\ude00-\ude03\ude05-\ude1f\ude21\ude22\ude24\ude27\ude29-\ude32\ude34-\ude37\ude39\ude3b\ude42\ude47\ude49\ude4b\ude4d-\ude4f\ude51\ude52\ude54\ude57\ude59\ude5b\ude5d\ude5f\ude61\ude62\ude64\ude67-\ude6a\ude6c-\ude72\ude74-\ude77\ude79-\ude7c\ude7e\ude80-\ude89\ude8b-\ude9b\udea1-\udea3\udea5-\udea9\udeab-\udebb]|\ud840[\udc00-\udfff]|\ud841[\udc00-\udfff]|\ud842[\udc00-\udfff]|\ud843[\udc00-\udfff]|\ud844[\udc00-\udfff]|\ud845[\udc00-\udfff]|\ud846[\udc00-\udfff]|\ud847[\udc00-\udfff]|\ud848[\udc00-\udfff]|\ud849[\udc00-\udfff]|\ud84a[\udc00-\udfff]|\ud84b[\udc00-\udfff]|\ud84c[\udc00-\udfff]|\ud84d[\udc00-\udfff]|\ud84e[\udc00-\udfff]|\ud84f[\udc00-\udfff]|\ud850[\udc00-\udfff]|\ud851[\udc00-\udfff]|\ud852[\udc00-\udfff]|\ud853[\udc00-\udfff]|\ud854[\udc00-\udfff]|\ud855[\udc00-\udfff]|\ud856[\udc00-\udfff]|\ud857[\udc00-\udfff]|\ud858[\udc00-\udfff]|\ud859[\udc00-\udfff]|\ud85a[\udc00-\udfff]|\ud85b[\udc00-\udfff]|\ud85c[\udc00-\udfff]|\ud85d[\udc00-\udfff]|\ud85e[\udc00-\udfff]|\ud85f[\udc00-\udfff]|\ud860[\udc00-\udfff]|\ud861[\udc00-\udfff]|\ud862[\udc00-\udfff]|\ud863[\udc00-\udfff]|\ud864[\udc00-\udfff]|\ud865[\udc00-\udfff]|\ud866[\udc00-\udfff]|\ud867[\udc00-\udfff]|\ud868[\udc00-\udfff]|\ud869[\udc00-\uded6\udf00-\udfff]|\ud86a[\udc00-\udfff]|\ud86b[\udc00-\udfff]|\ud86c[\udc00-\udfff]|\ud86d[\udc00-\udf34\udf40-\udfff]|\ud86e[\udc00-\udc1d]|\ud87e[\udc00-\ude1d]|\udb40[\udd00-\uddef]/,s.txt.regexen.bmpNumerals=/0-9\u0660-\u0669\u06f0-\u06f9\u07c0-\u07c9\u0966-\u096f\u09e6-\u09ef\u0a66-\u0a6f\u0ae6-\u0aef\u0b66-\u0b6f\u0be6-\u0bef\u0c66-\u0c6f\u0ce6-\u0cef\u0d66-\u0d6f\u0de6-\u0def\u0e50-\u0e59\u0ed0-\u0ed9\u0f20-\u0f29\u1040-\u1049\u1090-\u1099\u17e0-\u17e9\u1810-\u1819\u1946-\u194f\u19d0-\u19d9\u1a80-\u1a89\u1a90-\u1a99\u1b50-\u1b59\u1bb0-\u1bb9\u1c40-\u1c49\u1c50-\u1c59\ua620-\ua629\ua8d0-\ua8d9\ua900-\ua909\ua9d0-\ua9d9\ua9f0-\ua9f9\uaa50-\uaa59\uabf0-\uabf9\uff10-\uff19/,s.txt.regexen.astralNumerals=/\ud801[\udca0-\udca9]|\ud804[\udc66-\udc6f\udcf0-\udcf9\udd36-\udd3f\uddd0-\uddd9\udef0-\udef9]|\ud805[\udcd0-\udcd9\ude50-\ude59\udec0-\udec9]|\ud806[\udce0-\udce9]|\ud81a[\ude60-\ude69\udf50-\udf59]|\ud835[\udfce-\udfff]/,s.txt.regexen.hashtagSpecialChars=/_\u200c\u200d\ua67e\u05be\u05f3\u05f4\uff5e\u301c\u309b\u309c\u30a0\u30fb\u3003\u0f0b\u0f0c\xb7/,s.txt.regexen.hashSigns=/[##]/,s.txt.regexen.hashtagAlpha=n(/(?:[#{bmpLetterAndMarks}]|(?=#{non_bmp_code_pairs})(?:#{astralLetterAndMarks}))/),s.txt.regexen.hashtagAlphaNumeric=n(/(?:[#{bmpLetterAndMarks}#{bmpNumerals}#{hashtagSpecialChars}]|(?=#{non_bmp_code_pairs})(?:#{astralLetterAndMarks}|#{astralNumerals}))/),s.txt.regexen.endHashtagMatch=n(/^(?:#{hashSigns}|:\/\/)/),s.txt.regexen.codePoint=/(?:[^\uD800-\uDFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF])/,s.txt.regexen.hashtagBoundary=n(/(?:^|\uFE0E|\uFE0F|$|(?!#{hashtagAlphaNumeric}|&)#{codePoint})/),s.txt.regexen.validHashtag=n(/(#{hashtagBoundary})(#{hashSigns})(?!\uFE0F|\u20E3)(#{hashtagAlphaNumeric}*#{hashtagAlpha}#{hashtagAlphaNumeric}*)/gi),s.txt.regexen.validMentionPrecedingChars=/(?:^|[^a-zA-Z0-9_!#$%&*@ï¼ ]|(?:^|[^a-zA-Z0-9_+~.-])(?:rt|RT|rT|Rt):?)/,s.txt.regexen.atSigns=/[@ï¼ ]/,s.txt.regexen.validMentionOrList=n("(#{validMentionPrecedingChars})(#{atSigns})([a-zA-Z0-9_]{1,20})(/[a-zA-Z][a-zA-Z0-9_-]{0,24})?","g"),s.txt.regexen.validReply=n(/^(?:#{spaces})*#{atSigns}([a-zA-Z0-9_]{1,20})/),s.txt.regexen.endMentionMatch=n(/^(?:#{atSigns}|[#{latinAccentChars}]|:\/\/)/),s.txt.regexen.validUrlPrecedingChars=n(/(?:[^A-Za-z0-9@ï¼ $###{invalid_chars_group}]|^)/),s.txt.regexen.invalidUrlWithoutProtocolPrecedingChars=/[-_.\/]$/,s.txt.regexen.invalidDomainChars=i("#{punct}#{spaces_group}#{invalid_chars_group}",s.txt.regexen),s.txt.regexen.validDomainChars=n(/[^#{invalidDomainChars}]/),s.txt.regexen.validSubdomain=n(/(?:(?:#{validDomainChars}(?:[_-]|#{validDomainChars})*)?#{validDomainChars}\.)/),s.txt.regexen.validDomainName=n(/(?:(?:#{validDomainChars}(?:-|#{validDomainChars})*)?#{validDomainChars}\.)/),s.txt.regexen.validGTLD=n(RegExp("(?:(?:삼성|닷컴|닷넷|香格里拉|餐厅|食品|飞利浦|電訊盈科|集团|通販|购物|谷歌|诺基亚|联通|网络|网站|网店|网址|组织机构|移动|珠宝|点看|游戏|淡马锡|机构|書籍|时尚|新闻|政府|政务|手表|手机|我爱你|慈善|微博|广东|工行|家電|娱乐|天主教|大拿|大众汽车|在线|嘉里大酒店|嘉里|商标|商店|商城|公益|公司|八卦|健康|信息|佛山|企业|中文网|中信|世界|ポイント|ファッション|セール|ストア|コム|グーグル|クラウド|みんな|คอม|संगठन|नेट|कॉम|همراه|موقع|موبايلي|كوم|كاثوليك|عرب|شبكة|بيتك|بازار|العليان|ارامكو|اتصالات|ابوظبي|קום|сайт|рус|орг|онлайн|москва|ком|католик|дети|zuerich|zone|zippo|zip|zero|zara|zappos|yun|youtube|you|yokohama|yoga|yodobashi|yandex|yamaxun|yahoo|yachts|xyz|xxx|xperia|xin|xihuan|xfinity|xerox|xbox|wtf|wtc|wow|world|works|work|woodside|wolterskluwer|wme|winners|wine|windows|win|williamhill|wiki|wien|whoswho|weir|weibo|wedding|wed|website|weber|webcam|weatherchannel|weather|watches|watch|warman|wanggou|wang|walter|walmart|wales|vuelos|voyage|voto|voting|vote|volvo|volkswagen|vodka|vlaanderen|vivo|viva|vistaprint|vista|vision|visa|virgin|vip|vin|villas|viking|vig|video|viajes|vet|versicherung|vermögensberatung|vermögensberater|verisign|ventures|vegas|vanguard|vana|vacations|ups|uol|uno|university|unicom|uconnect|ubs|ubank|tvs|tushu|tunes|tui|tube|trv|trust|travelersinsurance|travelers|travelchannel|travel|training|trading|trade|toys|toyota|town|tours|total|toshiba|toray|top|tools|tokyo|today|tmall|tkmaxx|tjx|tjmaxx|tirol|tires|tips|tiffany|tienda|tickets|tiaa|theatre|theater|thd|teva|tennis|temasek|telefonica|telecity|tel|technology|tech|team|tdk|tci|taxi|tax|tattoo|tatar|tatamotors|target|taobao|talk|taipei|tab|systems|symantec|sydney|swiss|swiftcover|swatch|suzuki|surgery|surf|support|supply|supplies|sucks|style|study|studio|stream|store|storage|stockholm|stcgroup|stc|statoil|statefarm|statebank|starhub|star|staples|stada|srt|srl|spreadbetting|spot|spiegel|space|soy|sony|song|solutions|solar|sohu|software|softbank|social|soccer|sncf|smile|smart|sling|skype|sky|skin|ski|site|singles|sina|silk|shriram|showtime|show|shouji|shopping|shop|shoes|shiksha|shia|shell|shaw|sharp|shangrila|sfr|sexy|sex|sew|seven|ses|services|sener|select|seek|security|secure|seat|search|scot|scor|scjohnson|science|schwarz|schule|school|scholarships|schmidt|schaeffler|scb|sca|sbs|sbi|saxo|save|sas|sarl|sapo|sap|sanofi|sandvikcoromant|sandvik|samsung|samsclub|salon|sale|sakura|safety|safe|saarland|ryukyu|rwe|run|ruhr|rugby|rsvp|room|rogers|rodeo|rocks|rocher|rmit|rip|rio|ril|rightathome|ricoh|richardli|rich|rexroth|reviews|review|restaurant|rest|republican|report|repair|rentals|rent|ren|reliance|reit|reisen|reise|rehab|redumbrella|redstone|red|recipes|realty|realtor|realestate|read|raid|radio|racing|qvc|quest|quebec|qpon|pwc|pub|prudential|pru|protection|property|properties|promo|progressive|prof|productions|prod|pro|prime|press|praxi|pramerica|post|porn|politie|poker|pohl|pnc|plus|plumbing|playstation|play|place|pizza|pioneer|pink|ping|pin|pid|pictures|pictet|pics|piaget|physio|photos|photography|photo|phone|philips|phd|pharmacy|pfizer|pet|pccw|pay|passagens|party|parts|partners|pars|paris|panerai|panasonic|pamperedchef|page|ovh|ott|otsuka|osaka|origins|orientexpress|organic|org|orange|oracle|open|ooo|onyourside|online|onl|ong|one|omega|ollo|oldnavy|olayangroup|olayan|okinawa|office|off|observer|obi|nyc|ntt|nrw|nra|nowtv|nowruz|now|norton|northwesternmutual|nokia|nissay|nissan|ninja|nikon|nike|nico|nhk|ngo|nfl|nexus|nextdirect|next|news|newholland|new|neustar|network|netflix|netbank|net|nec|nba|navy|natura|nationwide|name|nagoya|nadex|nab|mutuelle|mutual|museum|mtr|mtpc|mtn|msd|movistar|movie|mov|motorcycles|moto|moscow|mortgage|mormon|mopar|montblanc|monster|money|monash|mom|moi|moe|moda|mobily|mobile|mobi|mma|mls|mlb|mitsubishi|mit|mint|mini|mil|microsoft|miami|metlife|merckmsd|meo|menu|men|memorial|meme|melbourne|meet|media|med|mckinsey|mcdonalds|mcd|mba|mattel|maserati|marshalls|marriott|markets|marketing|market|map|mango|management|man|makeup|maison|maif|madrid|macys|luxury|luxe|lupin|lundbeck|ltda|ltd|lplfinancial|lpl|love|lotto|lotte|london|lol|loft|locus|locker|loans|loan|lixil|living|live|lipsy|link|linde|lincoln|limo|limited|lilly|like|lighting|lifestyle|lifeinsurance|life|lidl|liaison|lgbt|lexus|lego|legal|lefrak|leclerc|lease|lds|lawyer|law|latrobe|latino|lat|lasalle|lanxess|landrover|land|lancome|lancia|lancaster|lamer|lamborghini|ladbrokes|lacaixa|kyoto|kuokgroup|kred|krd|kpn|kpmg|kosher|komatsu|koeln|kiwi|kitchen|kindle|kinder|kim|kia|kfh|kerryproperties|kerrylogistics|kerryhotels|kddi|kaufen|juniper|juegos|jprs|jpmorgan|joy|jot|joburg|jobs|jnj|jmp|jll|jlc|jio|jewelry|jetzt|jeep|jcp|jcb|java|jaguar|iwc|iveco|itv|itau|istanbul|ist|ismaili|iselect|irish|ipiranga|investments|intuit|international|intel|int|insure|insurance|institute|ink|ing|info|infiniti|industries|immobilien|immo|imdb|imamat|ikano|iinet|ifm|ieee|icu|ice|icbc|ibm|hyundai|hyatt|hughes|htc|hsbc|how|house|hotmail|hotels|hoteles|hot|hosting|host|hospital|horse|honeywell|honda|homesense|homes|homegoods|homedepot|holiday|holdings|hockey|hkt|hiv|hitachi|hisamitsu|hiphop|hgtv|hermes|here|helsinki|help|healthcare|health|hdfcbank|hdfc|hbo|haus|hangout|hamburg|hair|guru|guitars|guide|guge|gucci|guardian|group|grocery|gripe|green|gratis|graphics|grainger|gov|got|gop|google|goog|goodyear|goodhands|goo|golf|goldpoint|gold|godaddy|gmx|gmo|gmbh|gmail|globo|global|gle|glass|glade|giving|gives|gifts|gift|ggee|george|genting|gent|gea|gdn|gbiz|garden|gap|games|game|gallup|gallo|gallery|gal|fyi|futbol|furniture|fund|fun|fujixerox|fujitsu|ftr|frontier|frontdoor|frogans|frl|fresenius|free|fox|foundation|forum|forsale|forex|ford|football|foodnetwork|food|foo|fly|flsmidth|flowers|florist|flir|flights|flickr|fitness|fit|fishing|fish|firmdale|firestone|fire|financial|finance|final|film|fido|fidelity|fiat|ferrero|ferrari|feedback|fedex|fast|fashion|farmers|farm|fans|fan|family|faith|fairwinds|fail|fage|extraspace|express|exposed|expert|exchange|everbank|events|eus|eurovision|etisalat|esurance|estate|esq|erni|ericsson|equipment|epson|epost|enterprises|engineering|engineer|energy|emerck|email|education|edu|edeka|eco|eat|earth|dvr|dvag|durban|dupont|duns|dunlop|duck|dubai|dtv|drive|download|dot|doosan|domains|doha|dog|dodge|doctor|docs|dnp|diy|dish|discover|discount|directory|direct|digital|diet|diamonds|dhl|dev|design|desi|dentist|dental|democrat|delta|deloitte|dell|delivery|degree|deals|dealer|deal|dds|dclk|day|datsun|dating|date|data|dance|dad|dabur|cyou|cymru|cuisinella|csc|cruises|cruise|crs|crown|cricket|creditunion|creditcard|credit|courses|coupons|coupon|country|corsica|coop|cool|cookingchannel|cooking|contractors|contact|consulting|construction|condos|comsec|computer|compare|company|community|commbank|comcast|com|cologne|college|coffee|codes|coach|clubmed|club|cloud|clothing|clinique|clinic|click|cleaning|claims|cityeats|city|citic|citi|citadel|cisco|circle|cipriani|church|chrysler|chrome|christmas|chloe|chintai|cheap|chat|chase|channel|chanel|cfd|cfa|cern|ceo|center|ceb|cbs|cbre|cbn|cba|catholic|catering|cat|casino|cash|caseih|case|casa|cartier|cars|careers|career|care|cards|caravan|car|capitalone|capital|capetown|canon|cancerresearch|camp|camera|cam|calvinklein|call|cal|cafe|cab|bzh|buzz|buy|business|builders|build|bugatti|budapest|brussels|brother|broker|broadway|bridgestone|bradesco|box|boutique|bot|boston|bostik|bosch|boots|booking|book|boo|bond|bom|bofa|boehringer|boats|bnpparibas|bnl|bmw|bms|blue|bloomberg|blog|blockbuster|blanco|blackfriday|black|biz|bio|bingo|bing|bike|bid|bible|bharti|bet|bestbuy|best|berlin|bentley|beer|beauty|beats|bcn|bcg|bbva|bbt|bbc|bayern|bauhaus|basketball|baseball|bargains|barefoot|barclays|barclaycard|barcelona|bar|bank|band|bananarepublic|banamex|baidu|baby|azure|axa|aws|avianca|autos|auto|author|auspost|audio|audible|audi|auction|attorney|athleta|associates|asia|asda|arte|art|arpa|army|archi|aramco|arab|aquarelle|apple|app|apartments|aol|anz|anquan|android|analytics|amsterdam|amica|amfam|amex|americanfamily|americanexpress|alstom|alsace|ally|allstate|allfinanz|alipay|alibaba|alfaromeo|akdn|airtel|airforce|airbus|aigo|aig|agency|agakhan|africa|afl|afamilycompany|aetna|aero|aeg|adult|ads|adac|actor|active|aco|accountants|accountant|accenture|academy|abudhabi|abogado|able|abc|abbvie|abbott|abb|abarth|aarp|aaa|onion)(?=[^0-9a-zA-Z@]|$))")), +s.txt.regexen.validCCTLD=n(RegExp("(?:(?:한국|香港|澳門|新加坡|台灣|台湾|中國|中国|გე|ไทย|ලංකා|ഭാരതം|ಭಾರತ|భారత్|சிங்கப்பூர்|இலங்கை|இந்தியா|ଭାରତ|ભારત|ਭਾਰਤ|ভাৰত|ভারত|বাংলা|भारोत|भारतम्|भारत|ڀارت|پاکستان|مليسيا|مصر|قطر|فلسطين|عمان|عراق|سورية|سودان|تونس|بھارت|بارت|ایران|امارات|المغرب|السعودية|الجزائر|الاردن|Õ°Õ¡Õµ|қаз|укр|срб|рф|мон|мкд|ею|бел|бг|ελ|zw|zm|za|yt|ye|ws|wf|vu|vn|vi|vg|ve|vc|va|uz|uy|us|um|uk|ug|ua|tz|tw|tv|tt|tr|tp|to|tn|tm|tl|tk|tj|th|tg|tf|td|tc|sz|sy|sx|sv|su|st|ss|sr|so|sn|sm|sl|sk|sj|si|sh|sg|se|sd|sc|sb|sa|rw|ru|rs|ro|re|qa|py|pw|pt|ps|pr|pn|pm|pl|pk|ph|pg|pf|pe|pa|om|nz|nu|nr|np|no|nl|ni|ng|nf|ne|nc|na|mz|my|mx|mw|mv|mu|mt|ms|mr|mq|mp|mo|mn|mm|ml|mk|mh|mg|mf|me|md|mc|ma|ly|lv|lu|lt|ls|lr|lk|li|lc|lb|la|kz|ky|kw|kr|kp|kn|km|ki|kh|kg|ke|jp|jo|jm|je|it|is|ir|iq|io|in|im|il|ie|id|hu|ht|hr|hn|hm|hk|gy|gw|gu|gt|gs|gr|gq|gp|gn|gm|gl|gi|gh|gg|gf|ge|gd|gb|ga|fr|fo|fm|fk|fj|fi|eu|et|es|er|eh|eg|ee|ec|dz|do|dm|dk|dj|de|cz|cy|cx|cw|cv|cu|cr|co|cn|cm|cl|ck|ci|ch|cg|cf|cd|cc|ca|bz|by|bw|bv|bt|bs|br|bq|bo|bn|bm|bl|bj|bi|bh|bg|bf|be|bd|bb|ba|az|ax|aw|au|at|as|ar|aq|ao|an|am|al|ai|ag|af|ae|ad|ac)(?=[^0-9a-zA-Z@]|$))")),s.txt.regexen.validPunycode=/(?:xn--[0-9a-z]+)/,s.txt.regexen.validSpecialCCTLD=/(?:(?:co|tv)(?=[^0-9a-zA-Z@]|$))/,s.txt.regexen.validDomain=n(/(?:#{validSubdomain}*#{validDomainName}(?:#{validGTLD}|#{validCCTLD}|#{validPunycode}))/),s.txt.regexen.validAsciiDomain=n(/(?:(?:[\-a-z0-9#{latinAccentChars}]+)\.)+(?:#{validGTLD}|#{validCCTLD}|#{validPunycode})/gi),s.txt.regexen.invalidShortDomain=n(/^#{validDomainName}#{validCCTLD}$/i),s.txt.regexen.validSpecialShortDomain=n(/^#{validDomainName}#{validSpecialCCTLD}$/i),s.txt.regexen.validPortNumber=/[0-9]+/,s.txt.regexen.cyrillicLettersAndMarks=/\u0400-\u04FF/,s.txt.regexen.validGeneralUrlPathChars=n(/[a-z#{cyrillicLettersAndMarks}0-9!\*';:=\+,\.\$\/%#\[\]\-_~@\|&#{latinAccentChars}]/i),s.txt.regexen.validUrlBalancedParens=n("\\((?:#{validGeneralUrlPathChars}+|(?:#{validGeneralUrlPathChars}*\\(#{validGeneralUrlPathChars}+\\)#{validGeneralUrlPathChars}*))\\)","i"),s.txt.regexen.validUrlPathEndingChars=n(/[\+\-a-z#{cyrillicLettersAndMarks}0-9=_#\/#{latinAccentChars}]|(?:#{validUrlBalancedParens})/i),s.txt.regexen.validUrlPath=n("(?:(?:#{validGeneralUrlPathChars}*(?:#{validUrlBalancedParens}#{validGeneralUrlPathChars}*)*#{validUrlPathEndingChars})|(?:@#{validGeneralUrlPathChars}+/))","i"),s.txt.regexen.validUrlQueryChars=/[a-z0-9!?\*'@\(\);:&=\+\$\/%#\[\]\-_\.,~|]/i,s.txt.regexen.validUrlQueryEndingChars=/[a-z0-9_&=#\/]/i,s.txt.regexen.extractUrl=n("((#{validUrlPrecedingChars})((https?:\\/\\/)?(#{validDomain})(?::(#{validPortNumber}))?(\\/#{validUrlPath}*)?(\\?#{validUrlQueryChars}*#{validUrlQueryEndingChars})?))","gi"),s.txt.regexen.validTcoUrl=/^https?:\/\/t\.co\/[a-z0-9]+/i,s.txt.regexen.urlHasProtocol=/^https?:\/\//i,s.txt.regexen.urlHasHttps=/^https:\/\//i,s.txt.regexen.cashtag=/[a-z]{1,6}(?:[._][a-z]{1,2})?/i,s.txt.regexen.validCashtag=n("(^|#{spaces})(\\$)(#{cashtag})(?=$|\\s|[#{punct}])","gi"),s.txt.regexen.validateUrlUnreserved=/[a-z\u0400-\u04FF0-9\-._~]/i,s.txt.regexen.validateUrlPctEncoded=/(?:%[0-9a-f]{2})/i,s.txt.regexen.validateUrlSubDelims=/[!$&'()*+,;=]/i,s.txt.regexen.validateUrlPchar=n("(?:#{validateUrlUnreserved}|#{validateUrlPctEncoded}|#{validateUrlSubDelims}|[:|@])","i"),s.txt.regexen.validateUrlScheme=/(?:[a-z][a-z0-9+\-.]*)/i,s.txt.regexen.validateUrlUserinfo=n("(?:#{validateUrlUnreserved}|#{validateUrlPctEncoded}|#{validateUrlSubDelims}|:)*","i"),s.txt.regexen.validateUrlDecOctet=/(?:[0-9]|(?:[1-9][0-9])|(?:1[0-9]{2})|(?:2[0-4][0-9])|(?:25[0-5]))/i,s.txt.regexen.validateUrlIpv4=n(/(?:#{validateUrlDecOctet}(?:\.#{validateUrlDecOctet}){3})/i),s.txt.regexen.validateUrlIpv6=/(?:\[[a-f0-9:\.]+\])/i,s.txt.regexen.validateUrlIp=n("(?:#{validateUrlIpv4}|#{validateUrlIpv6})","i"),s.txt.regexen.validateUrlSubDomainSegment=/(?:[a-z0-9](?:[a-z0-9_\-]*[a-z0-9])?)/i,s.txt.regexen.validateUrlDomainSegment=/(?:[a-z0-9](?:[a-z0-9\-]*[a-z0-9])?)/i,s.txt.regexen.validateUrlDomainTld=/(?:[a-z](?:[a-z0-9\-]*[a-z0-9])?)/i,s.txt.regexen.validateUrlDomain=n(/(?:(?:#{validateUrlSubDomainSegment}\.)*(?:#{validateUrlDomainSegment}\.)#{validateUrlDomainTld})/i),s.txt.regexen.validateUrlHost=n("(?:#{validateUrlIp}|#{validateUrlDomain})","i"),s.txt.regexen.validateUrlUnicodeSubDomainSegment=/(?:(?:[a-z0-9]|[^\u0000-\u007f])(?:(?:[a-z0-9_\-]|[^\u0000-\u007f])*(?:[a-z0-9]|[^\u0000-\u007f]))?)/i,s.txt.regexen.validateUrlUnicodeDomainSegment=/(?:(?:[a-z0-9]|[^\u0000-\u007f])(?:(?:[a-z0-9\-]|[^\u0000-\u007f])*(?:[a-z0-9]|[^\u0000-\u007f]))?)/i,s.txt.regexen.validateUrlUnicodeDomainTld=/(?:(?:[a-z]|[^\u0000-\u007f])(?:(?:[a-z0-9\-]|[^\u0000-\u007f])*(?:[a-z0-9]|[^\u0000-\u007f]))?)/i,s.txt.regexen.validateUrlUnicodeDomain=n(/(?:(?:#{validateUrlUnicodeSubDomainSegment}\.)*(?:#{validateUrlUnicodeDomainSegment}\.)#{validateUrlUnicodeDomainTld})/i),s.txt.regexen.validateUrlUnicodeHost=n("(?:#{validateUrlIp}|#{validateUrlUnicodeDomain})","i"),s.txt.regexen.validateUrlPort=/[0-9]{1,5}/,s.txt.regexen.validateUrlUnicodeAuthority=n("(?:(#{validateUrlUserinfo})@)?(#{validateUrlUnicodeHost})(?::(#{validateUrlPort}))?","i"),s.txt.regexen.validateUrlAuthority=n("(?:(#{validateUrlUserinfo})@)?(#{validateUrlHost})(?::(#{validateUrlPort}))?","i"),s.txt.regexen.validateUrlPath=n(/(\/#{validateUrlPchar}*)*/i),s.txt.regexen.validateUrlQuery=n(/(#{validateUrlPchar}|\/|\?)*/i),s.txt.regexen.validateUrlFragment=n(/(#{validateUrlPchar}|\/|\?)*/i),s.txt.regexen.validateUrlUnencoded=n("^(?:([^:/?#]+):\\/\\/)?([^/?#]*)([^?#]*)(?:\\?([^#]*))?(?:#(.*))?$","i");var l="tweet-url list-slug",f="tweet-url username",p="tweet-url hashtag",h="tweet-url cashtag",g={urlClass:!0,listClass:!0,usernameClass:!0,hashtagClass:!0,cashtagClass:!0,usernameUrlBase:!0,listUrlBase:!0,hashtagUrlBase:!0,cashtagUrlBase:!0,usernameUrlBlock:!0,listUrlBlock:!0,hashtagUrlBlock:!0,linkUrlBlock:!0,usernameIncludeSymbol:!0,suppressLists:!0,suppressNoFollow:!0,targetBlank:!0,suppressDataScreenName:!0,urlEntities:!0,symbolTag:!0,textWithSymbolTag:!0,urlTarget:!0,invisibleTagAttrs:!0,linkAttributeBlock:!0,linkTextBlock:!0,htmlEscapeNonEntities:!0},m={disabled:!0,readonly:!0,multiple:!0,checked:!0};s.txt.tagAttrs=function(e){var t="";for(var n in e){var r=e[n];m[n]&&(r=r?n:null),null!=r&&(t+=" "+s.txt.htmlEscape(n)+'="'+s.txt.htmlEscape(r.toString())+'"')}return t},s.txt.linkToText=function(e,t,n,r){r.suppressNoFollow||(n.rel="nofollow"),r.linkAttributeBlock&&r.linkAttributeBlock(e,n),r.linkTextBlock&&(t=r.linkTextBlock(e,t));var a={text:t,attr:s.txt.tagAttrs(n)};return i("#{text}",a)},s.txt.linkToTextWithSymbol=function(e,t,n,r,a){var u=a.symbolTag?"<"+a.symbolTag+">"+t+"":t;n=s.txt.htmlEscape(n);var i=a.textWithSymbolTag?"<"+a.textWithSymbolTag+">"+n+"":n;return a.usernameIncludeSymbol||!t.match(s.txt.regexen.atSigns)?s.txt.linkToText(e,u+i,r,a):u+s.txt.linkToText(e,i,r,a)},s.txt.linkToHashtag=function(e,t,n){var r=t.substring(e.indices[0],e.indices[0]+1),a=s.txt.htmlEscape(e.hashtag),u=o(n.htmlAttrs||{});return u.href=n.hashtagUrlBase+a,u.title="#"+a,u["class"]=n.hashtagClass,a.charAt(0).match(s.txt.regexen.rtl_chars)&&(u["class"]+=" rtl"),n.targetBlank&&(u.target="_blank"),s.txt.linkToTextWithSymbol(e,r,a,u,n)},s.txt.linkToCashtag=function(e,t,n){var r=s.txt.htmlEscape(e.cashtag),a=o(n.htmlAttrs||{});return a.href=n.cashtagUrlBase+r,a.title="$"+r,a["class"]=n.cashtagClass,n.targetBlank&&(a.target="_blank"),s.txt.linkToTextWithSymbol(e,"$",r,a,n)},s.txt.linkToMentionAndList=function(e,t,n){var r=t.substring(e.indices[0],e.indices[0]+1),a=s.txt.htmlEscape(e.screenName),u=s.txt.htmlEscape(e.listSlug),i=e.listSlug&&!n.suppressLists,d=o(n.htmlAttrs||{});return d["class"]=i?n.listClass:n.usernameClass,d.href=i?n.listUrlBase+a+u:n.usernameUrlBase+a,i||n.suppressDataScreenName||(d["data-screen-name"]=a),n.targetBlank&&(d.target="_blank"),s.txt.linkToTextWithSymbol(e,r,i?a+u:a,d,n)},s.txt.linkToUrl=function(e,t,n){var r=e.url,a=r,u=s.txt.htmlEscape(a),i=n.urlEntities&&n.urlEntities[r]||e;i.display_url&&(u=s.txt.linkTextWithEntity(i,n));var d=o(n.htmlAttrs||{});return r.match(s.txt.regexen.urlHasProtocol)||(r="http://"+r),d.href=r,n.targetBlank&&(d.target="_blank"),n.urlClass&&(d["class"]=n.urlClass),n.urlTarget&&(d.target=n.urlTarget),!n.title&&i.display_url&&(d.title=i.expanded_url),s.txt.linkToText(e,u,d,n)},s.txt.linkTextWithEntity=function(e,t){var n=e.display_url,r=e.expanded_url,a=n.replace(/…/g,"");if(r.indexOf(a)!=-1){var u=r.indexOf(a),o={displayUrlSansEllipses:a,beforeDisplayUrl:r.substr(0,u),afterDisplayUrl:r.substr(u+a.length),precedingEllipsis:n.match(/^…/)?"…":"",followingEllipsis:n.match(/…$/)?"…":""};for(var d in o)o.hasOwnProperty(d)&&(o[d]=s.txt.htmlEscape(o[d]));return o.invisible=t.invisibleTagAttrs,i("#{precedingEllipsis} #{beforeDisplayUrl}#{displayUrlSansEllipses}#{afterDisplayUrl} #{followingEllipsis}",o)}return n},s.txt.autoLinkEntities=function(e,t,n){n=o(n||{}),n.hashtagClass=n.hashtagClass||p,n.hashtagUrlBase=n.hashtagUrlBase||"https://twitter.com/#!/search?q=%23",n.cashtagClass=n.cashtagClass||h,n.cashtagUrlBase=n.cashtagUrlBase||"https://twitter.com/#!/search?q=%24",n.listClass=n.listClass||l,n.usernameClass=n.usernameClass||f,n.usernameUrlBase=n.usernameUrlBase||"https://twitter.com/",n.listUrlBase=n.listUrlBase||"https://twitter.com/",n.htmlAttrs=s.txt.extractHtmlAttrsFromOptions(n),n.invisibleTagAttrs=n.invisibleTagAttrs||"style='position:absolute;left:-9999px;'";var r,a,u;if(n.urlEntities){for(r={},a=0,u=n.urlEntities.length;ae[n].indices[0]?(e.splice(n,1),n--):t=e[n]},s.txt.extractEntitiesWithIndices=function(e,t){var n=s.txt.extractUrlsWithIndices(e,t).concat(s.txt.extractMentionsOrListsWithIndices(e)).concat(s.txt.extractHashtagsWithIndices(e,{checkUrlOverlap:!1})).concat(s.txt.extractCashtagsWithIndices(e));return 0==n.length?[]:(s.txt.removeOverlappingEntities(n),n)},s.txt.extractMentions=function(e){for(var t=[],n=s.txt.extractMentionsWithIndices(e),r=0;r0){var a=n.concat(r);s.txt.removeOverlappingEntities(a),n=[];for(var u=0;u");for(var i=0;i",""],h=s.txt.splitTags(e),g="",m=0,v=h[0],b=0,x=0,y=!1,w=v,k=[];for(a=0;a=b+v.length;)g+=w.slice(x),y&&o===b+w.length&&(g+=d,c=!0),h[m+1]&&(g+="<"+h[m+1]+">"),b+=w.length,x=0,m+=2,v=h[m],w=v,y=!1;c||null==v?c||(c=!0,g+=d):(l=o-b,g+=w.slice(x,l)+d,x=l,y=i%2===0)}if(null!=v)for(x";return g};var v=140;s.txt.getTweetLength=function(e,t){t||(t={short_url_length:23,short_url_length_https:23});var n=s.txt.getUnicodeTextLength(e),r=s.txt.extractUrlsWithIndices(e);s.txt.modifyIndicesFromUTF16ToUnicode(e,r);for(var a=0;av?"too_long":!!s.txt.hasInvalidCharacters(e)&&"invalid_characters":"empty"},s.txt.hasInvalidCharacters=function(e){return s.txt.regexen.invalid_chars.test(e)},s.txt.isValidTweetText=function(e){return!s.txt.isInvalidTweet(e)},s.txt.isValidUsername=function(e){if(!e)return!1;var t=s.txt.extractMentions(e);return 1===t.length&&t[0]===e.slice(1)};var b=n(/^#{validMentionOrList}$/);if(s.txt.isValidList=function(e){var t=e.match(b);return!(!t||""!=t[1]||!t[4])},s.txt.isValidHashtag=function(e){if(!e)return!1;var t=s.txt.extractHashtags(e);return 1===t.length&&t[0]===e.slice(1)},s.txt.isValidUrl=function(e,t,n){if(null==t&&(t=!0),null==n&&(n=!0),!e)return!1;var r=e.match(s.txt.regexen.validateUrlUnencoded);if(!r||r[0]!==e)return!1;var a=r[1],u=r[2],i=r[3],o=r[4],c=r[5];return!!((!n||d(a,s.txt.regexen.validateUrlScheme)&&a.match(/^https?$/i))&&d(i,s.txt.regexen.validateUrlPath)&&d(o,s.txt.regexen.validateUrlQuery,!0)&&d(c,s.txt.regexen.validateUrlFragment,!0))&&(t&&d(u,s.txt.regexen.validateUrlUnicodeAuthority)||!t&&d(u,s.txt.regexen.validateUrlAuthority))},"undefined"!=typeof e&&e.exports&&(e.exports=s.txt),a=[],r=s.txt,u="function"==typeof r?r.apply(t,a):r,!(void 0!==u&&(e.exports=u)),"undefined"!=typeof window)if(window.twttr)for(var x in s)window.twttr[x]=s[x];else window.twttr=s}()},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function a(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);tu&&r+S.offsetHeighto&&a+S.offsetWidth-1){var d=t("x","y"),c=d.deltaX,l=d.deltaY;[].concat(a(u)).forEach(function(t,n){if(0!==l){var r=parseInt(t.getAttribute("y"),10)+l,a=r;"textbox"===i&&(a+=e.size),"point"!==i||$.browser.mozilla||(a=(0,k.scaleUp)(o,{viewY:a}).viewY),$.browser.mozilla&&(a-=8),t.setAttribute("y",a),e.rectangles?e.rectangles[n].y=r:e.y&&(e.y=r)}if(0!==c){var u=parseInt(t.getAttribute("x"),10)+c,d=u;"point"!==i||$.browser.mozilla||(d=(0,k.scaleUp)(o,{viewX:d}).viewX),$.browser.mozilla&&(d-=8),t.setAttribute("x",d),e.rectangles?e.rectangles[n].x=u:e.x&&(e.x=u)}})}else if("drawing"===i){var f=(0,k.scaleDown)(o,(0,k.getAnnotationRect)(u[0])),p=m(e.lines[0],2),h=p[0],g=p[1],v=n(h,g),x=v.deltaX,w=v.deltaY;w+=g-f.top,x+=h-f.left,e.lines.forEach(function(t,n){var r=m(e.lines[n],2),a=r[0],u=r[1];e.lines[n][0]=a+x,e.lines[n][1]=u+w}),u[0].parentNode.removeChild(u[0]),(0,y["default"])(o,e)}_.readonly||b["default"].getStoreAdapter().editAnnotation(s,r,e)}),setTimeout(function(){C=!1},0),S.style.background="",S.style.cursor="",document.removeEventListener("mousemove",l),document.removeEventListener("mouseup",f),(0,k.enableUserSelect)()}function p(e){var t=e.dataset.pdfAnnotateType;"point"===t&&(0,A.selectComment)(e.dataset.pdfAnnotateId),u(e)}function h(){E||(E=!0,(0,w.addEventListener)("annotation:click",p))}function g(){i(),E&&(E=!1,(0,w.removeEventListener)("annotation:click",p))}Object.defineProperty(t,"__esModule",{value:!0});var m=function(){function e(e,t){var n=[],r=!0,a=!1,u=void 0;try{for(var i,o=e[Symbol.iterator]();!(r=(i=o.next()).done)&&(n.push(i.value),!t||n.length!==t);r=!0);}catch(d){a=!0,u=d}finally{try{!r&&o["return"]&&o["return"]()}finally{if(a)throw u}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();t.createEditOverlay=u,t.enableEdit=h,t.disableEdit=g;var v=n(1),b=r(v),x=n(41),y=r(x),w=n(4),k=n(6),A=n(38),_=n(37),E=!1,C=!1,S=void 0,L=void 0,U=void 0,T=void 0,P=void 0,I=3},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function a(e){var t=void 0,n=void 0;switch(e.rotation%360){case 0:t=n=0;break;case 90:t=0,n=e.width/e.scale*-1;break;case 180:t=e.width/e.scale*-1,n=e.height/e.scale*-1;break;case 270:t=e.height/e.scale*-1,n=0}return{x:t,y:n}}function u(e,t){var n=a(t);if(e.setAttribute("transform","scale("+t.scale+") rotate("+t.rotation+") translate("+n.x+", "+n.y+")"),!x&&"svg"===e.nodeName.toLowerCase()){e.setAttribute("x",parseInt(e.getAttribute("x"),10)*t.scale),e.setAttribute("y",parseInt(e.getAttribute("y"),10)*t.scale);var r=parseInt(e.getAttribute("x",10)),i=parseInt(e.getAttribute("y",10)),o=parseInt(e.getAttribute("width"),10),s=parseInt(e.getAttribute("height"),10),c=e.querySelector("path"),l=c.parentNode;switch([e,l,c,e.querySelector("rect")].forEach(function(e){e.setAttribute("width",parseInt(e.getAttribute("width"),10)*t.scale),e.setAttribute("height",parseInt(e.getAttribute("height"),10)*t.scale)}),u(c,(0,d["default"])({},t,{scale:1})),t.rotation%360){case 90:e.setAttribute("x",t.width-i-o),e.setAttribute("y",r),l.setAttribute("x",1),l.setAttribute("y",0);break;case 180:e.setAttribute("x",t.width-r-o),e.setAttribute("y",t.height-i-s),l.setAttribute("y",2);break;case 270:e.setAttribute("x",i),e.setAttribute("y",t.height-r-s),l.setAttribute("x",-1),l.setAttribute("y",0)}}return e}function i(e,t,n){n||(n=JSON.parse(e.getAttribute("data-pdf-annotate-viewport")));var r=void 0;switch(t.type){case"area":case"highlight":r=(0,m["default"])(t);break;case"strikeout":r=(0,c["default"])(t);break;case"point":r=(0,h["default"])(t);break;case"textbox":r=(0,b["default"])(t);break;case"drawing":r=(0,f["default"])(t)}return r&&(r.setAttribute("data-pdf-annotate-id",t.uuid),r.setAttribute("data-pdf-annotate-type",t.type),r.setAttribute("aria-hidden",!0),e.appendChild(u(r,n))),r}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=i;var o=n(42),d=r(o),s=n(43),c=r(s),l=n(46),f=r(l),p=n(47),h=r(p),g=n(48),m=r(g),v=n(49),b=r(v),x=/firefox/i.test(navigator.userAgent);e.exports=t["default"]},function(e,t){/* + object-assign + (c) Sindre Sorhus + @license MIT + */ +"use strict";function n(e){if(null===e||void 0===e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}function r(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;var r=Object.getOwnPropertyNames(t).map(function(e){return t[e]});if("0123456789"!==r.join(""))return!1;var a={};return"abcdefghijklmnopqrst".split("").forEach(function(e){a[e]=e}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},a)).join("")}catch(u){return!1}}var a=Object.getOwnPropertySymbols,u=Object.prototype.hasOwnProperty,i=Object.prototype.propertyIsEnumerable;e.exports=r()?Object.assign:function(e,t){for(var r,o,d=n(e),s=1;s1&&void 0!==arguments[1]?arguments[1]:0;switch(e.type){case"highlight":case"strikeout":var n=e.rectangles,r=n[0],a=n[n.length-1];(0,c["default"])((0,i["default"])("Begin "+e.type+" annotation "+t,e.uuid),r.x,r.y,e.page,!0),(0,c["default"])((0,i["default"])("End "+e.type+" annotation "+t,e.uuid+"-end"),a.x+a.width,a.y,e.page,!1);break;case"textbox":case"point":var u="textbox"===e.type?" (content: "+e.content+")":"";(0,d["default"])((0,i["default"])(e.type+" annotation "+t+u,e.uuid),e.x,e.y,e.page);break;case"drawing":case"area":var o="undefined"!=typeof e.x?e.x:e.lines[0][0],s="undefined"!=typeof e.y?e.y:e.lines[0][1];(0,d["default"])((0,i["default"])("Unlabeled drawing",e.uuid),o,s,e.page)}p.includes(e.type)&&(0,f["default"])(e.documentId,e.uuid)}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=a;var u=n(53),i=r(u),o=n(54),d=r(o),s=n(55),c=r(s),l=n(56),f=r(l),p=["highlight","point","area"];e.exports=t["default"]},function(e,t){"use strict";function n(e,t){var n=document.createElement("div"),r=document.createTextNode(e);return n.appendChild(r),n.setAttribute("id","pdf-annotate-screenreader-"+t),n.style.position="absolute",n.style.left="-10000px",n.style.top="auto",n.style.width="1px",n.style.height="1px",n.style.overflow="hidden",n}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=n,e.exports=t["default"]},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function a(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t div")));n=(0,d.scaleUp)(u,{y:n}).y+i.top,t=(0,d.scaleUp)(u,{x:t}).x+i.left;for(var c=0,l=s.length;c"===f[f.length-1])for(;f.length&&(p.unshift(f.pop()),"<"!==p[0]););l.innerHTML=f.join("");var h=(0,i.scaleDown)(s,{width:l.getBoundingClientRect().width}).width;if(c+h<=t)break;p.unshift(f.pop())}return d.innerHTML=f.join("")+e.outerHTML+p.join(""),l.parentNode.removeChild(l),!0}function u(e,t,n){var a=document.querySelector('svg[data-pdf-annotate-page="'+n+'"]'),u=a.getBoundingClientRect();return t=(0,i.scaleUp)(a,{y:t}).y+u.top,e=(0,i.scaleUp)(a,{x:e}).x+u.left,[].concat(r(a.parentNode.querySelectorAll(".textLayer [data-canvas-width]"))).filter(function(n){return(0,i.pointIntersectsRect)(e,t,n.getBoundingClientRect())})[0]}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=a;var i=n(6);e.exports=t["default"]},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function a(e,t,n){var r=void 0;return r=Array.isArray(n)?Promise.resolve(n):i["default"].getStoreAdapter().getComments(e,t),r.then(function(e){var n=document.getElementById("pdf-annotate-screenreader-"+t);if(n){var r=document.createElement("ol");r.setAttribute("id","pdf-annotate-screenreader-comment-list-"+t),r.setAttribute("aria-label","Comments"),n.appendChild(r),e.forEach(d["default"])}})}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=a;var u=n(1),i=r(u),o=n(57),d=r(o);e.exports=t["default"]},function(e,t){"use strict";function n(e){if(e){var t=document.querySelector("#pdf-annotate-screenreader-"+e.annotation+" ol");if(t){var n=document.createElement("li");n.setAttribute("id","pdf-annotate-screenreader-comment-"+e.uuid),n.appendChild(document.createTextNode(""+e.content)),t.appendChild(n)}}}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=n,e.exports=t["default"]},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function a(){(0,v.addEventListener)("annotation:add",function(e,t,n){u(e,t,n.type)}),(0,v.addEventListener)("annotation:edit",function(e,t,n){u(e,n.page,n.type)}),(0,v.addEventListener)("annotation:delete",i),(0,v.addEventListener)("comment:add",o),(0,v.addEventListener)("comment:delete",d)}function u(e,t,n){x["default"].getStoreAdapter().getAnnotations(e).then(function(e){var t=[],r=!0,a=!1,u=void 0;try{for(var i,o=Object.keys(e)[Symbol.iterator]();!(r=(i=o.next()).done);r=!0){var d=i.value;for(var s in e[d])s.type==n&&t.push(s)}}catch(c){a=!0,u=c}finally{try{!r&&o["return"]&&o["return"]()}finally{if(a)throw u}}return t}).then(function(t){return t.forEach(function(t){i(e,t.uuid)}),t}).then(f["default"])}function i(e,t){s("pdf-annotate-screenreader-"+t),s("pdf-annotate-screenreader-"+t+"-end")}function o(e,t,n){var r=document.querySelector("pdf-annotate-screenreader-comment-list-"+t),a=void 0;a=r?Promise.resolve(!0):(0,m["default"])(e,t,[]).then(function(){return r=document.querySelector("pdf-annotate-screenreader-comment-list-"+t),!0}),a.then(function(){(0,h["default"])(n)})}function d(e,t){s("pdf-annotate-screenreader-comment-"+t)}function s(e){var t=document.getElementById(e);t&&t.parentNode.removeChild(t)}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=a;var c=n(52),l=(r(c),n(51)),f=r(l),p=n(57),h=r(p),g=n(56),m=r(g),v=n(4),b=n(1),x=r(b);e.exports=t["default"]},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(4),a=n(40),u=n(60),i=n(61),o=n(62),d=n(63),s=n(64);t["default"]={addEventListener:r.addEventListener,removeEventListener:r.removeEventListener,fireEvent:r.fireEvent,disableEdit:a.disableEdit,enableEdit:a.enableEdit,disablePen:u.disablePen,enablePen:u.enablePen,setPen:u.setPen,disablePoint:i.disablePoint,enablePoint:i.enablePoint,disableRect:o.disableRect,enableRect:o.enableRect,disableText:d.disableText,enableText:d.enableText,setText:d.setText,createPage:s.createPage,renderPage:s.renderPage},e.exports=t["default"]},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function a(){y=null,w=[],document.addEventListener("mousemove",i),document.addEventListener("mouseup",u)}function u(e){var t=void 0;if(w.length>1&&(t=(0,m.findSVGAtPoint)(e.clientX,e.clientY))){var n=(0,m.getMetadata)(t),r=n.documentId,a=n.pageNumber;p["default"].getStoreAdapter().addAnnotation(r,a,{type:"drawing",width:b,color:x,lines:w}).then(function(e){y&&t.removeChild(y),(0,g["default"])(t,e)})}document.removeEventListener("mousemove",i),document.removeEventListener("mouseup",u)}function i(e){d(e.clientX,e.clientY)}function o(e){27===e.keyCode&&(w=null,y.parentNode.removeChild(y),document.removeEventListener("mousemove",i),document.removeEventListener("mouseup",u))}function d(e,t){var n=(0,m.findSVGAtPoint)(e,t);if(n){var r=n.getBoundingClientRect(),a=(0,m.scaleDown)(n,{x:e-r.left,y:t-r.top});w.push([a.x,a.y]),w.length<=1||(y&&n.removeChild(y),y=(0,g["default"])(n,{type:"drawing",color:x,width:b,lines:w}))}}function s(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"000000";b=parseInt(e,10),x=t}function c(){v||(v=!0,document.addEventListener("mousedown",a),document.addEventListener("keyup",o),(0,m.disableUserSelect)())}function l(){v&&(v=!1,document.removeEventListener("mousedown",a),document.removeEventListener("keyup",o),(0,m.enableUserSelect)())}Object.defineProperty(t,"__esModule",{value:!0}),t.setPen=s,t.enablePen=c,t.disablePen=l;var f=n(1),p=r(f),h=n(41),g=r(h),m=n(6),v=!1,b=void 0,x=void 0,y=void 0,w=void 0},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function a(e){!v&&(0,g.findSVGAtPoint)(e.clientX,e.clientY)&&(v=document.createElement("input"),v.setAttribute("id","pdf-annotate-point-input"),v.setAttribute("placeholder","Enter comment"),v.style.border="3px solid "+g.BORDER_COLOR,v.style.borderRadius="3px",v.style.position="absolute",v.style.top=e.clientY+"px",v.style.left=e.clientX+"px",v.addEventListener("blur",u),v.addEventListener("keyup",i),document.body.appendChild(v),v.focus())}function u(){o()}function i(e){27===e.keyCode?d():13===e.keyCode&&o()}function o(){if(v.value.trim().length>0){var e=parseInt(v.style.left,10),t=parseInt(v.style.top,10),n=v.value.trim(),r=(0,g.findSVGAtPoint)(e,t);if(!r)return;var a=r.getBoundingClientRect(),u=(0,g.getMetadata)(r),i=u.documentId,o=u.pageNumber,s=Object.assign({type:"point"},(0,g.scaleDown)(r,{x:e-a.left,y:t-a.top}));f["default"].getStoreAdapter().addAnnotation(i,o,s).then(function(e){f["default"].getStoreAdapter().addComment(i,e.uuid,n),(0,h["default"])(r,e)})}d()}function d(){v.removeEventListener("blur",u),v.removeEventListener("keyup",i),document.body.removeChild(v),v=null}function s(){m||(m=!0,document.addEventListener("mouseup",a))}function c(){m&&(m=!1,document.removeEventListener("mouseup",a))}Object.defineProperty(t,"__esModule",{value:!0}),t.enablePoint=s,t.disablePoint=c;var l=n(1),f=r(l),p=n(41),h=r(p),g=n(6),m=!1,v=void 0},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function a(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t0&&n[0].width>0&&n[0].height>0)return n}catch(r){}return null}function i(e){var t=void 0;if("area"===x&&(t=(0,v.findSVGAtPoint)(e.clientX,e.clientY))){var n=t.getBoundingClientRect();w=e.clientY,k=e.clientX,y=document.createElement("div"),y.style.position="absolute",y.style.top=w-n.top+"px",y.style.left=k-n.left+"px",y.style.border="3px solid "+v.BORDER_COLOR,y.style.borderRadius="3px",t.parentNode.appendChild(y),document.addEventListener("mousemove",o),(0,v.disableUserSelect)()}}function o(e){var t=y.parentNode.querySelector("svg.annotationLayer"),n=t.getBoundingClientRect();k+(e.clientX-k)0&&e.height>0&&e.x>-1&&e.y>-1})},0!==u.rectangles.length){if("area"===e){var o=u.rectangles[0];delete u.rectangles,u.x=o.x,u.y=o.y,u.width=o.width,u.height=o.height}var d=(0,v.getMetadata)(r),s=d.documentId,c=d.pageNumber;h["default"].getStoreAdapter().addAnnotation(s,c,u).then(function(e){(0,m["default"])(r,e)})}}}function l(e){x=e,b||(b=!0,document.addEventListener("mouseup",d),document.addEventListener("mousedown",i),document.addEventListener("keyup",s))}function f(){b&&(b=!1,document.removeEventListener("mouseup",d),document.removeEventListener("mousedown",i),document.removeEventListener("keyup",s))}Object.defineProperty(t,"__esModule",{value:!0}),t.enableRect=l,t.disableRect=f;var p=n(1),h=r(p),g=n(41),m=r(g),v=n(6),b=!1,x=void 0,y=void 0,w=void 0,k=void 0},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function a(e){!b&&(0,m.findSVGAtPoint)(e.clientX,e.clientY)&&(b=document.createElement("input"),b.setAttribute("id","pdf-annotate-text-input"),b.setAttribute("placeholder","Enter text"),b.style.border="3px solid "+m.BORDER_COLOR,b.style.borderRadius="3px",b.style.position="absolute",b.style.top=e.clientY+"px",b.style.left=e.clientX+"px",b.style.fontSize=x+"px",b.addEventListener("blur",u),b.addEventListener("keyup",i),document.body.appendChild(b),b.focus())}function u(){o()}function i(e){27===e.keyCode?d():13===e.keyCode&&o()}function o(){if(b.value.trim().length>0){var e=parseInt(b.style.left,10),t=parseInt(b.style.top,10),n=(0,m.findSVGAtPoint)(e,t);if(!n)return;var r=(0,m.getMetadata)(n),a=r.documentId,u=r.pageNumber,i=n.getBoundingClientRect(),o=Object.assign({type:"textbox",size:x,color:y,content:b.value.trim()},(0,m.scaleDown)(n,{x:e-i.left,y:t-i.top,width:b.offsetWidth,height:b.offsetHeight}));p["default"].getStoreAdapter().addAnnotation(a,u,o).then(function(e){(0,g["default"])(n,e)})}d()}function d(){try{b&&(b.removeEventListener("blur",u),b.removeEventListener("keyup",i),document.body.removeChild(b),b=null)}catch(e){console.log("Try/catch is necessary because exist a error in Safari")}}function s(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:12,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"000000";x=parseInt(e,10),y=t}function c(){v||(v=!0,document.addEventListener("mouseup",a))}function l(){v&&(v=!1,document.removeEventListener("mouseup",a))}Object.defineProperty(t,"__esModule",{value:!0}),t.setText=s,t.enableText=c,t.disableText=l;var f=n(1),p=r(f),h=n(41),g=r(h),m=n(6),v=!1,b=void 0,x=void 0,y=void 0},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{"default":e}}function a(e){var t=document.createElement("div");t.innerHTML=g;var n=t.children[0],r=n.querySelector("canvas");return n.setAttribute("id","pageContainer"+e),n.setAttribute("data-page-number",e),r.mozOpaque=!0,r.setAttribute("id","page"+e),n}function u(e,t,n){var r=n.documentId,a=n.pdfDocument,u=n.scale,o=n.rotate;return Promise.all([a.getPage(e)]).then(function(n){var a=c(n,1),d=a[0],s=document.getElementById("pageContainer"+e),l=s.querySelector(".annotationLayer"),p=s.querySelector(".canvasWrapper canvas"),g=p.getContext("2d",{alpha:!1}),m=d.getViewport(u,o),v=i(e,m,g);return Promise.all([d.render({canvasContext:g,viewport:m,transform:v}),f["default"].render(l,m,{pageNumber:e,documentId:r,annotations:t[e]})]).then(function(){return d.getTextContent({normalizeWhitespace:!0}).then(function(n){return new Promise(function(r,a){var u=s.querySelector(".textLayer"),i=new pdfjsViewer.DefaultTextLayerFactory,o=i.createTextLayerBuilder(u,e-1,m);o.setTextContent(n),o.render(),setTimeout(function(){try{(0,h["default"])(t.annotations),r()}catch(e){a(e)}})})})}).then(function(){return s.setAttribute("data-loaded","true"),[d,t]})})}function i(e,t,n){var r=document.getElementById("pageContainer"+e),a=r.querySelector(".canvasWrapper canvas"),u=r.querySelector(".annotationLayer"),i=r.querySelector(".canvasWrapper"),c=r.querySelector(".textLayer"),l=d(n),f=l.scaled?[l.sx,0,0,l.sy,0,0]:null,p=o(l.sx),h=o(l.sy);return r.style.visibility="",a.width=s(t.width*l.sx,p[0]),a.height=s(t.height*l.sy,h[0]),a.style.width=s(t.width,p[1])+"px",a.style.height=s(t.height,p[1])+"px",u.setAttribute("width",t.width),u.setAttribute("height",t.height),u.style.width=t.width+"px",u.style.height=t.height+"px",r.style.width=t.width+"px",r.style.height=t.height+"px",i.style.width=t.width+"px",i.style.height=t.height+"px",c.style.width=t.width+"px",c.style.height=t.height+"px",f}function o(e){if(Math.floor(e)===e)return[e,1];var t=1/e,n=8;if(t>n)return[1,n];if(Math.floor(t)===t)return[1,t];for(var r=e>1?t:e,a=0,u=1,i=1,o=1;;){var d=a+i,s=u+o;if(s>n)break;r<=d/s?(i=d,o=s):(a=d,u=s)}return r-a/u