From 35a41e63ebd5f6cf9d17419c150eb53a005d2e87 Mon Sep 17 00:00:00 2001 From: Max Magorsch Date: Sat, 18 Apr 2020 02:38:35 +0200 Subject: Add the initial version of the rewritten glsamaker The glsamaker has been completly rewritten in go. It is using postgres instead of mysql now. The look and feel is based on tyrian. Signed-off-by: Max Magorsch --- .gitignore | 26 +- .gitlab-ci.yml | 32 + .rubocop.yml | 27 - .rubocop_todo.yml | 1369 - .travis.yml | 29 - Capfile | 4 - Dockerfile | 26 + Dockerfile.dev | 10 + Gemfile | 60 - Gemfile.lock | 206 - LICENSE | 661 - README | 243 - Rakefile | 12 - app/assets/images/biglogo.png | Bin 23122 -> 0 bytes app/assets/images/cvetool-logo.png | Bin 5036 -> 0 bytes app/assets/images/icons/access.png | Bin 729 -> 0 bytes app/assets/images/icons/admin.png | Bin 584 -> 0 bytes app/assets/images/icons/affected.png | Bin 768 -> 0 bytes app/assets/images/icons/approval.png | Bin 754 -> 0 bytes app/assets/images/icons/approved.png | Bin 724 -> 0 bytes app/assets/images/icons/arch.png | Bin 740 -> 0 bytes app/assets/images/icons/atom.png | Bin 760 -> 0 bytes app/assets/images/icons/auto.png | Bin 652 -> 0 bytes app/assets/images/icons/background-go.png | Bin 558 -> 0 bytes app/assets/images/icons/background.png | Bin 371 -> 0 bytes app/assets/images/icons/bug-grey.png | Bin 1444 -> 0 bytes app/assets/images/icons/bug.png | Bin 704 -> 0 bytes app/assets/images/icons/bug_add.png | Bin 773 -> 0 bytes app/assets/images/icons/bug_new.png | Bin 817 -> 0 bytes app/assets/images/icons/calendar-select-month.png | Bin 627 -> 0 bytes app/assets/images/icons/checkboxes.png | Bin 512 -> 0 bytes app/assets/images/icons/close.png | Bin 321 -> 0 bytes app/assets/images/icons/comment.png | Bin 413 -> 0 bytes app/assets/images/icons/commented.png | Bin 744 -> 0 bytes app/assets/images/icons/confidential.png | Bin 778 -> 0 bytes app/assets/images/icons/delete.png | Bin 663 -> 0 bytes app/assets/images/icons/diff.png | Bin 616 -> 0 bytes app/assets/images/icons/dock-right.png | Bin 622 -> 0 bytes app/assets/images/icons/document-go.png | Bin 613 -> 0 bytes app/assets/images/icons/document.png | Bin 485 -> 0 bytes app/assets/images/icons/draft.png | Bin 805 -> 0 bytes app/assets/images/icons/edit-small.png | Bin 384 -> 0 bytes app/assets/images/icons/edit.png | Bin 450 -> 0 bytes app/assets/images/icons/error.png | Bin 874 -> 0 bytes app/assets/images/icons/flag-green.png | Bin 777 -> 0 bytes app/assets/images/icons/flag.png | Bin 728 -> 0 bytes app/assets/images/icons/glsa.png | Bin 649 -> 0 bytes app/assets/images/icons/glsa_draft.png | Bin 762 -> 0 bytes app/assets/images/icons/glsa_new.png | Bin 714 -> 0 bytes app/assets/images/icons/glsa_ready.png | Bin 812 -> 0 bytes app/assets/images/icons/glsa_request.png | Bin 756 -> 0 bytes app/assets/images/icons/glsa_sent.png | Bin 760 -> 0 bytes app/assets/images/icons/impact.png | Bin 742 -> 0 bytes app/assets/images/icons/info.png | Bin 723 -> 0 bytes app/assets/images/icons/keyword.png | Bin 730 -> 0 bytes app/assets/images/icons/larr.png | Bin 539 -> 0 bytes app/assets/images/icons/less_width.png | Bin 391 -> 0 bytes app/assets/images/icons/logout.png | Bin 688 -> 0 bytes app/assets/images/icons/metadata.png | Bin 470 -> 0 bytes app/assets/images/icons/minus-small.png | Bin 908 -> 0 bytes app/assets/images/icons/minus.png | Bin 259 -> 0 bytes app/assets/images/icons/more_width.png | Bin 440 -> 0 bytes app/assets/images/icons/next.png | Bin 658 -> 0 bytes app/assets/images/icons/not-approved.png | Bin 729 -> 0 bytes app/assets/images/icons/note.png | Bin 435 -> 0 bytes app/assets/images/icons/ok.png | Bin 744 -> 0 bytes app/assets/images/icons/package-add.png | Bin 634 -> 0 bytes app/assets/images/icons/package-go.png | Bin 656 -> 0 bytes app/assets/images/icons/package-remove.png | Bin 554 -> 0 bytes app/assets/images/icons/package.png | Bin 524 -> 0 bytes app/assets/images/icons/paste.png | Bin 605 -> 0 bytes app/assets/images/icons/pending.png | Bin 748 -> 0 bytes app/assets/images/icons/permission.png | Bin 612 -> 0 bytes app/assets/images/icons/plus-small.png | Bin 992 -> 0 bytes app/assets/images/icons/plus.png | Bin 476 -> 0 bytes app/assets/images/icons/profile.png | Bin 533 -> 0 bytes app/assets/images/icons/public.png | Bin 687 -> 0 bytes app/assets/images/icons/reference-add.png | Bin 630 -> 0 bytes app/assets/images/icons/reference-remove.png | Bin 585 -> 0 bytes app/assets/images/icons/reference.png | Bin 537 -> 0 bytes app/assets/images/icons/refresh.png | Bin 835 -> 0 bytes app/assets/images/icons/rejection.png | Bin 866 -> 0 bytes app/assets/images/icons/request.png | Bin 703 -> 0 bytes app/assets/images/icons/resolution-go.png | Bin 845 -> 0 bytes app/assets/images/icons/resolution.png | Bin 687 -> 0 bytes app/assets/images/icons/restricted.png | Bin 501 -> 0 bytes app/assets/images/icons/sent.png | Bin 640 -> 0 bytes app/assets/images/icons/severity.png | Bin 621 -> 0 bytes app/assets/images/icons/stamp.png | Bin 621 -> 0 bytes app/assets/images/icons/status-green.png | Bin 433 -> 0 bytes app/assets/images/icons/status-grey.png | Bin 448 -> 0 bytes app/assets/images/icons/status-red.png | Bin 439 -> 0 bytes app/assets/images/icons/status-yellow.png | Bin 457 -> 0 bytes app/assets/images/icons/switch.png | Bin 541 -> 0 bytes app/assets/images/icons/synopsis.png | Bin 522 -> 0 bytes app/assets/images/icons/template.png | Bin 630 -> 0 bytes app/assets/images/icons/time.png | Bin 854 -> 0 bytes app/assets/images/icons/title.png | Bin 534 -> 0 bytes app/assets/images/icons/toolbox.png | Bin 501 -> 0 bytes app/assets/images/icons/txt.png | Bin 592 -> 0 bytes app/assets/images/icons/unaffected.png | Bin 801 -> 0 bytes app/assets/images/icons/user.png | Bin 511 -> 0 bytes app/assets/images/icons/user_add.png | Bin 746 -> 0 bytes app/assets/images/icons/warning.png | Bin 666 -> 0 bytes app/assets/images/icons/workaround-no.png | Bin 789 -> 0 bytes app/assets/images/icons/workaround.png | Bin 778 -> 0 bytes app/assets/images/icons/xml.png | Bin 630 -> 0 bytes app/assets/images/icons/zoom_100.png | Bin 772 -> 0 bytes app/assets/images/icons/zoom_in.png | Bin 765 -> 0 bytes app/assets/images/icons/zoom_out.png | Bin 742 -> 0 bytes app/assets/images/intel-editor.png | Bin 1316 -> 0 bytes app/assets/images/line.png | Bin 42782 -> 0 bytes app/assets/images/login-bg.png | Bin 32753 -> 0 bytes app/assets/images/logo.png | Bin 10091 -> 0 bytes app/assets/images/menu-left.png | Bin 1314 -> 0 bytes app/assets/images/menu-right.png | Bin 1398 -> 0 bytes app/assets/images/menubg.png | Bin 1412 -> 0 bytes app/assets/images/rails.png | Bin 6646 -> 0 bytes app/assets/images/separator.png | Bin 212 -> 0 bytes app/assets/images/spinner.gif | Bin 7823 -> 0 bytes app/assets/javascripts/application.js | 14 - app/assets/javascripts/glsamaker.js.erb | 151 - app/assets/javascripts/glsamaker_edit.js | 181 - app/assets/javascripts/glsamaker_misc.js | 102 - app/assets/javascripts/jsui.js | 8 - app/assets/javascripts/modalbox.js | 593 - app/assets/javascripts/searchable.js | 71 - app/assets/javascripts/uki-more.js | 827 - app/assets/javascripts/uki.js | 8022 --- app/assets/stylesheets/admin.css | 54 - app/assets/stylesheets/application.css | 10 - app/assets/stylesheets/cve.css | 23 - app/assets/stylesheets/login.css | 91 - app/assets/stylesheets/modalbox.css | 122 - app/assets/stylesheets/screen.css.erb | 662 - app/controllers/admin/index_controller.rb | 6 - app/controllers/admin/templates_controller.rb | 85 - app/controllers/admin/users_controller.rb | 71 - app/controllers/application_controller.rb | 32 - app/controllers/bug_controller.rb | 39 - app/controllers/bugs_controller.rb | 59 - app/controllers/comments_controller.rb | 76 - app/controllers/cve_controller.rb | 323 - app/controllers/glsa_controller.rb | 562 - app/controllers/index_controller.rb | 65 - app/controllers/search_controller.rb | 37 - app/controllers/tools_controller.rb | 86 - app/helpers/admin/index_helper.rb | 2 - app/helpers/admin/templates_helper.rb | 6 - app/helpers/admin/users_helper.rb | 18 - app/helpers/application_helper.rb | 168 - app/helpers/bug_helper.rb | 8 - app/helpers/bugs_helper.rb | 2 - app/helpers/comments_helper.rb | 2 - app/helpers/cve_helper.rb | 14 - app/helpers/glsa_helper.rb | 200 - app/helpers/index_helper.rb | 14 - app/helpers/search_helper.rb | 2 - app/helpers/tools_helper.rb | 14 - app/indices/indices.rb | 34 - app/mailers/.gitkeep | 0 app/mailers/glsa_mailer.rb | 45 - app/models/.gitkeep | 0 app/models/bug.rb | 46 - app/models/comment.rb | 44 - app/models/cpe.rb | 29 - app/models/cve.rb | 177 - app/models/cve_assignment.rb | 3 - app/models/cve_change.rb | 4 - app/models/cve_comment.rb | 4 - app/models/cve_reference.rb | 3 - app/models/glsa.rb | 311 - app/models/package.rb | 48 - app/models/reference.rb | 15 - app/models/revision.rb | 103 - app/models/template.rb | 2 - app/models/user.rb | 65 - app/views/admin/index/index.html.erb | 6 - app/views/admin/templates/_form.html.erb | 35 - app/views/admin/templates/edit.html.erb | 8 - app/views/admin/templates/index.html.erb | 23 - app/views/admin/templates/new.html.erb | 7 - app/views/admin/templates/show.html.erb | 26 - app/views/admin/users/_user.html.erb | 9 - app/views/admin/users/create.html.erb | 2 - app/views/admin/users/destroy.html.erb | 2 - app/views/admin/users/edit.html.erb | 50 - app/views/admin/users/index.html.erb | 19 - app/views/admin/users/new.html.erb | 47 - app/views/admin/users/show.html.erb | 34 - app/views/admin/users/update.html.erb | 2 - app/views/bug/bug.html.erb | 58 - app/views/bug/history.html.erb | 43 - app/views/bugs/create.html.erb | 2 - app/views/bugs/create.js.erb | 6 - app/views/bugs/destroy.html.erb | 2 - app/views/bugs/new.html.erb | 34 - app/views/bugs/show.html.erb | 2 - app/views/comments/create.js.erb | 10 - app/views/comments/destroy.html.erb | 2 - app/views/comments/new.html.erb | 25 - app/views/comments/show.html.erb | 2 - app/views/cve/_assigning.js.erb | 94 - app/views/cve/_filing.js.erb | 170 - app/views/cve/_invalidate.js.erb | 71 - app/views/cve/_key_events.js.erb | 71 - app/views/cve/_later.js.erb | 65 - app/views/cve/_new.js.erb | 75 - app/views/cve/_nfu.js.erb | 65 - app/views/cve/_toolbar.js.erb | 54 - app/views/cve/_ui_misc.js.erb | 115 - app/views/cve/actions.html.erb | 5 - app/views/cve/assign_preview.html.erb | 17 - app/views/cve/bug_preview.html.erb | 81 - app/views/cve/changes.html.erb | 10 - app/views/cve/comments.html.erb | 10 - app/views/cve/general_info.html.erb | 11 - app/views/cve/index.html.erb | 0 app/views/cve/info.html.erb | 140 - app/views/cve/info.json.jbuilder | 5 - app/views/cve/list.html.erb | 135 - app/views/cve/new_preview.html.erb | 7 - app/views/cve/packages.html.erb | 22 - app/views/cve/references.html.erb | 10 - app/views/glsa/_approval_row.erb | 5 - app/views/glsa/_close_msg.txt.erb | 3 - app/views/glsa/_comment.html.erb | 27 - app/views/glsa/_comments.html.erb | 11 - app/views/glsa/_edit_bug_row.html.erb | 13 - app/views/glsa/_email_headers.txt.erb | 3 - app/views/glsa/_glsa.xml.builder | 74 - app/views/glsa/_glsa_row.html.erb | 31 - app/views/glsa/_package.html.erb | 16 - app/views/glsa/_reference.html.erb | 10 - app/views/glsa/_show_bug_row.html.erb | 7 - app/views/glsa/_show_package_row.txt.erb | 49 - app/views/glsa/_show_reference.txt.erb | 2 - app/views/glsa/_status_legend.html.erb | 38 - app/views/glsa/_template_popups.html.erb | 8 - app/views/glsa/archive.html.erb | 26 - app/views/glsa/archive.js.erb | 2 - app/views/glsa/comment.html.erb | 2 - app/views/glsa/create.html.erb | 2 - app/views/glsa/destroy.html.erb | 2 - app/views/glsa/diff.html.erb | 19 - app/views/glsa/drafts.html.erb | 16 - app/views/glsa/edit.html.erb | 177 - app/views/glsa/finalize_release.html.erb | 29 - app/views/glsa/import_references.html.erb | 16 - app/views/glsa/new-draft.html.erb | 1 - app/views/glsa/new-request.html.erb | 60 - app/views/glsa/new.html.erb | 11 - app/views/glsa/prepare_release.html.erb | 112 - app/views/glsa/release.html.erb | 31 - app/views/glsa/requests.html.erb | 16 - app/views/glsa/show.html.erb | 158 - app/views/glsa/show.txt.erb | 116 - app/views/glsa/show.xml.erb | 1 - app/views/glsa/update.html.erb | 2 - app/views/glsa_mailer/approval.text.erb | 23 - app/views/glsa_mailer/comment.text.erb | 8 - app/views/glsa_mailer/edit.text.erb | 8 - app/views/glsa_mailer/new_request.text.erb | 13 - app/views/glsa_mailer/text.text.erb | 4 - app/views/index/about.html.erb | 29 - app/views/index/error-access.html.erb | 7 - app/views/index/error-disabled.html.erb | 5 - app/views/index/error-system.html.erb | 8 - app/views/index/error-user.html.erb | 7 - app/views/index/index.html.erb | 18 - app/views/index/profile.html.erb | 34 - app/views/layouts/application.html.erb | 96 - app/views/layouts/cve.html.erb | 16 - app/views/layouts/none.html.erb | 1 - app/views/layouts/notice.html.erb | 24 - app/views/search/_cve_row.html.erb | 6 - app/views/search/_cves.html.erb | 13 - app/views/search/_glsas.html.erb | 14 - app/views/search/results.html.erb | 19 - app/views/tools/_cve.html.erb | 4 - app/views/tools/ajaxbugs.html.erb | 10 - app/views/tools/ajaxdescr.html.erb | 3 - app/views/tools/background.html.erb | 3 - app/views/tools/template.js.erb | 7 - assets/.keep | 0 bin/.keep | 0 bin/bundle | 3 - bin/rails | 4 - bin/rake | 4 - bin/setup | 29 - config.ru | 4 - config/application.rb | 38 - config/boot.rb | 3 - config/database.yml.mysql | 42 - config/deploy.rb | 37 - config/environment.rb | 9 - config/environments/development.rb | 41 - config/environments/production.rb | 83 - config/environments/test.rb | 42 - config/initializers/assets.rb | 11 - config/initializers/backtrace_silencers.rb | 7 - config/initializers/cookies_serializer.rb | 3 - config/initializers/filter_parameter_logging.rb | 4 - config/initializers/glsamaker-global.rb | 2 - config/initializers/glsamaker.rb.sample | 48 - config/initializers/glsamaker_constants.rb | 1 - config/initializers/inflections.rb | 20 - config/initializers/mime_types.rb | 7 - config/initializers/session_store.rb | 3 - config/initializers/time_formats.rb | 1 - config/initializers/wrap_parameters.rb | 14 - config/locales/en.yml | 23 - config/routes.rb | 96 - config/secrets.yml | 22 - config/thinking_sphinx.yml | 9 - db/migrate/20090314092539_create_users.rb | 21 - db/migrate/20090314191650_create_glsas.rb | 22 - .../20090314194257_add_glsa_user_constraints.rb | 13 - db/migrate/20090314194659_create_revisions.rb | 32 - db/migrate/20090314230516_create_references.rb | 18 - db/migrate/20090315105049_create_bugs.rb | 19 - ...15105326_add_references_revisions_constraint.rb | 9 - db/migrate/20090315110025_create_comments.rb | 18 - .../20090315110119_add_comment_constraints.rb | 11 - .../20090410212514_add_user_id_to_revisions.rb | 9 - ...90410212600_add_revisions_user_id_constraint.rb | 9 - db/migrate/20090419140216_create_sessions.rb | 16 - .../20090501114107_add_status_cache_to_bugs.rb | 11 - ...20100511192546_change_comment_type_to_rating.rb | 9 - db/migrate/20100513183324_create_packages.rb | 21 - db/migrate/20100813183543_create_cves.rb | 19 - db/migrate/20100814103856_create_cve_references.rb | 19 - db/migrate/20100814105152_create_cve_comments.rb | 21 - db/migrate/20100814105345_create_cve_changes.rb | 20 - db/migrate/20100814142647_create_cpes.rb | 27 - .../20100902093457_create_cve_assignments.rb | 23 - db/migrate/20100918223549_add_system_user.rb | 12 - ...20110226204724_add_release_flag_to_revisions.rb | 11 - db/migrate/20110827143514_create_templates.rb | 12 - ...0110829174909_add_first_release_date_to_glsa.rb | 5 - db/migrate/20170418102638_add_slots_to_packages.rb | 11 - db/schema.rb | 239 - db/seeds.rb | 7 - doc/README_FOR_APP | 29 - doc/app/Admin.html | 278 - doc/app/Admin/IndexController.html | 317 - doc/app/Admin/IndexHelper.html | 261 - doc/app/Admin/TemplatesController.html | 569 - doc/app/Admin/TemplatesHelper.html | 310 - doc/app/Admin/UsersController.html | 568 - doc/app/Admin/UsersHelper.html | 354 - doc/app/ApplicationController.html | 344 - doc/app/ApplicationHelper.html | 661 - doc/app/Authentication.html | 464 - doc/app/Authorization.html | 435 - doc/app/Bug.html | 423 - doc/app/BugController.html | 383 - doc/app/BugHelper.html | 311 - doc/app/BugsController.html | 449 - doc/app/BugsHelper.html | 261 - doc/app/Bugzilla.html | 619 - doc/app/Bugzilla/Bug.html | 859 - doc/app/Bugzilla/Bugzilla.html | 268 - doc/app/Bugzilla/Bugzilla/Bugzilla.html | 268 - doc/app/Bugzilla/Bugzilla/Bugzilla/Change.html | 461 - doc/app/Bugzilla/Comment.html | 372 - doc/app/Bugzilla/History.html | 470 - doc/app/Comment.html | 293 - doc/app/Comment/CommentValidator.html | 328 - doc/app/CommentsController.html | 459 - doc/app/CommentsHelper.html | 261 - doc/app/Cpe.html | 434 - doc/app/Cve.html | 821 - doc/app/CveAssignment.html | 269 - doc/app/CveChange.html | 269 - doc/app/CveComment.html | 269 - doc/app/CveController.html | 1175 - doc/app/CveHelper.html | 318 - doc/app/CveReference.html | 269 - doc/app/GLSAReleaseError.html | 269 - doc/app/Glsa.html | 1086 - doc/app/GlsaController.html | 1231 - doc/app/GlsaHelper.html | 876 - doc/app/GlsaMailer.html | 440 - doc/app/Glsamaker.html | 388 - doc/app/Glsamaker/Bugs.html | 279 - doc/app/Glsamaker/Bugs/ArchesMixin.html | 310 - doc/app/Glsamaker/Bugs/Bug.html | 376 - doc/app/Glsamaker/Bugs/BugReadyMixin.html | 317 - doc/app/Glsamaker/Bugs/Status.html | 580 - doc/app/Glsamaker/Bugs/StatusMixin.html | 320 - doc/app/Glsamaker/Diff.html | 338 - doc/app/Glsamaker/HTTP.html | 323 - doc/app/Glsamaker/Helper.html | 285 - doc/app/Glsamaker/Mail.html | 498 - doc/app/Glsamaker/Portage.html | 567 - doc/app/Glsamaker/Portage/Description.html | 436 - doc/app/Glsamaker/XML.html | 323 - doc/app/IndexController.html | 487 - doc/app/IndexHelper.html | 263 - doc/app/Package.html | 332 - doc/app/Reference.html | 271 - doc/app/Revision.html | 524 - doc/app/SearchController.html | 378 - doc/app/SearchHelper.html | 261 - doc/app/String.html | 435 - doc/app/Template.html | 269 - doc/app/ToolsController.html | 448 - doc/app/ToolsHelper.html | 263 - doc/app/User.html | 444 - .../app/controllers/admin/index_controller_rb.html | 52 - .../controllers/admin/templates_controller_rb.html | 52 - .../app/controllers/admin/users_controller_rb.html | 52 - .../app/controllers/application_controller_rb.html | 64 - doc/app/app/controllers/bug_controller_rb.html | 64 - doc/app/app/controllers/bugs_controller_rb.html | 63 - .../app/controllers/comments_controller_rb.html | 63 - doc/app/app/controllers/cve_controller_rb.html | 52 - doc/app/app/controllers/glsa_controller_rb.html | 64 - doc/app/app/controllers/index_controller_rb.html | 64 - doc/app/app/controllers/search_controller_rb.html | 52 - doc/app/app/controllers/tools_controller_rb.html | 64 - doc/app/app/helpers/admin/index_helper_rb.html | 52 - doc/app/app/helpers/admin/templates_helper_rb.html | 52 - doc/app/app/helpers/admin/users_helper_rb.html | 52 - doc/app/app/helpers/application_helper_rb.html | 65 - doc/app/app/helpers/bug_helper_rb.html | 52 - doc/app/app/helpers/bugs_helper_rb.html | 52 - doc/app/app/helpers/comments_helper_rb.html | 52 - doc/app/app/helpers/cve_helper_rb.html | 52 - doc/app/app/helpers/glsa_helper_rb.html | 64 - doc/app/app/helpers/index_helper_rb.html | 64 - doc/app/app/helpers/search_helper_rb.html | 52 - doc/app/app/helpers/tools_helper_rb.html | 64 - doc/app/app/mailers/glsa_mailer_rb.html | 52 - doc/app/app/models/bug_rb.html | 64 - doc/app/app/models/comment_rb.html | 64 - doc/app/app/models/cpe_rb.html | 63 - doc/app/app/models/cve_assignment_rb.html | 52 - doc/app/app/models/cve_change_rb.html | 52 - doc/app/app/models/cve_comment_rb.html | 52 - doc/app/app/models/cve_rb.html | 65 - doc/app/app/models/cve_reference_rb.html | 52 - doc/app/app/models/glsa_rb.html | 64 - doc/app/app/models/package_rb.html | 64 - doc/app/app/models/reference_rb.html | 64 - doc/app/app/models/revision_rb.html | 66 - doc/app/app/models/template_rb.html | 52 - doc/app/app/models/user_rb.html | 64 - doc/app/created.rid | 56 - doc/app/doc/README_FOR_APP.html | 260 - doc/app/images/brick.png | Bin 452 -> 0 bytes doc/app/images/brick_link.png | Bin 764 -> 0 bytes doc/app/images/bug.png | Bin 774 -> 0 bytes doc/app/images/bullet_black.png | Bin 211 -> 0 bytes doc/app/images/bullet_toggle_minus.png | Bin 207 -> 0 bytes doc/app/images/bullet_toggle_plus.png | Bin 209 -> 0 bytes doc/app/images/date.png | Bin 626 -> 0 bytes doc/app/images/find.png | Bin 659 -> 0 bytes doc/app/images/loadingAnimation.gif | Bin 5886 -> 0 bytes doc/app/images/macFFBgHack.png | Bin 207 -> 0 bytes doc/app/images/package.png | Bin 853 -> 0 bytes doc/app/images/page_green.png | Bin 621 -> 0 bytes doc/app/images/page_white_text.png | Bin 342 -> 0 bytes doc/app/images/page_white_width.png | Bin 309 -> 0 bytes doc/app/images/plugin.png | Bin 591 -> 0 bytes doc/app/images/ruby.png | Bin 592 -> 0 bytes doc/app/images/tag_green.png | Bin 613 -> 0 bytes doc/app/images/wrench.png | Bin 610 -> 0 bytes doc/app/images/wrench_orange.png | Bin 584 -> 0 bytes doc/app/images/zoom.png | Bin 692 -> 0 bytes doc/app/index.html | 612 - doc/app/js/darkfish.js | 116 - doc/app/js/jquery.js | 32 - doc/app/js/quicksearch.js | 114 - doc/app/js/thickbox-compressed.js | 10 - doc/app/lib/authentication_rb.html | 64 - doc/app/lib/authorization_rb.html | 63 - doc/app/lib/bugzilla/bug_rb.html | 63 - doc/app/lib/bugzilla/comment_rb.html | 63 - doc/app/lib/bugzilla/history_rb.html | 54 - doc/app/lib/bugzilla_rb.html | 72 - doc/app/lib/glsamaker/bugs_rb.html | 66 - doc/app/lib/glsamaker/diff_rb.html | 69 - doc/app/lib/glsamaker/helpers_rb.html | 63 - doc/app/lib/glsamaker/http_rb.html | 68 - doc/app/lib/glsamaker/mail_rb.html | 63 - doc/app/lib/glsamaker/portage_rb.html | 66 - doc/app/lib/glsamaker/xml_rb.html | 63 - doc/app/lib/glsamaker_rb.html | 76 - doc/app/lib/tasks/utils_rb.html | 64 - doc/app/rdoc.css | 763 - doc/diagrams/models.dot | 18 - doc/diagrams/models.png | Bin 112432 -> 0 bytes docker-compose.override.yml | 60 + docker-compose.yml | 55 + glsamaker.go | 60 + go.mod | 13 + go.sum | 739 + lib/assets/.gitkeep | 0 lib/authentication.rb | 111 - lib/authorization.rb | 49 - lib/bugzilla.rb | 195 - lib/bugzilla/bug.rb | 143 - lib/bugzilla/comment.rb | 22 - lib/bugzilla/history.rb | 104 - lib/glsamaker.rb | 23 - lib/glsamaker/bugs.rb | 182 - lib/glsamaker/diff.rb | 53 - lib/glsamaker/helpers.rb | 21 - lib/glsamaker/http.rb | 37 - lib/glsamaker/mail.rb | 106 - lib/glsamaker/portage.rb | 194 - lib/glsamaker/spelling.rb | 48 - lib/glsamaker/xml.rb | 31 - lib/kramdown_ext.rb | 20 - lib/tasks/.gitkeep | 0 lib/tasks/cve.rake | 366 - lib/tasks/import.rake | 256 - lib/tasks/rcov.rake | 81 - lib/tasks/utils.rb | 35 - package-lock.json | 8682 +++ package.json | 41 + pkg/app/handler/about/index.go | 28 + pkg/app/handler/about/utils.go | 58 + pkg/app/handler/account/password.go | 109 + pkg/app/handler/account/twofactor.go | 200 + pkg/app/handler/admin/edit.go | 293 + pkg/app/handler/admin/index.go | 27 + pkg/app/handler/admin/passwordreset.go | 73 + pkg/app/handler/admin/utils.go | 112 + pkg/app/handler/all/index.go | 40 + pkg/app/handler/all/utils.go | 36 + pkg/app/handler/archive/index.go | 44 + pkg/app/handler/archive/utils.go | 36 + pkg/app/handler/authentication/accessDenied.go | 10 + .../authentication/auth_session/authsession.go | 177 + pkg/app/handler/authentication/login.go | 100 + pkg/app/handler/authentication/logout.go | 29 + pkg/app/handler/authentication/templates/admin.go | 36 + pkg/app/handler/authentication/templates/login.go | 32 + pkg/app/handler/authentication/templates/totp.go | 23 + .../handler/authentication/templates/webauthn.go | 23 + pkg/app/handler/authentication/totp/totp.go | 60 + pkg/app/handler/authentication/utils/utils.go | 81 + pkg/app/handler/authentication/webauthn/login.go | 118 + .../handler/authentication/webauthn/register.go | 111 + pkg/app/handler/cvetool/bug.go | 85 + pkg/app/handler/cvetool/comments.go | 74 + pkg/app/handler/cvetool/index.go | 169 + pkg/app/handler/cvetool/state.go | 75 + pkg/app/handler/cvetool/update.go | 23 + pkg/app/handler/cvetool/utils.go | 47 + pkg/app/handler/dashboard/index.go | 58 + pkg/app/handler/dashboard/utils.go | 44 + pkg/app/handler/drafts/index.go | 44 + pkg/app/handler/drafts/utils.go | 37 + pkg/app/handler/glsa/bugs.go | 63 + pkg/app/handler/glsa/comments.go | 110 + pkg/app/handler/glsa/delete.go | 42 + pkg/app/handler/glsa/edit.go | 185 + pkg/app/handler/glsa/release.go | 70 + pkg/app/handler/glsa/utils.go | 79 + pkg/app/handler/glsa/view.go | 48 + pkg/app/handler/home/index.go | 16 + pkg/app/handler/home/utils.go | 34 + pkg/app/handler/newRequest/index.go | 186 + pkg/app/handler/newRequest/utils.go | 36 + pkg/app/handler/requests/index.go | 44 + pkg/app/handler/requests/utils.go | 36 + pkg/app/handler/search/index.go | 126 + pkg/app/handler/search/utils.go | 38 + pkg/app/handler/statistics/index.go | 42 + pkg/app/handler/statistics/utils.go | 48 + pkg/app/serve.go | 214 + pkg/app/utils.go | 89 + pkg/config/config.go | 63 + pkg/cveimport/update.go | 96 + pkg/database/connection/connection.go | 42 + pkg/database/init.go | 23 + pkg/database/schema/create.go | 36 + pkg/logger/loggers.go | 39 + pkg/models/application.go | 69 + pkg/models/bugzilla/bugs.go | 156 + pkg/models/cve/cve.go | 86 + pkg/models/cve/cvss.go | 62 + pkg/models/cve/feed.go | 116 + pkg/models/glsa.go | 115 + pkg/models/gpackage/package.go | 11 + pkg/models/session.go | 15 + pkg/models/users/user.go | 214 + public/404.html | 30 - public/422.html | 26 - public/500.html | 29 - public/error-404.png | Bin 18691 -> 0 bytes public/error-500.png | Bin 7810 -> 0 bytes public/favicon.ico | 0 public/robots.txt | 5 - public/xsl/ads.xsl | 103 - public/xsl/content.xsl | 35 - public/xsl/devmap.xsl | 86 - public/xsl/doc-struct.xsl | 185 - public/xsl/glsa.xsl | 412 - public/xsl/guide.xsl | 2015 - public/xsl/handbook.xsl | 323 - public/xsl/inserts.xsl | 401 - public/xsl/mail.xsl | 183 - public/xsl/menu.xsl | 57 - public/xsl/util.xsl | 62 - script/config_init | 44 - script/db-backup | 29 - script/rails | 6 - script/update-portage-cache | 14 - test/fixtures/.gitkeep | 0 test/fixtures/bugs.yml | 11 - test/fixtures/comments.yml | 13 - test/fixtures/cpes.yml | 7 - test/fixtures/cve_assignments.yml | 9 - test/fixtures/cve_changes.yml | 7 - test/fixtures/cve_comments.yml | 7 - test/fixtures/cve_references.yml | 7 - test/fixtures/cves.yml | 13 - test/fixtures/glsa_mailer/approval | 3 - test/fixtures/glsa_mailer/comment | 3 - test/fixtures/glsa_mailer/edit | 3 - test/fixtures/glsa_mailer/request | 3 - test/fixtures/glsa_mailer/sent | 3 - test/fixtures/glsas.yml | 24 - test/fixtures/packages.yml | 19 - test/fixtures/references.yml | 11 - test/fixtures/revisions.yml | 58 - test/fixtures/templates.yml | 13 - test/fixtures/users.yml | 49 - test/functional/.gitkeep | 0 test/functional/admin/index_controller_test.rb | 15 - test/functional/admin/templates_controller_test.rb | 56 - test/functional/admin/users_controller_test.rb | 15 - test/functional/bug_controller_test.rb | 8 - test/functional/bugs_controller_test.rb | 4 - test/functional/comments_controller_test.rb | 4 - test/functional/cve_controller_test.rb | 8 - test/functional/glsa_controller_test.rb | 83 - test/functional/glsa_mailer_test.rb | 7 - test/functional/index_controller_test.rb | 8 - test/functional/search_controller_test.rb | 7 - test/functional/tools_controller_test.rb | 8 - test/integration/.gitkeep | 0 test/integration/authentication_test.rb | 20 - test/test_helper.rb | 48 - test/unit/.gitkeep | 0 test/unit/bug_test.rb | 8 - test/unit/comment_test.rb | 54 - test/unit/cpe_test.rb | 8 - test/unit/cve_assignment_test.rb | 8 - test/unit/cve_change_test.rb | 8 - test/unit/cve_comment_test.rb | 8 - test/unit/cve_reference_test.rb | 8 - test/unit/cve_test.rb | 92 - test/unit/glsa_mailer_test.rb | 4 - test/unit/glsa_test.rb | 55 - test/unit/helpers/bug_helper_test.rb | 4 - test/unit/helpers/bugs_helper_test.rb | 4 - test/unit/helpers/comments_helper_test.rb | 4 - test/unit/helpers/cve_helper_test.rb | 4 - test/unit/helpers/glsa_helper_test.rb | 4 - test/unit/helpers/index_helper_test.rb | 4 - test/unit/helpers/search_helper_test.rb | 4 - test/unit/helpers/templates_helper_test.rb | 4 - test/unit/helpers/tools_helper_test.rb | 4 - test/unit/helpers/user_helper_test.rb | 4 - test/unit/package_test.rb | 8 - test/unit/reference_test.rb | 8 - test/unit/revision_test.rb | 47 - test/unit/template_test.rb | 7 - test/unit/user_test.rb | 47 - tmp/cache/.gitignore | 0 tmp/pids/.gitignore | 0 tmp/sessions/.gitignore | 0 tmp/sockets/.gitignore | 0 vendor/assets/stylesheets/.gitkeep | 0 vendor/dictionaries/README_en_US.txt | 278 - vendor/dictionaries/en_US.aff | 3107 -- vendor/dictionaries/en_US.dic | 52895 ------------------- vendor/plugins/.gitignore | 0 vendor/plugins/.gitkeep | 0 web/packs/account.js | 81 + web/packs/admin.js | 60 + web/packs/application.js | 69 + web/packs/edit.js | 235 + web/packs/glsa.js | 114 + web/packs/newglsa.js | 58 + web/packs/src/javascript/all.js | 37 + web/packs/src/javascript/archive.js | 42 + web/packs/src/javascript/cvetool.js | 535 + web/packs/src/javascript/drafts.js | 38 + web/packs/src/javascript/requests.js | 37 + web/packs/src/stylesheets/application.scss | 11 + web/packs/src/stylesheets/index.scss | 27 + web/packs/statistics.js | 15 + web/packs/stylesheets.js | 1 + web/templates/about/about.tmpl | 31 + web/templates/about/aboutCLI.tmpl | 30 + web/templates/about/aboutSearch.tmpl | 71 + web/templates/account/2fa.tmpl | 186 + web/templates/account/password/forcedchange.tmpl | 98 + web/templates/account/password/normalchange.tmpl | 45 + web/templates/account/password/password.tmpl | 5 + web/templates/admin/components/global.tmpl | 45 + web/templates/admin/components/permissions.tmpl | 424 + web/templates/admin/components/templates.tmpl | 10 + web/templates/admin/components/users.tmpl | 226 + web/templates/admin/edit/permissions.tmpl | 36 + web/templates/admin/edit/users.tmpl | 37 + web/templates/admin/passwordreset.tmpl | 35 + web/templates/admin/view.tmpl | 41 + web/templates/all/all.tmpl | 86 + web/templates/archive/archive.tmpl | 75 + web/templates/authentication/accessDenied.tmpl | 26 + web/templates/authentication/login.tmpl | 113 + web/templates/authentication/totp.tmpl | 94 + web/templates/authentication/webauthn.tmpl | 204 + web/templates/dashboard/dashboard.tmpl | 158 + web/templates/drafts/drafts.tmpl | 84 + web/templates/glsa/edit.tmpl | 768 + web/templates/glsa/show.tmpl | 495 + web/templates/home/home.tmpl | 166 + web/templates/index/show.tmpl | 85 + web/templates/index/showFullscreen.tmpl | 80 + web/templates/layout/footer.tmpl | 50 + web/templates/layout/head.tmpl | 12 + web/templates/layout/header.tmpl | 6 + web/templates/layout/sitetitle.tmpl | 37 + web/templates/layout/tyriannav.tmpl | 72 + web/templates/new/new.tmpl | 282 + web/templates/requests/requests.tmpl | 84 + web/templates/search/search.tmpl | 84 + web/templates/statistics/statistics.tmpl | 89 + webpack.config.js | 90 + 738 files changed, 20803 insertions(+), 117936 deletions(-) create mode 100644 .gitlab-ci.yml delete mode 100644 .rubocop.yml delete mode 100644 .rubocop_todo.yml delete mode 100644 .travis.yml delete mode 100644 Capfile create mode 100644 Dockerfile create mode 100644 Dockerfile.dev delete mode 100644 Gemfile delete mode 100644 Gemfile.lock delete mode 100644 LICENSE delete mode 100644 README delete mode 100644 Rakefile delete mode 100644 app/assets/images/biglogo.png delete mode 100644 app/assets/images/cvetool-logo.png delete mode 100755 app/assets/images/icons/access.png delete mode 100644 app/assets/images/icons/admin.png delete mode 100755 app/assets/images/icons/affected.png delete mode 100644 app/assets/images/icons/approval.png delete mode 100755 app/assets/images/icons/approved.png delete mode 100755 app/assets/images/icons/arch.png delete mode 100755 app/assets/images/icons/atom.png delete mode 100755 app/assets/images/icons/auto.png delete mode 100755 app/assets/images/icons/background-go.png delete mode 100755 app/assets/images/icons/background.png delete mode 100644 app/assets/images/icons/bug-grey.png delete mode 100755 app/assets/images/icons/bug.png delete mode 100755 app/assets/images/icons/bug_add.png delete mode 100755 app/assets/images/icons/bug_new.png delete mode 100644 app/assets/images/icons/calendar-select-month.png delete mode 100755 app/assets/images/icons/checkboxes.png delete mode 100644 app/assets/images/icons/close.png delete mode 100644 app/assets/images/icons/comment.png delete mode 100755 app/assets/images/icons/commented.png delete mode 100755 app/assets/images/icons/confidential.png delete mode 100755 app/assets/images/icons/delete.png delete mode 100644 app/assets/images/icons/diff.png delete mode 100644 app/assets/images/icons/dock-right.png delete mode 100755 app/assets/images/icons/document-go.png delete mode 100755 app/assets/images/icons/document.png delete mode 100755 app/assets/images/icons/draft.png delete mode 100755 app/assets/images/icons/edit-small.png delete mode 100644 app/assets/images/icons/edit.png delete mode 100644 app/assets/images/icons/error.png delete mode 100644 app/assets/images/icons/flag-green.png delete mode 100644 app/assets/images/icons/flag.png delete mode 100644 app/assets/images/icons/glsa.png delete mode 100644 app/assets/images/icons/glsa_draft.png delete mode 100644 app/assets/images/icons/glsa_new.png delete mode 100755 app/assets/images/icons/glsa_ready.png delete mode 100644 app/assets/images/icons/glsa_request.png delete mode 100644 app/assets/images/icons/glsa_sent.png delete mode 100644 app/assets/images/icons/impact.png delete mode 100644 app/assets/images/icons/info.png delete mode 100755 app/assets/images/icons/keyword.png delete mode 100644 app/assets/images/icons/larr.png delete mode 100755 app/assets/images/icons/less_width.png delete mode 100644 app/assets/images/icons/logout.png delete mode 100755 app/assets/images/icons/metadata.png delete mode 100644 app/assets/images/icons/minus-small.png delete mode 100644 app/assets/images/icons/minus.png delete mode 100755 app/assets/images/icons/more_width.png delete mode 100644 app/assets/images/icons/next.png delete mode 100755 app/assets/images/icons/not-approved.png delete mode 100755 app/assets/images/icons/note.png delete mode 100644 app/assets/images/icons/ok.png delete mode 100755 app/assets/images/icons/package-add.png delete mode 100755 app/assets/images/icons/package-go.png delete mode 100755 app/assets/images/icons/package-remove.png delete mode 100755 app/assets/images/icons/package.png delete mode 100644 app/assets/images/icons/paste.png delete mode 100644 app/assets/images/icons/pending.png delete mode 100644 app/assets/images/icons/permission.png delete mode 100644 app/assets/images/icons/plus-small.png delete mode 100644 app/assets/images/icons/plus.png delete mode 100644 app/assets/images/icons/profile.png delete mode 100755 app/assets/images/icons/public.png delete mode 100755 app/assets/images/icons/reference-add.png delete mode 100755 app/assets/images/icons/reference-remove.png delete mode 100755 app/assets/images/icons/reference.png delete mode 100755 app/assets/images/icons/refresh.png delete mode 100644 app/assets/images/icons/rejection.png delete mode 100755 app/assets/images/icons/request.png delete mode 100755 app/assets/images/icons/resolution-go.png delete mode 100755 app/assets/images/icons/resolution.png delete mode 100644 app/assets/images/icons/restricted.png delete mode 100755 app/assets/images/icons/sent.png delete mode 100644 app/assets/images/icons/severity.png delete mode 100755 app/assets/images/icons/stamp.png delete mode 100755 app/assets/images/icons/status-green.png delete mode 100755 app/assets/images/icons/status-grey.png delete mode 100755 app/assets/images/icons/status-red.png delete mode 100755 app/assets/images/icons/status-yellow.png delete mode 100755 app/assets/images/icons/switch.png delete mode 100755 app/assets/images/icons/synopsis.png delete mode 100644 app/assets/images/icons/template.png delete mode 100755 app/assets/images/icons/time.png delete mode 100755 app/assets/images/icons/title.png delete mode 100755 app/assets/images/icons/toolbox.png delete mode 100755 app/assets/images/icons/txt.png delete mode 100755 app/assets/images/icons/unaffected.png delete mode 100755 app/assets/images/icons/user.png delete mode 100644 app/assets/images/icons/user_add.png delete mode 100644 app/assets/images/icons/warning.png delete mode 100755 app/assets/images/icons/workaround-no.png delete mode 100755 app/assets/images/icons/workaround.png delete mode 100644 app/assets/images/icons/xml.png delete mode 100755 app/assets/images/icons/zoom_100.png delete mode 100755 app/assets/images/icons/zoom_in.png delete mode 100755 app/assets/images/icons/zoom_out.png delete mode 100644 app/assets/images/intel-editor.png delete mode 100644 app/assets/images/line.png delete mode 100644 app/assets/images/login-bg.png delete mode 100644 app/assets/images/logo.png delete mode 100644 app/assets/images/menu-left.png delete mode 100644 app/assets/images/menu-right.png delete mode 100644 app/assets/images/menubg.png delete mode 100644 app/assets/images/rails.png delete mode 100644 app/assets/images/separator.png delete mode 100644 app/assets/images/spinner.gif delete mode 100644 app/assets/javascripts/application.js delete mode 100644 app/assets/javascripts/glsamaker.js.erb delete mode 100644 app/assets/javascripts/glsamaker_edit.js delete mode 100644 app/assets/javascripts/glsamaker_misc.js delete mode 100644 app/assets/javascripts/jsui.js delete mode 100644 app/assets/javascripts/modalbox.js delete mode 100644 app/assets/javascripts/searchable.js delete mode 100644 app/assets/javascripts/uki-more.js delete mode 100644 app/assets/javascripts/uki.js delete mode 100644 app/assets/stylesheets/admin.css delete mode 100644 app/assets/stylesheets/application.css delete mode 100644 app/assets/stylesheets/cve.css delete mode 100644 app/assets/stylesheets/login.css delete mode 100644 app/assets/stylesheets/modalbox.css delete mode 100644 app/assets/stylesheets/screen.css.erb delete mode 100644 app/controllers/admin/index_controller.rb delete mode 100644 app/controllers/admin/templates_controller.rb delete mode 100644 app/controllers/admin/users_controller.rb delete mode 100644 app/controllers/application_controller.rb delete mode 100644 app/controllers/bug_controller.rb delete mode 100644 app/controllers/bugs_controller.rb delete mode 100644 app/controllers/comments_controller.rb delete mode 100644 app/controllers/cve_controller.rb delete mode 100644 app/controllers/glsa_controller.rb delete mode 100644 app/controllers/index_controller.rb delete mode 100644 app/controllers/search_controller.rb delete mode 100644 app/controllers/tools_controller.rb delete mode 100644 app/helpers/admin/index_helper.rb delete mode 100644 app/helpers/admin/templates_helper.rb delete mode 100644 app/helpers/admin/users_helper.rb delete mode 100644 app/helpers/application_helper.rb delete mode 100644 app/helpers/bug_helper.rb delete mode 100644 app/helpers/bugs_helper.rb delete mode 100644 app/helpers/comments_helper.rb delete mode 100644 app/helpers/cve_helper.rb delete mode 100644 app/helpers/glsa_helper.rb delete mode 100644 app/helpers/index_helper.rb delete mode 100644 app/helpers/search_helper.rb delete mode 100644 app/helpers/tools_helper.rb delete mode 100644 app/indices/indices.rb delete mode 100644 app/mailers/.gitkeep delete mode 100644 app/mailers/glsa_mailer.rb delete mode 100644 app/models/.gitkeep delete mode 100644 app/models/bug.rb delete mode 100644 app/models/comment.rb delete mode 100644 app/models/cpe.rb delete mode 100644 app/models/cve.rb delete mode 100644 app/models/cve_assignment.rb delete mode 100644 app/models/cve_change.rb delete mode 100644 app/models/cve_comment.rb delete mode 100644 app/models/cve_reference.rb delete mode 100644 app/models/glsa.rb delete mode 100644 app/models/package.rb delete mode 100644 app/models/reference.rb delete mode 100644 app/models/revision.rb delete mode 100644 app/models/template.rb delete mode 100644 app/models/user.rb delete mode 100644 app/views/admin/index/index.html.erb delete mode 100644 app/views/admin/templates/_form.html.erb delete mode 100644 app/views/admin/templates/edit.html.erb delete mode 100644 app/views/admin/templates/index.html.erb delete mode 100644 app/views/admin/templates/new.html.erb delete mode 100644 app/views/admin/templates/show.html.erb delete mode 100644 app/views/admin/users/_user.html.erb delete mode 100644 app/views/admin/users/create.html.erb delete mode 100644 app/views/admin/users/destroy.html.erb delete mode 100644 app/views/admin/users/edit.html.erb delete mode 100644 app/views/admin/users/index.html.erb delete mode 100644 app/views/admin/users/new.html.erb delete mode 100644 app/views/admin/users/show.html.erb delete mode 100644 app/views/admin/users/update.html.erb delete mode 100644 app/views/bug/bug.html.erb delete mode 100644 app/views/bug/history.html.erb delete mode 100644 app/views/bugs/create.html.erb delete mode 100644 app/views/bugs/create.js.erb delete mode 100644 app/views/bugs/destroy.html.erb delete mode 100644 app/views/bugs/new.html.erb delete mode 100644 app/views/bugs/show.html.erb delete mode 100644 app/views/comments/create.js.erb delete mode 100644 app/views/comments/destroy.html.erb delete mode 100644 app/views/comments/new.html.erb delete mode 100644 app/views/comments/show.html.erb delete mode 100644 app/views/cve/_assigning.js.erb delete mode 100644 app/views/cve/_filing.js.erb delete mode 100644 app/views/cve/_invalidate.js.erb delete mode 100644 app/views/cve/_key_events.js.erb delete mode 100644 app/views/cve/_later.js.erb delete mode 100644 app/views/cve/_new.js.erb delete mode 100644 app/views/cve/_nfu.js.erb delete mode 100644 app/views/cve/_toolbar.js.erb delete mode 100644 app/views/cve/_ui_misc.js.erb delete mode 100644 app/views/cve/actions.html.erb delete mode 100644 app/views/cve/assign_preview.html.erb delete mode 100644 app/views/cve/bug_preview.html.erb delete mode 100644 app/views/cve/changes.html.erb delete mode 100644 app/views/cve/comments.html.erb delete mode 100644 app/views/cve/general_info.html.erb delete mode 100644 app/views/cve/index.html.erb delete mode 100644 app/views/cve/info.html.erb delete mode 100644 app/views/cve/info.json.jbuilder delete mode 100644 app/views/cve/list.html.erb delete mode 100644 app/views/cve/new_preview.html.erb delete mode 100644 app/views/cve/packages.html.erb delete mode 100644 app/views/cve/references.html.erb delete mode 100644 app/views/glsa/_approval_row.erb delete mode 100644 app/views/glsa/_close_msg.txt.erb delete mode 100644 app/views/glsa/_comment.html.erb delete mode 100644 app/views/glsa/_comments.html.erb delete mode 100644 app/views/glsa/_edit_bug_row.html.erb delete mode 100644 app/views/glsa/_email_headers.txt.erb delete mode 100644 app/views/glsa/_glsa.xml.builder delete mode 100644 app/views/glsa/_glsa_row.html.erb delete mode 100644 app/views/glsa/_package.html.erb delete mode 100644 app/views/glsa/_reference.html.erb delete mode 100644 app/views/glsa/_show_bug_row.html.erb delete mode 100644 app/views/glsa/_show_package_row.txt.erb delete mode 100644 app/views/glsa/_show_reference.txt.erb delete mode 100644 app/views/glsa/_status_legend.html.erb delete mode 100644 app/views/glsa/_template_popups.html.erb delete mode 100644 app/views/glsa/archive.html.erb delete mode 100644 app/views/glsa/archive.js.erb delete mode 100644 app/views/glsa/comment.html.erb delete mode 100644 app/views/glsa/create.html.erb delete mode 100644 app/views/glsa/destroy.html.erb delete mode 100644 app/views/glsa/diff.html.erb delete mode 100644 app/views/glsa/drafts.html.erb delete mode 100644 app/views/glsa/edit.html.erb delete mode 100644 app/views/glsa/finalize_release.html.erb delete mode 100644 app/views/glsa/import_references.html.erb delete mode 100644 app/views/glsa/new-draft.html.erb delete mode 100644 app/views/glsa/new-request.html.erb delete mode 100644 app/views/glsa/new.html.erb delete mode 100644 app/views/glsa/prepare_release.html.erb delete mode 100644 app/views/glsa/release.html.erb delete mode 100644 app/views/glsa/requests.html.erb delete mode 100644 app/views/glsa/show.html.erb delete mode 100644 app/views/glsa/show.txt.erb delete mode 100644 app/views/glsa/show.xml.erb delete mode 100644 app/views/glsa/update.html.erb delete mode 100644 app/views/glsa_mailer/approval.text.erb delete mode 100644 app/views/glsa_mailer/comment.text.erb delete mode 100644 app/views/glsa_mailer/edit.text.erb delete mode 100644 app/views/glsa_mailer/new_request.text.erb delete mode 100644 app/views/glsa_mailer/text.text.erb delete mode 100644 app/views/index/about.html.erb delete mode 100644 app/views/index/error-access.html.erb delete mode 100644 app/views/index/error-disabled.html.erb delete mode 100644 app/views/index/error-system.html.erb delete mode 100644 app/views/index/error-user.html.erb delete mode 100644 app/views/index/index.html.erb delete mode 100644 app/views/index/profile.html.erb delete mode 100644 app/views/layouts/application.html.erb delete mode 100644 app/views/layouts/cve.html.erb delete mode 100644 app/views/layouts/none.html.erb delete mode 100644 app/views/layouts/notice.html.erb delete mode 100644 app/views/search/_cve_row.html.erb delete mode 100644 app/views/search/_cves.html.erb delete mode 100644 app/views/search/_glsas.html.erb delete mode 100644 app/views/search/results.html.erb delete mode 100644 app/views/tools/_cve.html.erb delete mode 100644 app/views/tools/ajaxbugs.html.erb delete mode 100644 app/views/tools/ajaxdescr.html.erb delete mode 100644 app/views/tools/background.html.erb delete mode 100644 app/views/tools/template.js.erb create mode 100644 assets/.keep create mode 100644 bin/.keep delete mode 100755 bin/bundle delete mode 100755 bin/rails delete mode 100755 bin/rake delete mode 100755 bin/setup delete mode 100644 config.ru delete mode 100644 config/application.rb delete mode 100644 config/boot.rb delete mode 100644 config/database.yml.mysql delete mode 100644 config/deploy.rb delete mode 100644 config/environment.rb delete mode 100644 config/environments/development.rb delete mode 100644 config/environments/production.rb delete mode 100644 config/environments/test.rb delete mode 100644 config/initializers/assets.rb delete mode 100644 config/initializers/backtrace_silencers.rb delete mode 100644 config/initializers/cookies_serializer.rb delete mode 100644 config/initializers/filter_parameter_logging.rb delete mode 100644 config/initializers/glsamaker-global.rb delete mode 100644 config/initializers/glsamaker.rb.sample delete mode 100644 config/initializers/glsamaker_constants.rb delete mode 100644 config/initializers/inflections.rb delete mode 100644 config/initializers/mime_types.rb delete mode 100644 config/initializers/session_store.rb delete mode 100644 config/initializers/time_formats.rb delete mode 100644 config/initializers/wrap_parameters.rb delete mode 100644 config/locales/en.yml delete mode 100644 config/routes.rb delete mode 100644 config/secrets.yml delete mode 100644 config/thinking_sphinx.yml delete mode 100644 db/migrate/20090314092539_create_users.rb delete mode 100644 db/migrate/20090314191650_create_glsas.rb delete mode 100644 db/migrate/20090314194257_add_glsa_user_constraints.rb delete mode 100644 db/migrate/20090314194659_create_revisions.rb delete mode 100644 db/migrate/20090314230516_create_references.rb delete mode 100644 db/migrate/20090315105049_create_bugs.rb delete mode 100644 db/migrate/20090315105326_add_references_revisions_constraint.rb delete mode 100644 db/migrate/20090315110025_create_comments.rb delete mode 100644 db/migrate/20090315110119_add_comment_constraints.rb delete mode 100644 db/migrate/20090410212514_add_user_id_to_revisions.rb delete mode 100644 db/migrate/20090410212600_add_revisions_user_id_constraint.rb delete mode 100644 db/migrate/20090419140216_create_sessions.rb delete mode 100644 db/migrate/20090501114107_add_status_cache_to_bugs.rb delete mode 100644 db/migrate/20100511192546_change_comment_type_to_rating.rb delete mode 100644 db/migrate/20100513183324_create_packages.rb delete mode 100644 db/migrate/20100813183543_create_cves.rb delete mode 100644 db/migrate/20100814103856_create_cve_references.rb delete mode 100644 db/migrate/20100814105152_create_cve_comments.rb delete mode 100644 db/migrate/20100814105345_create_cve_changes.rb delete mode 100644 db/migrate/20100814142647_create_cpes.rb delete mode 100644 db/migrate/20100902093457_create_cve_assignments.rb delete mode 100644 db/migrate/20100918223549_add_system_user.rb delete mode 100644 db/migrate/20110226204724_add_release_flag_to_revisions.rb delete mode 100644 db/migrate/20110827143514_create_templates.rb delete mode 100644 db/migrate/20110829174909_add_first_release_date_to_glsa.rb delete mode 100644 db/migrate/20170418102638_add_slots_to_packages.rb delete mode 100644 db/schema.rb delete mode 100644 db/seeds.rb delete mode 100644 doc/README_FOR_APP delete mode 100644 doc/app/Admin.html delete mode 100644 doc/app/Admin/IndexController.html delete mode 100644 doc/app/Admin/IndexHelper.html delete mode 100644 doc/app/Admin/TemplatesController.html delete mode 100644 doc/app/Admin/TemplatesHelper.html delete mode 100644 doc/app/Admin/UsersController.html delete mode 100644 doc/app/Admin/UsersHelper.html delete mode 100644 doc/app/ApplicationController.html delete mode 100644 doc/app/ApplicationHelper.html delete mode 100644 doc/app/Authentication.html delete mode 100644 doc/app/Authorization.html delete mode 100644 doc/app/Bug.html delete mode 100644 doc/app/BugController.html delete mode 100644 doc/app/BugHelper.html delete mode 100644 doc/app/BugsController.html delete mode 100644 doc/app/BugsHelper.html delete mode 100644 doc/app/Bugzilla.html delete mode 100644 doc/app/Bugzilla/Bug.html delete mode 100644 doc/app/Bugzilla/Bugzilla.html delete mode 100644 doc/app/Bugzilla/Bugzilla/Bugzilla.html delete mode 100644 doc/app/Bugzilla/Bugzilla/Bugzilla/Change.html delete mode 100644 doc/app/Bugzilla/Comment.html delete mode 100644 doc/app/Bugzilla/History.html delete mode 100644 doc/app/Comment.html delete mode 100644 doc/app/Comment/CommentValidator.html delete mode 100644 doc/app/CommentsController.html delete mode 100644 doc/app/CommentsHelper.html delete mode 100644 doc/app/Cpe.html delete mode 100644 doc/app/Cve.html delete mode 100644 doc/app/CveAssignment.html delete mode 100644 doc/app/CveChange.html delete mode 100644 doc/app/CveComment.html delete mode 100644 doc/app/CveController.html delete mode 100644 doc/app/CveHelper.html delete mode 100644 doc/app/CveReference.html delete mode 100644 doc/app/GLSAReleaseError.html delete mode 100644 doc/app/Glsa.html delete mode 100644 doc/app/GlsaController.html delete mode 100644 doc/app/GlsaHelper.html delete mode 100644 doc/app/GlsaMailer.html delete mode 100644 doc/app/Glsamaker.html delete mode 100644 doc/app/Glsamaker/Bugs.html delete mode 100644 doc/app/Glsamaker/Bugs/ArchesMixin.html delete mode 100644 doc/app/Glsamaker/Bugs/Bug.html delete mode 100644 doc/app/Glsamaker/Bugs/BugReadyMixin.html delete mode 100644 doc/app/Glsamaker/Bugs/Status.html delete mode 100644 doc/app/Glsamaker/Bugs/StatusMixin.html delete mode 100644 doc/app/Glsamaker/Diff.html delete mode 100644 doc/app/Glsamaker/HTTP.html delete mode 100644 doc/app/Glsamaker/Helper.html delete mode 100644 doc/app/Glsamaker/Mail.html delete mode 100644 doc/app/Glsamaker/Portage.html delete mode 100644 doc/app/Glsamaker/Portage/Description.html delete mode 100644 doc/app/Glsamaker/XML.html delete mode 100644 doc/app/IndexController.html delete mode 100644 doc/app/IndexHelper.html delete mode 100644 doc/app/Package.html delete mode 100644 doc/app/Reference.html delete mode 100644 doc/app/Revision.html delete mode 100644 doc/app/SearchController.html delete mode 100644 doc/app/SearchHelper.html delete mode 100644 doc/app/String.html delete mode 100644 doc/app/Template.html delete mode 100644 doc/app/ToolsController.html delete mode 100644 doc/app/ToolsHelper.html delete mode 100644 doc/app/User.html delete mode 100644 doc/app/app/controllers/admin/index_controller_rb.html delete mode 100644 doc/app/app/controllers/admin/templates_controller_rb.html delete mode 100644 doc/app/app/controllers/admin/users_controller_rb.html delete mode 100644 doc/app/app/controllers/application_controller_rb.html delete mode 100644 doc/app/app/controllers/bug_controller_rb.html delete mode 100644 doc/app/app/controllers/bugs_controller_rb.html delete mode 100644 doc/app/app/controllers/comments_controller_rb.html delete mode 100644 doc/app/app/controllers/cve_controller_rb.html delete mode 100644 doc/app/app/controllers/glsa_controller_rb.html delete mode 100644 doc/app/app/controllers/index_controller_rb.html delete mode 100644 doc/app/app/controllers/search_controller_rb.html delete mode 100644 doc/app/app/controllers/tools_controller_rb.html delete mode 100644 doc/app/app/helpers/admin/index_helper_rb.html delete mode 100644 doc/app/app/helpers/admin/templates_helper_rb.html delete mode 100644 doc/app/app/helpers/admin/users_helper_rb.html delete mode 100644 doc/app/app/helpers/application_helper_rb.html delete mode 100644 doc/app/app/helpers/bug_helper_rb.html delete mode 100644 doc/app/app/helpers/bugs_helper_rb.html delete mode 100644 doc/app/app/helpers/comments_helper_rb.html delete mode 100644 doc/app/app/helpers/cve_helper_rb.html delete mode 100644 doc/app/app/helpers/glsa_helper_rb.html delete mode 100644 doc/app/app/helpers/index_helper_rb.html delete mode 100644 doc/app/app/helpers/search_helper_rb.html delete mode 100644 doc/app/app/helpers/tools_helper_rb.html delete mode 100644 doc/app/app/mailers/glsa_mailer_rb.html delete mode 100644 doc/app/app/models/bug_rb.html delete mode 100644 doc/app/app/models/comment_rb.html delete mode 100644 doc/app/app/models/cpe_rb.html delete mode 100644 doc/app/app/models/cve_assignment_rb.html delete mode 100644 doc/app/app/models/cve_change_rb.html delete mode 100644 doc/app/app/models/cve_comment_rb.html delete mode 100644 doc/app/app/models/cve_rb.html delete mode 100644 doc/app/app/models/cve_reference_rb.html delete mode 100644 doc/app/app/models/glsa_rb.html delete mode 100644 doc/app/app/models/package_rb.html delete mode 100644 doc/app/app/models/reference_rb.html delete mode 100644 doc/app/app/models/revision_rb.html delete mode 100644 doc/app/app/models/template_rb.html delete mode 100644 doc/app/app/models/user_rb.html delete mode 100644 doc/app/created.rid delete mode 100644 doc/app/doc/README_FOR_APP.html delete mode 100644 doc/app/images/brick.png delete mode 100644 doc/app/images/brick_link.png delete mode 100644 doc/app/images/bug.png delete mode 100644 doc/app/images/bullet_black.png delete mode 100644 doc/app/images/bullet_toggle_minus.png delete mode 100644 doc/app/images/bullet_toggle_plus.png delete mode 100644 doc/app/images/date.png delete mode 100644 doc/app/images/find.png delete mode 100644 doc/app/images/loadingAnimation.gif delete mode 100644 doc/app/images/macFFBgHack.png delete mode 100644 doc/app/images/package.png delete mode 100644 doc/app/images/page_green.png delete mode 100644 doc/app/images/page_white_text.png delete mode 100644 doc/app/images/page_white_width.png delete mode 100644 doc/app/images/plugin.png delete mode 100644 doc/app/images/ruby.png delete mode 100644 doc/app/images/tag_green.png delete mode 100644 doc/app/images/wrench.png delete mode 100644 doc/app/images/wrench_orange.png delete mode 100644 doc/app/images/zoom.png delete mode 100644 doc/app/index.html delete mode 100644 doc/app/js/darkfish.js delete mode 100644 doc/app/js/jquery.js delete mode 100644 doc/app/js/quicksearch.js delete mode 100644 doc/app/js/thickbox-compressed.js delete mode 100644 doc/app/lib/authentication_rb.html delete mode 100644 doc/app/lib/authorization_rb.html delete mode 100644 doc/app/lib/bugzilla/bug_rb.html delete mode 100644 doc/app/lib/bugzilla/comment_rb.html delete mode 100644 doc/app/lib/bugzilla/history_rb.html delete mode 100644 doc/app/lib/bugzilla_rb.html delete mode 100644 doc/app/lib/glsamaker/bugs_rb.html delete mode 100644 doc/app/lib/glsamaker/diff_rb.html delete mode 100644 doc/app/lib/glsamaker/helpers_rb.html delete mode 100644 doc/app/lib/glsamaker/http_rb.html delete mode 100644 doc/app/lib/glsamaker/mail_rb.html delete mode 100644 doc/app/lib/glsamaker/portage_rb.html delete mode 100644 doc/app/lib/glsamaker/xml_rb.html delete mode 100644 doc/app/lib/glsamaker_rb.html delete mode 100644 doc/app/lib/tasks/utils_rb.html delete mode 100644 doc/app/rdoc.css delete mode 100644 doc/diagrams/models.dot delete mode 100644 doc/diagrams/models.png create mode 100644 docker-compose.override.yml create mode 100644 docker-compose.yml create mode 100644 glsamaker.go create mode 100644 go.mod create mode 100644 go.sum delete mode 100644 lib/assets/.gitkeep delete mode 100644 lib/authentication.rb delete mode 100644 lib/authorization.rb delete mode 100644 lib/bugzilla.rb delete mode 100644 lib/bugzilla/bug.rb delete mode 100644 lib/bugzilla/comment.rb delete mode 100644 lib/bugzilla/history.rb delete mode 100644 lib/glsamaker.rb delete mode 100644 lib/glsamaker/bugs.rb delete mode 100644 lib/glsamaker/diff.rb delete mode 100644 lib/glsamaker/helpers.rb delete mode 100644 lib/glsamaker/http.rb delete mode 100644 lib/glsamaker/mail.rb delete mode 100644 lib/glsamaker/portage.rb delete mode 100644 lib/glsamaker/spelling.rb delete mode 100644 lib/glsamaker/xml.rb delete mode 100644 lib/kramdown_ext.rb delete mode 100644 lib/tasks/.gitkeep delete mode 100644 lib/tasks/cve.rake delete mode 100644 lib/tasks/import.rake delete mode 100644 lib/tasks/rcov.rake delete mode 100644 lib/tasks/utils.rb create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 pkg/app/handler/about/index.go create mode 100644 pkg/app/handler/about/utils.go create mode 100644 pkg/app/handler/account/password.go create mode 100644 pkg/app/handler/account/twofactor.go create mode 100644 pkg/app/handler/admin/edit.go create mode 100644 pkg/app/handler/admin/index.go create mode 100644 pkg/app/handler/admin/passwordreset.go create mode 100644 pkg/app/handler/admin/utils.go create mode 100644 pkg/app/handler/all/index.go create mode 100644 pkg/app/handler/all/utils.go create mode 100644 pkg/app/handler/archive/index.go create mode 100644 pkg/app/handler/archive/utils.go create mode 100644 pkg/app/handler/authentication/accessDenied.go create mode 100644 pkg/app/handler/authentication/auth_session/authsession.go create mode 100644 pkg/app/handler/authentication/login.go create mode 100644 pkg/app/handler/authentication/logout.go create mode 100644 pkg/app/handler/authentication/templates/admin.go create mode 100644 pkg/app/handler/authentication/templates/login.go create mode 100644 pkg/app/handler/authentication/templates/totp.go create mode 100644 pkg/app/handler/authentication/templates/webauthn.go create mode 100644 pkg/app/handler/authentication/totp/totp.go create mode 100644 pkg/app/handler/authentication/utils/utils.go create mode 100644 pkg/app/handler/authentication/webauthn/login.go create mode 100644 pkg/app/handler/authentication/webauthn/register.go create mode 100644 pkg/app/handler/cvetool/bug.go create mode 100644 pkg/app/handler/cvetool/comments.go create mode 100644 pkg/app/handler/cvetool/index.go create mode 100644 pkg/app/handler/cvetool/state.go create mode 100644 pkg/app/handler/cvetool/update.go create mode 100644 pkg/app/handler/cvetool/utils.go create mode 100644 pkg/app/handler/dashboard/index.go create mode 100644 pkg/app/handler/dashboard/utils.go create mode 100644 pkg/app/handler/drafts/index.go create mode 100644 pkg/app/handler/drafts/utils.go create mode 100644 pkg/app/handler/glsa/bugs.go create mode 100644 pkg/app/handler/glsa/comments.go create mode 100644 pkg/app/handler/glsa/delete.go create mode 100644 pkg/app/handler/glsa/edit.go create mode 100644 pkg/app/handler/glsa/release.go create mode 100644 pkg/app/handler/glsa/utils.go create mode 100644 pkg/app/handler/glsa/view.go create mode 100644 pkg/app/handler/home/index.go create mode 100644 pkg/app/handler/home/utils.go create mode 100644 pkg/app/handler/newRequest/index.go create mode 100644 pkg/app/handler/newRequest/utils.go create mode 100644 pkg/app/handler/requests/index.go create mode 100644 pkg/app/handler/requests/utils.go create mode 100644 pkg/app/handler/search/index.go create mode 100644 pkg/app/handler/search/utils.go create mode 100644 pkg/app/handler/statistics/index.go create mode 100644 pkg/app/handler/statistics/utils.go create mode 100644 pkg/app/serve.go create mode 100644 pkg/app/utils.go create mode 100644 pkg/config/config.go create mode 100644 pkg/cveimport/update.go create mode 100644 pkg/database/connection/connection.go create mode 100644 pkg/database/init.go create mode 100644 pkg/database/schema/create.go create mode 100644 pkg/logger/loggers.go create mode 100644 pkg/models/application.go create mode 100644 pkg/models/bugzilla/bugs.go create mode 100644 pkg/models/cve/cve.go create mode 100644 pkg/models/cve/cvss.go create mode 100644 pkg/models/cve/feed.go create mode 100644 pkg/models/glsa.go create mode 100644 pkg/models/gpackage/package.go create mode 100644 pkg/models/session.go create mode 100644 pkg/models/users/user.go delete mode 100644 public/404.html delete mode 100644 public/422.html delete mode 100644 public/500.html delete mode 100644 public/error-404.png delete mode 100644 public/error-500.png delete mode 100644 public/favicon.ico delete mode 100644 public/robots.txt delete mode 100644 public/xsl/ads.xsl delete mode 100644 public/xsl/content.xsl delete mode 100644 public/xsl/devmap.xsl delete mode 100644 public/xsl/doc-struct.xsl delete mode 100644 public/xsl/glsa.xsl delete mode 100644 public/xsl/guide.xsl delete mode 100644 public/xsl/handbook.xsl delete mode 100644 public/xsl/inserts.xsl delete mode 100644 public/xsl/mail.xsl delete mode 100644 public/xsl/menu.xsl delete mode 100644 public/xsl/util.xsl delete mode 100755 script/config_init delete mode 100755 script/db-backup delete mode 100755 script/rails delete mode 100755 script/update-portage-cache delete mode 100644 test/fixtures/.gitkeep delete mode 100644 test/fixtures/bugs.yml delete mode 100644 test/fixtures/comments.yml delete mode 100644 test/fixtures/cpes.yml delete mode 100644 test/fixtures/cve_assignments.yml delete mode 100644 test/fixtures/cve_changes.yml delete mode 100644 test/fixtures/cve_comments.yml delete mode 100644 test/fixtures/cve_references.yml delete mode 100644 test/fixtures/cves.yml delete mode 100644 test/fixtures/glsa_mailer/approval delete mode 100644 test/fixtures/glsa_mailer/comment delete mode 100644 test/fixtures/glsa_mailer/edit delete mode 100644 test/fixtures/glsa_mailer/request delete mode 100644 test/fixtures/glsa_mailer/sent delete mode 100644 test/fixtures/glsas.yml delete mode 100644 test/fixtures/packages.yml delete mode 100644 test/fixtures/references.yml delete mode 100644 test/fixtures/revisions.yml delete mode 100644 test/fixtures/templates.yml delete mode 100644 test/fixtures/users.yml delete mode 100644 test/functional/.gitkeep delete mode 100644 test/functional/admin/index_controller_test.rb delete mode 100644 test/functional/admin/templates_controller_test.rb delete mode 100644 test/functional/admin/users_controller_test.rb delete mode 100644 test/functional/bug_controller_test.rb delete mode 100644 test/functional/bugs_controller_test.rb delete mode 100644 test/functional/comments_controller_test.rb delete mode 100644 test/functional/cve_controller_test.rb delete mode 100644 test/functional/glsa_controller_test.rb delete mode 100644 test/functional/glsa_mailer_test.rb delete mode 100644 test/functional/index_controller_test.rb delete mode 100644 test/functional/search_controller_test.rb delete mode 100644 test/functional/tools_controller_test.rb delete mode 100644 test/integration/.gitkeep delete mode 100644 test/integration/authentication_test.rb delete mode 100644 test/test_helper.rb delete mode 100644 test/unit/.gitkeep delete mode 100644 test/unit/bug_test.rb delete mode 100644 test/unit/comment_test.rb delete mode 100644 test/unit/cpe_test.rb delete mode 100644 test/unit/cve_assignment_test.rb delete mode 100644 test/unit/cve_change_test.rb delete mode 100644 test/unit/cve_comment_test.rb delete mode 100644 test/unit/cve_reference_test.rb delete mode 100644 test/unit/cve_test.rb delete mode 100644 test/unit/glsa_mailer_test.rb delete mode 100644 test/unit/glsa_test.rb delete mode 100644 test/unit/helpers/bug_helper_test.rb delete mode 100644 test/unit/helpers/bugs_helper_test.rb delete mode 100644 test/unit/helpers/comments_helper_test.rb delete mode 100644 test/unit/helpers/cve_helper_test.rb delete mode 100644 test/unit/helpers/glsa_helper_test.rb delete mode 100644 test/unit/helpers/index_helper_test.rb delete mode 100644 test/unit/helpers/search_helper_test.rb delete mode 100644 test/unit/helpers/templates_helper_test.rb delete mode 100644 test/unit/helpers/tools_helper_test.rb delete mode 100644 test/unit/helpers/user_helper_test.rb delete mode 100644 test/unit/package_test.rb delete mode 100644 test/unit/reference_test.rb delete mode 100644 test/unit/revision_test.rb delete mode 100644 test/unit/template_test.rb delete mode 100644 test/unit/user_test.rb delete mode 100644 tmp/cache/.gitignore delete mode 100644 tmp/pids/.gitignore delete mode 100644 tmp/sessions/.gitignore delete mode 100644 tmp/sockets/.gitignore delete mode 100644 vendor/assets/stylesheets/.gitkeep delete mode 100644 vendor/dictionaries/README_en_US.txt delete mode 100644 vendor/dictionaries/en_US.aff delete mode 100644 vendor/dictionaries/en_US.dic delete mode 100644 vendor/plugins/.gitignore delete mode 100644 vendor/plugins/.gitkeep create mode 100644 web/packs/account.js create mode 100644 web/packs/admin.js create mode 100644 web/packs/application.js create mode 100644 web/packs/edit.js create mode 100644 web/packs/glsa.js create mode 100644 web/packs/newglsa.js create mode 100644 web/packs/src/javascript/all.js create mode 100644 web/packs/src/javascript/archive.js create mode 100644 web/packs/src/javascript/cvetool.js create mode 100644 web/packs/src/javascript/drafts.js create mode 100644 web/packs/src/javascript/requests.js create mode 100644 web/packs/src/stylesheets/application.scss create mode 100644 web/packs/src/stylesheets/index.scss create mode 100644 web/packs/statistics.js create mode 100644 web/packs/stylesheets.js create mode 100644 web/templates/about/about.tmpl create mode 100644 web/templates/about/aboutCLI.tmpl create mode 100644 web/templates/about/aboutSearch.tmpl create mode 100644 web/templates/account/2fa.tmpl create mode 100644 web/templates/account/password/forcedchange.tmpl create mode 100644 web/templates/account/password/normalchange.tmpl create mode 100644 web/templates/account/password/password.tmpl create mode 100644 web/templates/admin/components/global.tmpl create mode 100644 web/templates/admin/components/permissions.tmpl create mode 100644 web/templates/admin/components/templates.tmpl create mode 100644 web/templates/admin/components/users.tmpl create mode 100644 web/templates/admin/edit/permissions.tmpl create mode 100644 web/templates/admin/edit/users.tmpl create mode 100644 web/templates/admin/passwordreset.tmpl create mode 100644 web/templates/admin/view.tmpl create mode 100644 web/templates/all/all.tmpl create mode 100644 web/templates/archive/archive.tmpl create mode 100644 web/templates/authentication/accessDenied.tmpl create mode 100644 web/templates/authentication/login.tmpl create mode 100644 web/templates/authentication/totp.tmpl create mode 100644 web/templates/authentication/webauthn.tmpl create mode 100644 web/templates/dashboard/dashboard.tmpl create mode 100644 web/templates/drafts/drafts.tmpl create mode 100644 web/templates/glsa/edit.tmpl create mode 100644 web/templates/glsa/show.tmpl create mode 100644 web/templates/home/home.tmpl create mode 100644 web/templates/index/show.tmpl create mode 100644 web/templates/index/showFullscreen.tmpl create mode 100644 web/templates/layout/footer.tmpl create mode 100644 web/templates/layout/head.tmpl create mode 100644 web/templates/layout/header.tmpl create mode 100644 web/templates/layout/sitetitle.tmpl create mode 100644 web/templates/layout/tyriannav.tmpl create mode 100644 web/templates/new/new.tmpl create mode 100644 web/templates/requests/requests.tmpl create mode 100644 web/templates/search/search.tmpl create mode 100644 web/templates/statistics/statistics.tmpl create mode 100644 webpack.config.js diff --git a/.gitignore b/.gitignore index 66aa48d..07a09c0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,23 +1,5 @@ -*.swp -.DS_Store -log/* -tmp/* -db/*.sqlite* -config/database.yml -config/*private* -config/initializers/glsamaker.rb -config/initializers/secret_token.rb -public/stylesheets/all.css -public/javascripts/all.js -/.loadpath -/MYTODO -coverage +node_modules/ +assets/ .idea -.rvmrc -*.tmproj -*.sphinx.conf -db/sphinx -.bundle -vendor -Gemfile.lock -doc/app/.cache/* + +.bin/glsamaker diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..d739110 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,32 @@ +stages: + - build + - test + +info: + stage: .pre + script: + - docker info + +build: + stage: build + variables: + IMAGE_TAG: $CI_REGISTRY_IMAGE/$CI_COMMIT_BRANCH:$CI_COMMIT_SHA + LATEST_IMAGE_TAG: $CI_REGISTRY_IMAGE/$CI_COMMIT_BRANCH:latest + script: + - echo $IMAGE_TAG + - echo $LATEST_IMAGE_TAG + - echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" "$CI_REGISTRY" --password-stdin + - docker pull $LATEST_IMAGE_TAG || true + - docker build --cache-from $LATEST_IMAGE_TAG -t $IMAGE_TAG -t $LATEST_IMAGE_TAG . + - docker push $LATEST_IMAGE_TAG + - docker push $IMAGE_TAG + +include: + - template: Dependency-Scanning.gitlab-ci.yml + - template: Container-Scanning.gitlab-ci.yml + - template: SAST.gitlab-ci.yml + +variables: + DS_DISABLE_DIND: "true" + SAST_DISABLE_DIND: "true" + diff --git a/.rubocop.yml b/.rubocop.yml deleted file mode 100644 index d379a78..0000000 --- a/.rubocop.yml +++ /dev/null @@ -1,27 +0,0 @@ -inherit_from: .rubocop_todo.yml - -require: - - rubocop-performance - - rubocop-rails - -AllCops: - TargetRubyVersion: 2.4 - TargetRailsVersion: 4.2 - -Rails: - Enabled: true - -Style/AsciiComments: - Enabled: false - -Style/FormatString: - Enabled: false - -Style/Documentation: - Enabled: false - -Style/PerlBackrefs: - Enabled: false - -Metrics/ModuleLength: - Max: 200 diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml deleted file mode 100644 index e265d63..0000000 --- a/.rubocop_todo.yml +++ /dev/null @@ -1,1369 +0,0 @@ -# This configuration was generated by -# `rubocop --auto-gen-config` -# on 2019-07-23 23:27:07 +0200 using RuboCop version 0.73.0. -# The point is for the user to remove these configuration records -# one by one as the offenses are removed from the code base. -# Note that changes in the inspected code, or installation of new -# versions of RuboCop, may require this file to be generated again. - -# Offense count: 7 -# Cop supports --auto-correct. -# Configuration parameters: TreatCommentsAsGroupSeparators, Include. -# Include: **/*.gemfile, **/Gemfile, **/gems.rb -Bundler/OrderedGems: - Exclude: - - 'Gemfile' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, IndentationWidth. -# SupportedStyles: outdent, indent -Layout/AccessModifierIndentation: - Exclude: - - 'app/helpers/glsa_helper.rb' - -# Offense count: 2 -# Cop supports --auto-correct. -Layout/AlignArray: - Exclude: - - 'lib/glsamaker/bugs.rb' - -# Offense count: 22 -# Cop supports --auto-correct. -# Configuration parameters: AllowMultipleStyles, EnforcedHashRocketStyle, EnforcedColonStyle, EnforcedLastArgumentHashStyle. -# SupportedHashRocketStyles: key, separator, table -# SupportedColonStyles: key, separator, table -# SupportedLastArgumentHashStyles: always_inspect, always_ignore, ignore_implicit, ignore_explicit -Layout/AlignHash: - Exclude: - - 'app/mailers/glsa_mailer.rb' - - 'app/models/package.rb' - - 'app/views/glsa/_glsa.xml.builder' - - 'lib/glsamaker/portage.rb' - - 'lib/tasks/cve.rake' - - 'test/unit/user_test.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -Layout/BlockEndNewline: - Exclude: - - 'app/controllers/cve_controller.rb' - -# Offense count: 11 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, IndentOneStep, IndentationWidth. -# SupportedStyles: case, end -Layout/CaseIndentation: - Exclude: - - 'lib/tasks/rcov.rake' - - 'test/test_helper.rb' - -# Offense count: 2 -# Cop supports --auto-correct. -Layout/ClosingParenthesisIndentation: - Exclude: - - 'app/controllers/glsa_controller.rb' - - 'app/helpers/application_helper.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -Layout/CommentIndentation: - Exclude: - - 'Gemfile' - -# Offense count: 3 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle. -# SupportedStyles: leading, trailing -Layout/DotPosition: - Exclude: - - 'app/helpers/application_helper.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -Layout/ElseAlignment: - Exclude: - - 'app/views/glsa/_glsa.xml.builder' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: AllowBorderComment, AllowMarginComment. -Layout/EmptyComment: - Exclude: - - 'config/routes.rb' - -# Offense count: 16 -# Cop supports --auto-correct. -Layout/EmptyLineAfterGuardClause: - Exclude: - - 'app/controllers/glsa_controller.rb' - - 'app/models/glsa.rb' - - 'lib/glsamaker/portage.rb' - - 'test/test_helper.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -Layout/EmptyLineAfterMagicComment: - Exclude: - - 'db/schema.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: AllowAdjacentOneLineDefs, NumberOfEmptyLines. -Layout/EmptyLineBetweenDefs: - Exclude: - - 'app/controllers/glsa_controller.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -Layout/EmptyLines: - Exclude: - - 'app/controllers/glsa_controller.rb' - -# Offense count: 14 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle. -# SupportedStyles: around, only_before -Layout/EmptyLinesAroundAccessModifier: - Exclude: - - 'app/controllers/application_controller.rb' - - 'app/controllers/cve_controller.rb' - - 'app/controllers/glsa_controller.rb' - - 'app/helpers/glsa_helper.rb' - - 'lib/authentication.rb' - - 'lib/bugzilla.rb' - - 'lib/bugzilla/bug.rb' - - 'lib/glsamaker/bugs.rb' - - 'lib/glsamaker/helpers.rb' - - 'lib/glsamaker/mail.rb' - - 'lib/glsamaker/portage.rb' - - 'lib/glsamaker/xml.rb' - - 'lib/tasks/utils.rb' - -# Offense count: 5 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle. -# SupportedStyles: empty_lines, no_empty_lines -Layout/EmptyLinesAroundBlockBody: - Exclude: - - 'config/environments/production.rb' - - 'config/routes.rb' - - 'db/schema.rb' - - 'lib/tasks/import.rake' - -# Offense count: 5 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle. -# SupportedStyles: empty_lines, empty_lines_except_namespace, empty_lines_special, no_empty_lines, beginning_only, ending_only -Layout/EmptyLinesAroundClassBody: - Exclude: - - 'app/controllers/bug_controller.rb' - - 'app/controllers/comments_controller.rb' - - 'app/controllers/cve_controller.rb' - - 'app/models/glsa.rb' - - 'lib/glsamaker/bugs.rb' - -# Offense count: 2 -# Cop supports --auto-correct. -Layout/EmptyLinesAroundMethodBody: - Exclude: - - 'app/controllers/glsa_controller.rb' - - 'lib/bugzilla.rb' - -# Offense count: 2 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle. -# SupportedStyles: empty_lines, empty_lines_except_namespace, empty_lines_special, no_empty_lines -Layout/EmptyLinesAroundModuleBody: - Exclude: - - 'lib/glsamaker/diff.rb' - - 'lib/glsamaker/mail.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyleAlignWith, AutoCorrect, Severity. -# SupportedStylesAlignWith: keyword, variable, start_of_line -Layout/EndAlignment: - Exclude: - - 'lib/tasks/rcov.rake' - -# Offense count: 18 -# Cop supports --auto-correct. -# Configuration parameters: AllowForAlignment, AllowBeforeTrailingComments, ForceEqualSignAlignment. -Layout/ExtraSpacing: - Exclude: - - 'app/controllers/comments_controller.rb' - - 'app/helpers/glsa_helper.rb' - - 'app/views/cve/info.json.jbuilder' - - 'bin/setup' - - 'config.ru' - - 'db/schema.rb' - - 'script/db-backup' - - 'script/rails' - -# Offense count: 4 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, IndentationWidth. -# SupportedStyles: consistent, consistent_relative_to_receiver, special_for_inner_method_call, special_for_inner_method_call_in_parentheses -Layout/IndentFirstArgument: - Exclude: - - 'app/controllers/glsa_controller.rb' - - 'app/helpers/application_helper.rb' - - 'app/helpers/glsa_helper.rb' - -# Offense count: 2 -# Cop supports --auto-correct. -# Configuration parameters: IndentationWidth. -# SupportedStyles: special_inside_parentheses, consistent, align_brackets -Layout/IndentFirstArrayElement: - EnforcedStyle: consistent - -# Offense count: 7 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, IndentationWidth. -# SupportedStyles: special_inside_parentheses, consistent, align_braces -Layout/IndentFirstHashElement: - Exclude: - - 'app/models/package.rb' - - 'lib/bugzilla.rb' - - 'lib/glsamaker/portage.rb' - -# Offense count: 10 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle. -# SupportedStyles: normal, indented_internal_methods -Layout/IndentationConsistency: - Exclude: - - 'app/models/glsa.rb' - - 'lib/authentication.rb' - - 'lib/tasks/import.rake' - -# Offense count: 25 -# Cop supports --auto-correct. -# Configuration parameters: Width, IgnoredPatterns. -Layout/IndentationWidth: - Exclude: - - 'app/views/glsa/_glsa.xml.builder' - - 'db/migrate/20100814103856_create_cve_references.rb' - - 'lib/authentication.rb' - - 'lib/glsamaker/spelling.rb' - - 'lib/tasks/import.rake' - -# Offense count: 31 -# Cop supports --auto-correct. -# Configuration parameters: AllowDoxygenCommentStyle. -Layout/LeadingCommentSpace: - Exclude: - - 'Gemfile' - - 'app/controllers/application_controller.rb' - - 'lib/bugzilla.rb' - - 'lib/glsamaker.rb' - - 'lib/tasks/import.rake' - - 'script/db-backup' - - 'test/unit/revision_test.rb' - -# Offense count: 2 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle. -# SupportedStyles: symmetrical, new_line, same_line -Layout/MultilineMethodCallBraceLayout: - Exclude: - - 'app/helpers/glsa_helper.rb' - -# Offense count: 3 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, IndentationWidth. -# SupportedStyles: aligned, indented, indented_relative_to_receiver -Layout/MultilineMethodCallIndentation: - Exclude: - - 'app/helpers/application_helper.rb' - -# Offense count: 5 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, IndentationWidth. -# SupportedStyles: aligned, indented -Layout/MultilineOperationIndentation: - Exclude: - - 'db/migrate/20100918223549_add_system_user.rb' - - 'lib/glsamaker/portage.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -Layout/RescueEnsureAlignment: - Exclude: - - 'app/controllers/cve_controller.rb' - -# Offense count: 3 -# Cop supports --auto-correct. -Layout/SpaceAfterComma: - Exclude: - - 'app/helpers/glsa_helper.rb' - - 'config/deploy.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyleInsidePipes. -# SupportedStylesInsidePipes: space, no_space -Layout/SpaceAroundBlockParameters: - Exclude: - - 'lib/tasks/rcov.rake' - -# Offense count: 11 -# Cop supports --auto-correct. -# Configuration parameters: AllowForAlignment. -Layout/SpaceAroundOperators: - Exclude: - - 'app/controllers/comments_controller.rb' - - 'app/controllers/glsa_controller.rb' - - 'app/helpers/glsa_helper.rb' - - 'app/models/cve.rb' - - 'app/models/package.rb' - - 'script/db-backup' - -# Offense count: 22 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBraces. -# SupportedStyles: space, no_space -# SupportedStylesForEmptyBraces: space, no_space -Layout/SpaceBeforeBlockBraces: - Exclude: - - 'app/controllers/cve_controller.rb' - - 'app/helpers/admin/templates_helper.rb' - - 'app/helpers/admin/users_helper.rb' - - 'lib/tasks/rcov.rake' - - 'test/unit/glsa_test.rb' - - 'test/unit/revision_test.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -Layout/SpaceBeforeComma: - Exclude: - - 'config/routes.rb' - -# Offense count: 3 -# Cop supports --auto-correct. -Layout/SpaceBeforeSemicolon: - Exclude: - - 'config/deploy.rb' - - 'lib/bugzilla.rb' - -# Offense count: 72 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBraces, SpaceBeforeBlockParameters. -# SupportedStyles: space, no_space -# SupportedStylesForEmptyBraces: space, no_space -Layout/SpaceInsideBlockBraces: - Enabled: false - -# Offense count: 67 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBraces. -# SupportedStyles: space, no_space, compact -# SupportedStylesForEmptyBraces: space, no_space -Layout/SpaceInsideHashLiteralBraces: - Exclude: - - 'app/controllers/cve_controller.rb' - - 'app/controllers/glsa_controller.rb' - - 'app/controllers/index_controller.rb' - - 'app/controllers/tools_controller.rb' - - 'app/helpers/glsa_helper.rb' - - 'app/models/comment.rb' - - 'app/models/glsa.rb' - - 'app/views/glsa/_glsa.xml.builder' - - 'config/deploy.rb' - - 'lib/bugzilla.rb' - - 'lib/glsamaker/http.rb' - - 'lib/glsamaker/xml.rb' - - 'test/test_helper.rb' - - 'test/unit/glsa_test.rb' - -# Offense count: 8 -# Cop supports --auto-correct. -Layout/SpaceInsidePercentLiteralDelimiters: - Exclude: - - 'config/application.rb' - - 'config/initializers/glsamaker-global.rb' - - 'lib/bugzilla.rb' - - 'lib/tasks/cve.rake' - -# Offense count: 7 -# Cop supports --auto-correct. -# Configuration parameters: IndentationWidth. -Layout/Tab: - Exclude: - - 'app/views/glsa/_glsa.xml.builder' - -# Offense count: 286 -# Cop supports --auto-correct. -# Configuration parameters: AllowInHeredoc. -Layout/TrailingWhitespace: - Enabled: false - -# Offense count: 1 -Lint/AmbiguousBlockAssociation: - Exclude: - - 'app/views/cve/info.json.jbuilder' - -# Offense count: 1 -Lint/DuplicateMethods: - Exclude: - - 'lib/bugzilla/bug.rb' - -# Offense count: 2 -# Configuration parameters: AllowComments. -Lint/HandleExceptions: - Exclude: - - 'Rakefile' - - 'app/controllers/bugs_controller.rb' - -# Offense count: 1 -Lint/IneffectiveAccessModifier: - Exclude: - - 'lib/authentication.rb' - -# Offense count: 2 -Lint/NestedMethodDefinition: - Exclude: - - 'app/models/cve.rb' - - 'lib/tasks/cve.rake' - -# Offense count: 3 -Lint/NonLocalExitFromIterator: - Exclude: - - 'app/controllers/glsa_controller.rb' - -# Offense count: 38 -Lint/RescueException: - Exclude: - - 'app/controllers/bugs_controller.rb' - - 'app/controllers/comments_controller.rb' - - 'app/controllers/cve_controller.rb' - - 'app/controllers/glsa_controller.rb' - - 'app/controllers/tools_controller.rb' - - 'app/models/bug.rb' - - 'app/models/glsa.rb' - - 'lib/bugzilla/bug.rb' - - 'lib/bugzilla/history.rb' - - 'lib/glsamaker/bugs.rb' - - 'lib/tasks/rcov.rake' - - 'script/config_init' - -# Offense count: 1 -# Cop supports --auto-correct. -Lint/ScriptPermission: - Exclude: - - 'Rakefile' - -# Offense count: 7 -# Cop supports --auto-correct. -Lint/StringConversionInInterpolation: - Exclude: - - 'lib/bugzilla/history.rb' - - 'test/functional/glsa_controller_test.rb' - -# Offense count: 2 -# Configuration parameters: AllowKeywordBlockArguments. -Lint/UnderscorePrefixedVariableName: - Exclude: - - 'lib/glsamaker/bugs.rb' - - 'lib/tasks/cve.rake' - -# Offense count: 2 -Lint/UnreachableCode: - Exclude: - - 'app/controllers/cve_controller.rb' - - 'app/controllers/glsa_controller.rb' - -# Offense count: 10 -# Cop supports --auto-correct. -# Configuration parameters: IgnoreEmptyBlocks, AllowUnusedKeywordArguments. -Lint/UnusedBlockArgument: - Exclude: - - 'app/helpers/glsa_helper.rb' - - 'app/models/glsa.rb' - - 'lib/glsamaker/portage.rb' - -# Offense count: 4 -# Cop supports --auto-correct. -# Configuration parameters: AllowUnusedKeywordArguments, IgnoreEmptyMethods. -Lint/UnusedMethodArgument: - Exclude: - - 'app/models/glsa.rb' - - 'lib/glsamaker/portage.rb' - - 'lib/kramdown_ext.rb' - -# Offense count: 16 -Lint/UselessAssignment: - Exclude: - - 'app/controllers/bug_controller.rb' - - 'app/controllers/bugs_controller.rb' - - 'app/controllers/comments_controller.rb' - - 'app/controllers/search_controller.rb' - - 'app/models/cve.rb' - - 'lib/bugzilla.rb' - - 'lib/bugzilla/bug.rb' - - 'lib/bugzilla/history.rb' - - 'lib/glsamaker/bugs.rb' - - 'lib/tasks/cve.rake' - - 'lib/tasks/import.rake' - -# Offense count: 6 -Metrics/AbcSize: - Max: 172 - -# Offense count: 14 -# Configuration parameters: CountComments, ExcludedMethods. -# ExcludedMethods: refine -Metrics/BlockLength: - Max: 192 - -# Offense count: 3 -# Configuration parameters: CountBlocks. -Metrics/BlockNesting: - Max: 4 - -# Offense count: 5 -# Configuration parameters: CountComments. -Metrics/ClassLength: - Max: 441 - -# Offense count: 18 -Metrics/CyclomaticComplexity: - Max: 24 - -# Offense count: 24 -# Cop supports --auto-correct. -# Configuration parameters: AutoCorrect, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns. -# URISchemes: http, https -Metrics/LineLength: - Max: 312 - -# Offense count: 26 -# Configuration parameters: CountComments, ExcludedMethods. -Metrics/MethodLength: - Max: 105 - -# Offense count: 1 -# Configuration parameters: CountKeywordArgs. -Metrics/ParameterLists: - Max: 6 - -# Offense count: 14 -Metrics/PerceivedComplexity: - Max: 19 - -# Offense count: 1 -Naming/AccessorMethodName: - Exclude: - - 'app/models/revision.rb' - -# Offense count: 1 -# Configuration parameters: ExpectMatchingDefinition, Regex, IgnoreExecutableScripts, AllowedAcronyms. -# AllowedAcronyms: CLI, DSL, ACL, API, ASCII, CPU, CSS, DNS, EOF, GUID, HTML, HTTP, HTTPS, ID, IP, JSON, LHS, QPS, RAM, RHS, RPC, SLA, SMTP, SQL, SSH, TCP, TLS, TTL, UDP, UI, UID, UUID, URI, URL, UTF8, VM, XML, XMPP, XSRF, XSS -Naming/FileName: - Exclude: - - 'config/initializers/glsamaker-global.rb' - -# Offense count: 1 -# Configuration parameters: EnforcedStyle. -# SupportedStyles: snake_case, camelCase -Naming/MethodName: - Exclude: - - 'lib/bugzilla/bug.rb' - -# Offense count: 7 -# Configuration parameters: NamePrefix, NamePrefixBlacklist, NameWhitelist, MethodDefinitionMacros. -# NamePrefix: is_, has_, have_ -# NamePrefixBlacklist: is_, has_, have_ -# NameWhitelist: is_a? -# MethodDefinitionMacros: define_method, define_singleton_method -Naming/PredicateName: - Exclude: - - 'spec/**/*' - - 'app/helpers/glsa_helper.rb' - - 'app/models/glsa.rb' - - 'app/models/user.rb' - - 'lib/glsamaker/portage.rb' - -# Offense count: 8 -# Configuration parameters: MinNameLength, AllowNamesEndingInNumbers, AllowedNames, ForbiddenNames. -# AllowedNames: io, id, to, by, on, in, at, ip, db -Naming/UncommunicativeMethodParamName: - Exclude: - - 'app/helpers/application_helper.rb' - - 'app/helpers/glsa_helper.rb' - - 'app/models/cve.rb' - - 'lib/glsamaker/portage.rb' - - 'lib/kramdown_ext.rb' - - 'lib/tasks/cve.rake' - -# Offense count: 18 -# Configuration parameters: EnforcedStyle. -# SupportedStyles: snake_case, camelCase -Naming/VariableName: - Exclude: - - 'app/controllers/cve_controller.rb' - - 'app/controllers/glsa_controller.rb' - - 'app/controllers/index_controller.rb' - -# Offense count: 1 -Performance/Caller: - Exclude: - - 'app/controllers/application_controller.rb' - -# Offense count: 2 -# Cop supports --auto-correct. -Performance/CompareWithBlock: - Exclude: - - 'app/controllers/glsa_controller.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -Performance/RedundantBlockCall: - Exclude: - - 'app/helpers/application_helper.rb' - -# Offense count: 5 -# Cop supports --auto-correct. -Performance/RegexpMatch: - Exclude: - - 'lib/glsamaker/spelling.rb' - - 'lib/tasks/cve.rake' - - 'lib/tasks/rcov.rake' - -# Offense count: 1 -# Cop supports --auto-correct. -Performance/StringReplacement: - Exclude: - - 'lib/glsamaker/xml.rb' - -# Offense count: 1 -Performance/UnfreezeString: - Exclude: - - 'lib/tasks/rcov.rake' - -# Offense count: 6 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, Include. -# SupportedStyles: action, filter -# Include: app/controllers/**/*.rb -Rails/ActionFilter: - Exclude: - - 'app/controllers/admin/index_controller.rb' - - 'app/controllers/admin/templates_controller.rb' - - 'app/controllers/admin/users_controller.rb' - - 'app/controllers/application_controller.rb' - - 'app/controllers/cve_controller.rb' - - 'app/controllers/index_controller.rb' - -# Offense count: 3 -# Cop supports --auto-correct. -Rails/ActiveRecordAliases: - Exclude: - - 'app/controllers/admin/templates_controller.rb' - - 'app/controllers/admin/users_controller.rb' - - 'app/models/bug.rb' - -# Offense count: 5 -# Cop supports --auto-correct. -# Configuration parameters: Include. -# Include: **/test/**/* -Rails/AssertNot: - Exclude: - - 'test/unit/glsa_test.rb' - - 'test/unit/user_test.rb' - -# Offense count: 3 -# Configuration parameters: EnforcedStyle. -# SupportedStyles: strict, flexible -Rails/Date: - Exclude: - - 'app/controllers/glsa_controller.rb' - - 'lib/tasks/cve.rake' - -# Offense count: 10 -# Cop supports --auto-correct. -# Configuration parameters: Whitelist. -# Whitelist: find_by_sql -Rails/DynamicFindBy: - Exclude: - - 'app/controllers/glsa_controller.rb' - - 'lib/authentication.rb' - - 'lib/tasks/cve.rake' - -# Offense count: 4 -# Configuration parameters: EnforcedStyle. -# SupportedStyles: slashes, arguments -Rails/FilePath: - Exclude: - - 'lib/bugzilla.rb' - - 'lib/glsamaker/spelling.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: Include. -# Include: app/models/**/*.rb -Rails/FindEach: - Exclude: - - 'app/models/revision.rb' - -# Offense count: 2 -# Configuration parameters: Include. -# Include: app/models/**/*.rb -Rails/HasAndBelongsToMany: - Exclude: - - 'app/models/cpe.rb' - - 'app/models/cve.rb' - -# Offense count: 9 -# Configuration parameters: Include. -# Include: app/models/**/*.rb -Rails/HasManyOrHasOneDependent: - Exclude: - - 'app/models/cve.rb' - - 'app/models/user.rb' - -# Offense count: 1 -# Configuration parameters: Include. -# Include: app/helpers/**/*.rb -Rails/HelperInstanceVariable: - Exclude: - - 'app/helpers/glsa_helper.rb' - -# Offense count: 21 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle. -# SupportedStyles: numeric, symbolic -Rails/HttpStatus: - Exclude: - - 'app/controllers/bugs_controller.rb' - - 'app/controllers/comments_controller.rb' - - 'app/controllers/cve_controller.rb' - - 'app/controllers/glsa_controller.rb' - - 'app/controllers/tools_controller.rb' - -# Offense count: 15 -# Configuration parameters: Include. -# Include: app/models/**/*.rb -Rails/InverseOf: - Exclude: - - 'app/models/comment.rb' - - 'app/models/cve.rb' - - 'app/models/cve_change.rb' - - 'app/models/cve_comment.rb' - - 'app/models/glsa.rb' - - 'app/models/revision.rb' - - 'app/models/user.rb' - -# Offense count: 4 -Rails/OutputSafety: - Exclude: - - 'app/controllers/glsa_controller.rb' - - 'app/helpers/application_helper.rb' - - 'lib/glsamaker/spelling.rb' - -# Offense count: 1 -# Configuration parameters: Blacklist, Whitelist. -# Blacklist: decrement!, decrement_counter, increment!, increment_counter, toggle!, touch, update_all, update_attribute, update_column, update_columns, update_counters -Rails/SkipsModelValidations: - Exclude: - - 'app/controllers/glsa_controller.rb' - -# Offense count: 11 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle. -# SupportedStyles: strict, flexible -Rails/TimeZone: - Exclude: - - 'app/models/glsa.rb' - - 'lib/authorization.rb' - - 'lib/bugzilla/bug.rb' - - 'lib/bugzilla/comment.rb' - - 'lib/bugzilla/history.rb' - - 'lib/tasks/cve.rake' - -# Offense count: 10 -# Cop supports --auto-correct. -# Configuration parameters: Include. -# Include: app/models/**/*.rb -Rails/Validation: - Exclude: - - 'app/models/glsa.rb' - - 'app/models/revision.rb' - - 'app/models/user.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -Security/YAMLLoad: - Exclude: - - 'script/config_init' - -# Offense count: 1 -# Configuration parameters: EnforcedStyle. -# SupportedStyles: inline, group -Style/AccessModifierDeclarations: - Exclude: - - 'lib/glsamaker/http.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle. -# SupportedStyles: prefer_alias, prefer_alias_method -Style/Alias: - Exclude: - - 'lib/bugzilla/bug.rb' - -# Offense count: 28 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle. -# SupportedStyles: always, conditionals -Style/AndOr: - Exclude: - - 'app/controllers/application_controller.rb' - - 'app/controllers/comments_controller.rb' - - 'app/controllers/cve_controller.rb' - - 'app/controllers/glsa_controller.rb' - - 'app/helpers/application_helper.rb' - - 'app/models/cve.rb' - - 'app/models/glsa.rb' - - 'app/models/user.rb' - - 'lib/authentication.rb' - - 'lib/bugzilla.rb' - - 'lib/glsamaker/bugs.rb' - - 'lib/glsamaker/diff.rb' - - 'lib/glsamaker/portage.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -Style/BlockComments: - Exclude: - - 'app/models/revision.rb' - -# Offense count: 13 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, ProceduralMethods, FunctionalMethods, IgnoredMethods, AllowBracesOnProceduralOneLiners. -# SupportedStyles: line_count_based, semantic, braces_for_chaining, always_braces -# ProceduralMethods: benchmark, bm, bmbm, create, each_with_object, measure, new, realtime, tap, with_object -# FunctionalMethods: let, let!, subject, watch -# IgnoredMethods: lambda, proc, it -Style/BlockDelimiters: - Exclude: - - 'app/controllers/cve_controller.rb' - - 'app/controllers/glsa_controller.rb' - - 'config/deploy.rb' - - 'lib/glsamaker/http.rb' - - 'test/unit/cve_test.rb' - -# Offense count: 13 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle. -# SupportedStyles: braces, no_braces, context_dependent -Style/BracesAroundHashParameters: - Exclude: - - 'app/controllers/cve_controller.rb' - - 'app/controllers/glsa_controller.rb' - - 'app/views/glsa/_glsa.xml.builder' - - 'config/deploy.rb' - - 'lib/bugzilla.rb' - - 'lib/glsamaker/http.rb' - - 'test/integration/authentication_test.rb' - -# Offense count: 11 -# Cop supports --auto-correct. -# Configuration parameters: AutoCorrect, EnforcedStyle. -# SupportedStyles: nested, compact -Style/ClassAndModuleChildren: - Exclude: - - 'app/controllers/admin/index_controller.rb' - - 'app/controllers/admin/templates_controller.rb' - - 'app/controllers/admin/users_controller.rb' - - 'app/helpers/admin/index_helper.rb' - - 'app/helpers/admin/templates_helper.rb' - - 'app/helpers/admin/users_helper.rb' - - 'lib/bugzilla/history.rb' - - 'test/functional/admin/index_controller_test.rb' - - 'test/functional/admin/templates_controller_test.rb' - - 'test/functional/admin/users_controller_test.rb' - - 'test/test_helper.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -Style/ColonMethodCall: - Exclude: - - 'app/models/cve.rb' - -# Offense count: 13 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SingleLineConditionsOnly, IncludeTernaryExpressions. -# SupportedStyles: assign_to_condition, assign_inside_condition -Style/ConditionalAssignment: - Exclude: - - 'app/controllers/glsa_controller.rb' - - 'app/helpers/application_helper.rb' - - 'app/models/cve.rb' - - 'lib/glsamaker/bugs.rb' - - 'lib/glsamaker/portage.rb' - - 'lib/glsamaker/spelling.rb' - - 'lib/tasks/import.rake' - - 'lib/tasks/rcov.rake' - -# Offense count: 1 -# Cop supports --auto-correct. -Style/DefWithParentheses: - Exclude: - - 'lib/bugzilla/bug.rb' - -# Offense count: 4 -# Cop supports --auto-correct. -Style/EmptyLiteral: - Exclude: - - 'lib/tasks/import.rake' - - 'lib/tasks/rcov.rake' - -# Offense count: 6 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle. -# SupportedStyles: compact, expanded -Style/EmptyMethod: - Exclude: - - 'app/controllers/admin/index_controller.rb' - - 'app/controllers/bugs_controller.rb' - - 'app/controllers/comments_controller.rb' - - 'app/controllers/search_controller.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -Style/Encoding: - Exclude: - - 'db/schema.rb' - -# Offense count: 10 -# Cop supports --auto-correct. -Style/ExpandPathArguments: - Exclude: - - 'Rakefile' - - 'bin/bundle' - - 'bin/rails' - - 'bin/setup' - - 'config/application.rb' - - 'config/boot.rb' - - 'config/environment.rb' - - 'script/rails' - - 'test/test_helper.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle. -# SupportedStyles: each, for -Style/For: - Exclude: - - 'lib/tasks/rcov.rake' - -# Offense count: 13 -# Configuration parameters: EnforcedStyle. -# SupportedStyles: annotated, template, unannotated -Style/FormatStringToken: - Exclude: - - 'app/controllers/cve_controller.rb' - - 'app/helpers/application_helper.rb' - - 'app/models/cve.rb' - -# Offense count: 159 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle. -# SupportedStyles: always, never -Style/FrozenStringLiteralComment: - Enabled: false - -# Offense count: 17 -# Configuration parameters: MinBodyLength. -Style/GuardClause: - Exclude: - - 'app/controllers/admin/users_controller.rb' - - 'app/controllers/cve_controller.rb' - - 'app/controllers/glsa_controller.rb' - - 'app/models/comment.rb' - - 'app/models/glsa.rb' - - 'lib/authentication.rb' - - 'lib/bugzilla.rb' - - 'lib/bugzilla/bug.rb' - - 'lib/glsamaker/bugs.rb' - - 'lib/glsamaker/mail.rb' - - 'lib/glsamaker/portage.rb' - -# Offense count: 550 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, UseHashRocketsWithSymbolValues, PreferHashRocketsForNonAlnumEndingSymbols. -# SupportedStyles: ruby19, hash_rockets, no_mixed_keys, ruby19_no_mixed_keys -Style/HashSyntax: - Enabled: false - -# Offense count: 5 -# Configuration parameters: AllowIfModifier. -Style/IfInsideElse: - Exclude: - - 'app/helpers/application_helper.rb' - - 'lib/glsamaker/bugs.rb' - - 'lib/tasks/cve.rake' - -# Offense count: 40 -# Cop supports --auto-correct. -Style/IfUnlessModifier: - Enabled: false - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: InverseMethods, InverseBlocks. -Style/InverseMethods: - Exclude: - - 'app/views/glsa/_glsa.xml.builder' - -# Offense count: 1 -# Cop supports --auto-correct. -Style/LineEndConcatenation: - Exclude: - - 'db/migrate/20100918223549_add_system_user.rb' - -# Offense count: 3 -# Cop supports --auto-correct. -# Configuration parameters: IgnoredMethods. -Style/MethodCallWithoutArgsParentheses: - Exclude: - - 'app/helpers/glsa_helper.rb' - - 'lib/tasks/import.rake' - -# Offense count: 2 -# Cop supports --auto-correct. -Style/MultilineIfThen: - Exclude: - - 'lib/authentication.rb' - - 'script/db-backup' - -# Offense count: 18 -# Cop supports --auto-correct. -Style/MultilineWhenThen: - Exclude: - - 'lib/bugzilla/bug.rb' - -# Offense count: 14 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle. -# SupportedStyles: literals, strict -Style/MutableConstant: - Exclude: - - 'config/environment.rb' - - 'config/initializers/glsamaker-global.rb' - - 'config/initializers/glsamaker.rb' - - 'lib/kramdown_ext.rb' - - 'lib/tasks/cve.rake' - - 'lib/tasks/import.rake' - - 'script/db-backup' - -# Offense count: 5 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle. -# SupportedStyles: both, prefix, postfix -Style/NegatedIf: - Exclude: - - 'app/controllers/glsa_controller.rb' - - 'app/models/glsa.rb' - - 'lib/tasks/import.rake' - -# Offense count: 4 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, MinBodyLength. -# SupportedStyles: skip_modifier_ifs, always -Style/Next: - Exclude: - - 'app/controllers/tools_controller.rb' - - 'lib/tasks/import.rake' - -# Offense count: 18 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle. -# SupportedStyles: predicate, comparison -Style/NilComparison: - Exclude: - - 'app/controllers/cve_controller.rb' - - 'app/controllers/glsa_controller.rb' - - 'app/controllers/index_controller.rb' - - 'app/controllers/tools_controller.rb' - - 'app/models/user.rb' - - 'lib/authentication.rb' - - 'lib/bugzilla/history.rb' - - 'lib/tasks/import.rake' - -# Offense count: 3 -# Cop supports --auto-correct. -# Configuration parameters: IncludeSemanticChanges. -Style/NonNilCheck: - Exclude: - - 'lib/glsamaker/bugs.rb' - - 'lib/glsamaker/portage.rb' - -# Offense count: 10 -# Cop supports --auto-correct. -Style/Not: - Exclude: - - 'app/controllers/search_controller.rb' - - 'app/models/glsa.rb' - - 'app/models/user.rb' - - 'lib/glsamaker/bugs.rb' - - 'lib/tasks/import.rake' - -# Offense count: 2 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedOctalStyle. -# SupportedOctalStyles: zero_with_o, zero_only -Style/NumericLiteralPrefix: - Exclude: - - 'lib/bugzilla.rb' - - 'script/config_init' - -# Offense count: 24 -# Cop supports --auto-correct. -# Configuration parameters: Strict. -Style/NumericLiterals: - MinDigits: 15 - -# Offense count: 28 -# Cop supports --auto-correct. -# Configuration parameters: AutoCorrect, EnforcedStyle, IgnoredMethods. -# SupportedStyles: predicate, comparison -Style/NumericPredicate: - Exclude: - - 'spec/**/*' - - 'app/controllers/admin/users_controller.rb' - - 'app/controllers/glsa_controller.rb' - - 'app/controllers/tools_controller.rb' - - 'app/models/glsa.rb' - - 'app/models/user.rb' - - 'app/views/glsa/_glsa.xml.builder' - - 'lib/authorization.rb' - - 'lib/bugzilla/bug.rb' - - 'lib/glsamaker/bugs.rb' - - 'lib/glsamaker/diff.rb' - - 'lib/tasks/cve.rake' - - 'lib/tasks/import.rake' - -# Offense count: 5 -# Cop supports --auto-correct. -# Configuration parameters: PreferredDelimiters. -Style/PercentLiteralDelimiters: - Exclude: - - 'app/models/package.rb' - - 'config/application.rb' - - 'lib/tasks/cve.rake' - -# Offense count: 38 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle. -# SupportedStyles: short, verbose -Style/PreferredHashMethods: - Exclude: - - 'app/controllers/glsa_controller.rb' - - 'app/helpers/application_helper.rb' - - 'lib/bugzilla.rb' - - 'lib/bugzilla/history.rb' - - 'lib/glsamaker/xml.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -Style/Proc: - Exclude: - - 'app/models/comment.rb' - -# Offense count: 2 -# Cop supports --auto-correct. -Style/RedundantBegin: - Exclude: - - 'app/controllers/bugs_controller.rb' - - 'app/controllers/comments_controller.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -Style/RedundantException: - Exclude: - - 'lib/authentication.rb' - -# Offense count: 8 -# Cop supports --auto-correct. -# Configuration parameters: AllowMultipleReturnValues. -Style/RedundantReturn: - Exclude: - - 'app/controllers/cve_controller.rb' - - 'app/models/glsa.rb' - - 'app/models/revision.rb' - - 'lib/authentication.rb' - - 'lib/glsamaker/bugs.rb' - -# Offense count: 38 -# Cop supports --auto-correct. -Style/RedundantSelf: - Exclude: - - 'app/models/bug.rb' - - 'app/models/cpe.rb' - - 'app/models/cve.rb' - - 'app/models/glsa.rb' - - 'app/models/package.rb' - - 'app/models/revision.rb' - - 'app/models/user.rb' - - 'lib/bugzilla/bug.rb' - - 'lib/glsamaker/bugs.rb' - -# Offense count: 10 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, AllowInnerSlashes. -# SupportedStyles: slashes, percent_r, mixed -Style/RegexpLiteral: - Exclude: - - 'app/controllers/tools_controller.rb' - - 'app/helpers/glsa_helper.rb' - - 'app/models/glsa.rb' - - 'app/models/package.rb' - - 'lib/glsamaker/portage.rb' - -# Offense count: 3 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle. -# SupportedStyles: implicit, explicit -Style/RescueStandardError: - Exclude: - - 'app/helpers/application_helper.rb' - - 'lib/tasks/import.rake' - -# Offense count: 1 -# Cop supports --auto-correct. -Style/SelfAssignment: - Exclude: - - 'lib/tasks/rcov.rake' - -# Offense count: 3 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle. -# SupportedStyles: only_raise, only_fail, semantic -Style/SignalException: - Exclude: - - 'app/controllers/cve_controller.rb' - - 'lib/tasks/cve.rake' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: . -# SupportedStyles: use_perl_names, use_english_names -Style/SpecialGlobalVars: - EnforcedStyle: use_perl_names - -# Offense count: 4 -# Cop supports --auto-correct. -Style/StderrPuts: - Exclude: - - 'lib/tasks/cve.rake' - - 'lib/tasks/rcov.rake' - - 'script/config_init' - -# Offense count: 809 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, ConsistentQuotesInMultiline. -# SupportedStyles: single_quotes, double_quotes -Style/StringLiterals: - Enabled: false - -# Offense count: 10 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle. -# SupportedStyles: single_quotes, double_quotes -Style/StringLiteralsInInterpolation: - Exclude: - - 'app/helpers/glsa_helper.rb' - - 'app/models/cve.rb' - - 'app/models/glsa.rb' - -# Offense count: 11 -# Cop supports --auto-correct. -# Configuration parameters: MinSize. -# SupportedStyles: percent, brackets -Style/SymbolArray: - EnforcedStyle: brackets - -# Offense count: 17 -# Cop supports --auto-correct. -# Configuration parameters: IgnoredMethods. -# IgnoredMethods: respond_to, define_method -Style/SymbolProc: - Exclude: - - 'app/controllers/cve_controller.rb' - - 'app/controllers/glsa_controller.rb' - - 'app/models/cve.rb' - - 'app/models/glsa.rb' - - 'app/models/revision.rb' - - 'app/views/cve/info.json.jbuilder' - - 'lib/glsamaker/diff.rb' - - 'lib/tasks/rcov.rake' - - 'test/unit/glsa_test.rb' - - 'test/unit/revision_test.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, AllowSafeAssignment. -# SupportedStyles: require_parentheses, require_no_parentheses, require_parentheses_when_complex -Style/TernaryParentheses: - Exclude: - - 'app/views/glsa/_glsa.xml.builder' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyleForMultiline. -# SupportedStylesForMultiline: comma, consistent_comma, no_comma -Style/TrailingCommaInHashLiteral: - Exclude: - - 'lib/bugzilla.rb' - -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: ExactNameMatch, AllowPredicates, AllowDSLWriters, IgnoreClassMethods, Whitelist. -# Whitelist: to_ary, to_a, to_c, to_enum, to_h, to_hash, to_i, to_int, to_io, to_open, to_path, to_proc, to_r, to_regexp, to_str, to_s, to_sym -Style/TrivialAccessors: - Exclude: - - 'lib/glsamaker/bugs.rb' - -# Offense count: 3 -# Cop supports --auto-correct. -Style/UnlessElse: - Exclude: - - 'app/controllers/bugs_controller.rb' - - 'app/controllers/comments_controller.rb' - - 'lib/bugzilla/history.rb' - -# Offense count: 2 -# Cop supports --auto-correct. -Style/UnneededInterpolation: - Exclude: - - 'app/views/glsa/_glsa.xml.builder' - - 'lib/tasks/rcov.rake' - -# Offense count: 1 -# Cop supports --auto-correct. -Style/UnpackFirst: - Exclude: - - 'lib/authentication.rb' - -# Offense count: 2 -# Cop supports --auto-correct. -# Configuration parameters: WordRegex. -# SupportedStyles: percent, brackets -Style/WordArray: - EnforcedStyle: percent - MinSize: 6 - -# Offense count: 11 -# Cop supports --auto-correct. -Style/ZeroLengthPredicate: - Exclude: - - 'app/controllers/glsa_controller.rb' - - 'app/controllers/tools_controller.rb' - - 'app/models/glsa.rb' - - 'app/views/glsa/_glsa.xml.builder' - - 'lib/bugzilla/bug.rb' - - 'lib/tasks/cve.rake' - - 'lib/tasks/import.rake' diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index d69e055..0000000 --- a/.travis.yml +++ /dev/null @@ -1,29 +0,0 @@ -language: ruby -cache: bundler -rvm: - - 2.4 - - 2.5 - -gemfiles: - - Gemfile - -branches: - only: - - master - -addons: - mariadb: '10.2' - -before_install: - - gem uninstall -v '>= 2' -i $(rvm gemdir)@global -ax bundler || true - - gem install bundler -v '< 2' - - -before_script: - - sed 's/i_forgot_to_set_this/"test-secret"/' < config/initializers/glsamaker.rb.sample > config/initializers/glsamaker.rb - - cp config/database.yml.mysql config/database.yml - - mysql -e 'CREATE DATABASE glsamaker_test;' - -script: - - bundle exec rubocop - - bundle exec rake test RAILS_ENV=test diff --git a/Capfile b/Capfile deleted file mode 100644 index 1a98f3c..0000000 --- a/Capfile +++ /dev/null @@ -1,4 +0,0 @@ -load 'deploy' if respond_to?(:namespace) # cap2 differentiator -Dir['vendor/plugins/*/recipes/*.rb'].each { |plugin| load(plugin) } - -load 'config/deploy' # remove this line to skip loading any of the default tasks diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..9a13fa3 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,26 @@ +FROM golang:1.14.0 AS builder +WORKDIR /go/src/glsamaker +COPY . /go/src/glsamaker +RUN go get github.com/go-pg/pg/v9 +RUN go get github.com/google/uuid +RUN go get github.com/skip2/go-qrcode +RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o bin . + +FROM node:13 AS assetsbuilder +WORKDIR /go/src/glsamaker +COPY . /go/src/glsamaker +RUN npm install && cd node_modules/@gentoo/tyrian && npm install && npm run dist && cd /go/src/glsamaker +RUN npx webpack + +FROM alpine:latest as certs +RUN apk --update add ca-certificates + +FROM scratch +WORKDIR /go/src/glsamaker +COPY --from=certs /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt +COPY --from=assetsbuilder /go/src/glsamaker/assets /go/src/glsamaker/assets +COPY --from=builder /go/src/glsamaker/bin /go/src/glsamaker/bin +COPY --from=builder /go/src/glsamaker/pkg /go/src/glsamaker/pkg +COPY --from=builder /go/src/glsamaker/web /go/src/glsamaker/web + +CMD ["/go/src/glsamaker/bin/glsamaker"] diff --git a/Dockerfile.dev b/Dockerfile.dev new file mode 100644 index 0000000..902fd47 --- /dev/null +++ b/Dockerfile.dev @@ -0,0 +1,10 @@ +FROM golang:1.14.0 +RUN apt update && apt install -y ca-certificates ntp ntpdate +WORKDIR /go/src/glsamaker +COPY . /go/src/glsamaker +RUN go get github.com/go-pg/pg/v9 +RUN go get github.com/google/uuid +RUN go get github.com/skip2/go-qrcode +RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o bin . + +CMD ["/go/src/glsamaker/bin/glsamaker"] diff --git a/Gemfile b/Gemfile deleted file mode 100644 index ea8c8dc..0000000 --- a/Gemfile +++ /dev/null @@ -1,60 +0,0 @@ -source 'https://rubygems.org' - -gem 'rails', '~> 4.2' -gem 'xmlrpc' -gem 'rake' - -gem 'mysql2', '~> 0.4.10' - -gem 'json', '~> 2.0' -gem 'jbuilder', '~> 2.0' - -# Gems used only for assets and not required -# in production environments by default. -#group :assets do -# gem 'sass-rails', "~> 3.2.0" -# gem 'coffee-rails', "~> 3.2.0" -# gem 'uglifier' -#end - -gem 'prototype-rails', github: 'rails/prototype-rails', branch: '4.2' - -# Use unicorn as the web server -#gem 'unicorn' -gem 'thin' - -# Deploy with Capistrano -gem 'capistrano' - -# gem 'exception_notification' - -group :development do -# No debugger at the moment because of the stupid build system of a dependency of ruby-debug19 -# gem 'ruby-debug', :platforms => :ruby_18 -# gem 'ruby-debug19', :platforms => :ruby_19 -# gem 'require_relative' -end - -gem 'diff-lcs', require: 'diff/lcs' -gem 'nokogiri' -gem 'text-format-revised', require: 'text/format' -gem 'kramdown' - -gem 'thinking-sphinx', '~> 3.1.4' - -#FIXME: runspell 0.0.1 is dead since 2011, we may need -#to create a new spelling module - -#gem 'runspell' - -# gem "rdoc" - -group :test do - gem 'simplecov' - gem 'ci_reporter' - gem 'minitest-reporters' - - gem 'rubocop' - gem 'rubocop-performance' - gem 'rubocop-rails' -end diff --git a/Gemfile.lock b/Gemfile.lock deleted file mode 100644 index 48a2d90..0000000 --- a/Gemfile.lock +++ /dev/null @@ -1,206 +0,0 @@ -GIT - remote: git://github.com/rails/prototype-rails.git - revision: 0fed929ff48c10c3b978edd3baa983a81f404dbf - branch: 4.2 - specs: - prototype-rails (4.0.0) - rails (~> 4.0) - -GEM - remote: https://rubygems.org/ - specs: - actionmailer (4.2.11.1) - actionpack (= 4.2.11.1) - actionview (= 4.2.11.1) - activejob (= 4.2.11.1) - mail (~> 2.5, >= 2.5.4) - rails-dom-testing (~> 1.0, >= 1.0.5) - actionpack (4.2.11.1) - actionview (= 4.2.11.1) - activesupport (= 4.2.11.1) - rack (~> 1.6) - rack-test (~> 0.6.2) - rails-dom-testing (~> 1.0, >= 1.0.5) - rails-html-sanitizer (~> 1.0, >= 1.0.2) - actionview (4.2.11.1) - activesupport (= 4.2.11.1) - builder (~> 3.1) - erubis (~> 2.7.0) - rails-dom-testing (~> 1.0, >= 1.0.5) - rails-html-sanitizer (~> 1.0, >= 1.0.3) - activejob (4.2.11.1) - activesupport (= 4.2.11.1) - globalid (>= 0.3.0) - activemodel (4.2.11.1) - activesupport (= 4.2.11.1) - builder (~> 3.1) - activerecord (4.2.11.1) - activemodel (= 4.2.11.1) - activesupport (= 4.2.11.1) - arel (~> 6.0) - activesupport (4.2.11.1) - i18n (~> 0.7) - minitest (~> 5.1) - thread_safe (~> 0.3, >= 0.3.4) - tzinfo (~> 1.1) - airbrussh (1.3.2) - sshkit (>= 1.6.1, != 1.7.0) - ansi (1.5.0) - arel (6.0.4) - ast (2.4.0) - builder (3.2.3) - capistrano (3.11.0) - airbrussh (>= 1.0.0) - i18n - rake (>= 10.0.0) - sshkit (>= 1.9.0) - ci_reporter (2.0.0) - builder (>= 2.1.2) - concurrent-ruby (1.1.5) - crass (1.0.4) - daemons (1.3.1) - diff-lcs (1.3) - docile (1.3.2) - erubis (2.7.0) - eventmachine (1.2.7) - globalid (0.4.2) - activesupport (>= 4.2.0) - i18n (0.9.5) - concurrent-ruby (~> 1.0) - innertube (1.1.0) - jaro_winkler (1.5.3) - jbuilder (2.9.1) - activesupport (>= 4.2.0) - joiner (0.3.4) - activerecord (>= 4.1.0) - json (2.2.0) - kramdown (2.1.0) - loofah (2.2.3) - crass (~> 1.0.2) - nokogiri (>= 1.5.9) - mail (2.7.1) - mini_mime (>= 0.1.1) - middleware (0.1.0) - mini_mime (1.0.2) - mini_portile2 (2.4.0) - minitest (5.11.3) - minitest-reporters (1.3.6) - ansi - builder - minitest (>= 5.0) - ruby-progressbar - mysql2 (0.4.10) - net-scp (2.0.0) - net-ssh (>= 2.6.5, < 6.0.0) - net-ssh (5.2.0) - nokogiri (1.10.3) - mini_portile2 (~> 2.4.0) - parallel (1.17.0) - parser (2.6.3.0) - ast (~> 2.4.0) - rack (1.6.11) - rack-test (0.6.3) - rack (>= 1.0) - rails (4.2.11.1) - actionmailer (= 4.2.11.1) - actionpack (= 4.2.11.1) - actionview (= 4.2.11.1) - activejob (= 4.2.11.1) - activemodel (= 4.2.11.1) - activerecord (= 4.2.11.1) - activesupport (= 4.2.11.1) - bundler (>= 1.3.0, < 2.0) - railties (= 4.2.11.1) - sprockets-rails - rails-deprecated_sanitizer (1.0.3) - activesupport (>= 4.2.0.alpha) - rails-dom-testing (1.0.9) - activesupport (>= 4.2.0, < 5.0) - nokogiri (~> 1.6) - rails-deprecated_sanitizer (>= 1.0.1) - rails-html-sanitizer (1.0.4) - loofah (~> 2.2, >= 2.2.2) - railties (4.2.11.1) - actionpack (= 4.2.11.1) - activesupport (= 4.2.11.1) - rake (>= 0.8.7) - thor (>= 0.18.1, < 2.0) - rainbow (3.0.0) - rake (12.3.3) - riddle (2.3.2) - rubocop (0.73.0) - jaro_winkler (~> 1.5.1) - parallel (~> 1.10) - parser (>= 2.6) - rainbow (>= 2.2.2, < 4.0) - ruby-progressbar (~> 1.7) - unicode-display_width (>= 1.4.0, < 1.7) - rubocop-performance (1.4.0) - rubocop (>= 0.71.0) - rubocop-rails (2.2.1) - rack (>= 1.1) - rubocop (>= 0.72.0) - ruby-progressbar (1.10.1) - simplecov (0.17.0) - docile (~> 1.1) - json (>= 1.8, < 3) - simplecov-html (~> 0.10.0) - simplecov-html (0.10.2) - sprockets (3.7.2) - concurrent-ruby (~> 1.0) - rack (> 1, < 3) - sprockets-rails (3.2.1) - actionpack (>= 4.0) - activesupport (>= 4.0) - sprockets (>= 3.0.0) - sshkit (1.19.1) - net-scp (>= 1.1.2) - net-ssh (>= 2.8.0) - text-format-revised (1.1.0) - text-hyphen (~> 1.2.0) - text-hyphen (1.2) - thin (1.7.2) - daemons (~> 1.0, >= 1.0.9) - eventmachine (~> 1.0, >= 1.0.4) - rack (>= 1, < 3) - thinking-sphinx (3.1.4) - activerecord (>= 3.1.0) - builder (>= 2.1.2) - innertube (>= 1.0.2) - joiner (>= 0.2.0) - middleware (>= 0.1.0) - riddle (>= 1.5.11) - thor (0.20.3) - thread_safe (0.3.6) - tzinfo (1.2.5) - thread_safe (~> 0.1) - unicode-display_width (1.6.0) - xmlrpc (0.3.0) - -PLATFORMS - ruby - -DEPENDENCIES - capistrano - ci_reporter - diff-lcs - jbuilder (~> 2.0) - json (~> 2.0) - kramdown - minitest-reporters - mysql2 (~> 0.4.10) - nokogiri - prototype-rails! - rails (~> 4.2) - rake - rubocop - rubocop-performance - rubocop-rails - simplecov - text-format-revised - thin - thinking-sphinx (~> 3.1.4) - xmlrpc - -BUNDLED WITH - 1.17.3 diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 2def0e8..0000000 --- a/LICENSE +++ /dev/null @@ -1,661 +0,0 @@ - GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU Affero General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -. \ No newline at end of file diff --git a/README b/README deleted file mode 100644 index 37ec8ea..0000000 --- a/README +++ /dev/null @@ -1,243 +0,0 @@ -== Welcome to Rails - -Rails is a web-application framework that includes everything needed to create -database-backed web applications according to the Model-View-Control pattern. - -This pattern splits the view (also called the presentation) into "dumb" templates -that are primarily responsible for inserting pre-built data in between HTML tags. -The model contains the "smart" domain objects (such as Account, Product, Person, -Post) that holds all the business logic and knows how to persist themselves to -a database. The controller handles the incoming requests (such as Save New Account, -Update Product, Show Post) by manipulating the model and directing data to the view. - -In Rails, the model is handled by what's called an object-relational mapping -layer entitled Active Record. This layer allows you to present the data from -database rows as objects and embellish these data objects with business logic -methods. You can read more about Active Record in -link:files/vendor/rails/activerecord/README.html. - -The controller and view are handled by the Action Pack, which handles both -layers by its two parts: Action View and Action Controller. These two layers -are bundled in a single package due to their heavy interdependence. This is -unlike the relationship between the Active Record and Action Pack that is much -more separate. Each of these packages can be used independently outside of -Rails. You can read more about Action Pack in -link:files/vendor/rails/actionpack/README.html. - - -== Getting Started - -1. At the command prompt, start a new Rails application using the rails command - and your application name. Ex: rails myapp -2. Change directory into myapp and start the web server: script/server (run with --help for options) -3. Go to http://localhost:3000/ and get "Welcome aboard: You're riding the Rails!" -4. Follow the guidelines to start developing your application - - -== Web Servers - -By default, Rails will try to use Mongrel if it's are installed when started with script/server, otherwise Rails will use WEBrick, the webserver that ships with Ruby. But you can also use Rails -with a variety of other web servers. - -Mongrel is a Ruby-based webserver with a C component (which requires compilation) that is -suitable for development and deployment of Rails applications. If you have Ruby Gems installed, -getting up and running with mongrel is as easy as: gem install mongrel. -More info at: http://mongrel.rubyforge.org - -Say other Ruby web servers like Thin and Ebb or regular web servers like Apache or LiteSpeed or -Lighttpd or IIS. The Ruby web servers are run through Rack and the latter can either be setup to use -FCGI or proxy to a pack of Mongrels/Thin/Ebb servers. - -== Apache .htaccess example for FCGI/CGI - -# General Apache options -AddHandler fastcgi-script .fcgi -AddHandler cgi-script .cgi -Options +FollowSymLinks +ExecCGI - -# If you don't want Rails to look in certain directories, -# use the following rewrite rules so that Apache won't rewrite certain requests -# -# Example: -# RewriteCond %{REQUEST_URI} ^/notrails.* -# RewriteRule .* - [L] - -# Redirect all requests not available on the filesystem to Rails -# By default the cgi dispatcher is used which is very slow -# -# For better performance replace the dispatcher with the fastcgi one -# -# Example: -# RewriteRule ^(.*)$ dispatch.fcgi [QSA,L] -RewriteEngine On - -# If your Rails application is accessed via an Alias directive, -# then you MUST also set the RewriteBase in this htaccess file. -# -# Example: -# Alias /myrailsapp /path/to/myrailsapp/public -# RewriteBase /myrailsapp - -RewriteRule ^$ index.html [QSA] -RewriteRule ^([^.]+)$ $1.html [QSA] -RewriteCond %{REQUEST_FILENAME} !-f -RewriteRule ^(.*)$ dispatch.cgi [QSA,L] - -# In case Rails experiences terminal errors -# Instead of displaying this message you can supply a file here which will be rendered instead -# -# Example: -# ErrorDocument 500 /500.html - -ErrorDocument 500 "

Application error

Rails application failed to start properly" - - -== Debugging Rails - -Sometimes your application goes wrong. Fortunately there are a lot of tools that -will help you debug it and get it back on the rails. - -First area to check is the application log files. Have "tail -f" commands running -on the server.log and development.log. Rails will automatically display debugging -and runtime information to these files. Debugging info will also be shown in the -browser on requests from 127.0.0.1. - -You can also log your own messages directly into the log file from your code using -the Ruby logger class from inside your controllers. Example: - - class WeblogController < ActionController::Base - def destroy - @weblog = Weblog.find(params[:id]) - @weblog.destroy - logger.info("#{Time.now} Destroyed Weblog ID ##{@weblog.id}!") - end - end - -The result will be a message in your log file along the lines of: - - Mon Oct 08 14:22:29 +1000 2007 Destroyed Weblog ID #1 - -More information on how to use the logger is at http://www.ruby-doc.org/core/ - -Also, Ruby documentation can be found at http://www.ruby-lang.org/ including: - -* The Learning Ruby (Pickaxe) Book: http://www.ruby-doc.org/docs/ProgrammingRuby/ -* Learn to Program: http://pine.fm/LearnToProgram/ (a beginners guide) - -These two online (and free) books will bring you up to speed on the Ruby language -and also on programming in general. - - -== Debugger - -Debugger support is available through the debugger command when you start your Mongrel or -Webrick server with --debugger. This means that you can break out of execution at any point -in the code, investigate and change the model, AND then resume execution! -You need to install ruby-debug to run the server in debugging mode. With gems, use 'gem install ruby-debug' -Example: - - class WeblogController < ActionController::Base - def index - @posts = Post.find(:all) - debugger - end - end - -So the controller will accept the action, run the first line, then present you -with a IRB prompt in the server window. Here you can do things like: - - >> @posts.inspect - => "[#nil, \"body\"=>nil, \"id\"=>\"1\"}>, - #\"Rails you know!\", \"body\"=>\"Only ten..\", \"id\"=>\"2\"}>]" - >> @posts.first.title = "hello from a debugger" - => "hello from a debugger" - -...and even better is that you can examine how your runtime objects actually work: - - >> f = @posts.first - => #nil, "body"=>nil, "id"=>"1"}> - >> f. - Display all 152 possibilities? (y or n) - -Finally, when you're ready to resume execution, you enter "cont" - - -== Console - -You can interact with the domain model by starting the console through script/console. -Here you'll have all parts of the application configured, just like it is when the -application is running. You can inspect domain models, change values, and save to the -database. Starting the script without arguments will launch it in the development environment. -Passing an argument will specify a different environment, like script/console production. - -To reload your controllers and models after launching the console run reload! - -== dbconsole - -You can go to the command line of your database directly through script/dbconsole. -You would be connected to the database with the credentials defined in database.yml. -Starting the script without arguments will connect you to the development database. Passing an -argument will connect you to a different database, like script/dbconsole production. -Currently works for mysql, postgresql and sqlite. - -== Description of Contents - -app - Holds all the code that's specific to this particular application. - -app/controllers - Holds controllers that should be named like weblogs_controller.rb for - automated URL mapping. All controllers should descend from ApplicationController - which itself descends from ActionController::Base. - -app/models - Holds models that should be named like post.rb. - Most models will descend from ActiveRecord::Base. - -app/views - Holds the template files for the view that should be named like - weblogs/index.html.erb for the WeblogsController#index action. All views use eRuby - syntax. - -app/views/layouts - Holds the template files for layouts to be used with views. This models the common - header/footer method of wrapping views. In your views, define a layout using the - layout :default and create a file named default.html.erb. Inside default.html.erb, - call <% yield %> to render the view using this layout. - -app/helpers - Holds view helpers that should be named like weblogs_helper.rb. These are generated - for you automatically when using script/generate for controllers. Helpers can be used to - wrap functionality for your views into methods. - -config - Configuration files for the Rails environment, the routing map, the database, and other dependencies. - -db - Contains the database schema in schema.rb. db/migrate contains all - the sequence of Migrations for your schema. - -doc - This directory is where your application documentation will be stored when generated - using rake doc:app - -lib - Application specific libraries. Basically, any kind of custom code that doesn't - belong under controllers, models, or helpers. This directory is in the load path. - -public - The directory available for the web server. Contains subdirectories for images, stylesheets, - and javascripts. Also contains the dispatchers and the default HTML files. This should be - set as the DOCUMENT_ROOT of your web server. - -script - Helper scripts for automation and generation. - -test - Unit and functional tests along with fixtures. When using the script/generate scripts, template - test files will be generated for you and placed in this directory. - -vendor - External libraries that the application depends on. Also includes the plugins subdirectory. - If the app has frozen rails, those gems also go here, under vendor/rails/. - This directory is in the load path. diff --git a/Rakefile b/Rakefile deleted file mode 100644 index 463f2f4..0000000 --- a/Rakefile +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env rake -# Add your own tasks in files placed in lib/tasks ending in .rake, -# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. - -require File.expand_path('../config/application', __FILE__) - -Glsamaker::Application.load_tasks - -begin - require 'ci/reporter/rake/test_unit' -rescue LoadError -end diff --git a/app/assets/images/biglogo.png b/app/assets/images/biglogo.png deleted file mode 100644 index 58fc589..0000000 Binary files a/app/assets/images/biglogo.png and /dev/null differ diff --git a/app/assets/images/cvetool-logo.png b/app/assets/images/cvetool-logo.png deleted file mode 100644 index 2546cc7..0000000 Binary files a/app/assets/images/cvetool-logo.png and /dev/null differ diff --git a/app/assets/images/icons/access.png b/app/assets/images/icons/access.png deleted file mode 100755 index a9e1d4a..0000000 Binary files a/app/assets/images/icons/access.png and /dev/null differ diff --git a/app/assets/images/icons/admin.png b/app/assets/images/icons/admin.png deleted file mode 100644 index 565a933..0000000 Binary files a/app/assets/images/icons/admin.png and /dev/null differ diff --git a/app/assets/images/icons/affected.png b/app/assets/images/icons/affected.png deleted file mode 100755 index 25ea793..0000000 Binary files a/app/assets/images/icons/affected.png and /dev/null differ diff --git a/app/assets/images/icons/approval.png b/app/assets/images/icons/approval.png deleted file mode 100644 index a12a1d0..0000000 Binary files a/app/assets/images/icons/approval.png and /dev/null differ diff --git a/app/assets/images/icons/approved.png b/app/assets/images/icons/approved.png deleted file mode 100755 index 210b1a6..0000000 Binary files a/app/assets/images/icons/approved.png and /dev/null differ diff --git a/app/assets/images/icons/arch.png b/app/assets/images/icons/arch.png deleted file mode 100755 index 9db64b5..0000000 Binary files a/app/assets/images/icons/arch.png and /dev/null differ diff --git a/app/assets/images/icons/atom.png b/app/assets/images/icons/atom.png deleted file mode 100755 index 200a5fd..0000000 Binary files a/app/assets/images/icons/atom.png and /dev/null differ diff --git a/app/assets/images/icons/auto.png b/app/assets/images/icons/auto.png deleted file mode 100755 index 19dfc93..0000000 Binary files a/app/assets/images/icons/auto.png and /dev/null differ diff --git a/app/assets/images/icons/background-go.png b/app/assets/images/icons/background-go.png deleted file mode 100755 index acaea0f..0000000 Binary files a/app/assets/images/icons/background-go.png and /dev/null differ diff --git a/app/assets/images/icons/background.png b/app/assets/images/icons/background.png deleted file mode 100755 index be7001f..0000000 Binary files a/app/assets/images/icons/background.png and /dev/null differ diff --git a/app/assets/images/icons/bug-grey.png b/app/assets/images/icons/bug-grey.png deleted file mode 100644 index a6f8396..0000000 Binary files a/app/assets/images/icons/bug-grey.png and /dev/null differ diff --git a/app/assets/images/icons/bug.png b/app/assets/images/icons/bug.png deleted file mode 100755 index 242d539..0000000 Binary files a/app/assets/images/icons/bug.png and /dev/null differ diff --git a/app/assets/images/icons/bug_add.png b/app/assets/images/icons/bug_add.png deleted file mode 100755 index fe12b19..0000000 Binary files a/app/assets/images/icons/bug_add.png and /dev/null differ diff --git a/app/assets/images/icons/bug_new.png b/app/assets/images/icons/bug_new.png deleted file mode 100755 index 9076cc5..0000000 Binary files a/app/assets/images/icons/bug_new.png and /dev/null differ diff --git a/app/assets/images/icons/calendar-select-month.png b/app/assets/images/icons/calendar-select-month.png deleted file mode 100644 index 4f5ed55..0000000 Binary files a/app/assets/images/icons/calendar-select-month.png and /dev/null differ diff --git a/app/assets/images/icons/checkboxes.png b/app/assets/images/icons/checkboxes.png deleted file mode 100755 index 05eed23..0000000 Binary files a/app/assets/images/icons/checkboxes.png and /dev/null differ diff --git a/app/assets/images/icons/close.png b/app/assets/images/icons/close.png deleted file mode 100644 index 237ae2a..0000000 Binary files a/app/assets/images/icons/close.png and /dev/null differ diff --git a/app/assets/images/icons/comment.png b/app/assets/images/icons/comment.png deleted file mode 100644 index 7bc9233..0000000 Binary files a/app/assets/images/icons/comment.png and /dev/null differ diff --git a/app/assets/images/icons/commented.png b/app/assets/images/icons/commented.png deleted file mode 100755 index 9926e5d..0000000 Binary files a/app/assets/images/icons/commented.png and /dev/null differ diff --git a/app/assets/images/icons/confidential.png b/app/assets/images/icons/confidential.png deleted file mode 100755 index ec71aec..0000000 Binary files a/app/assets/images/icons/confidential.png and /dev/null differ diff --git a/app/assets/images/icons/delete.png b/app/assets/images/icons/delete.png deleted file mode 100755 index 70b59dc..0000000 Binary files a/app/assets/images/icons/delete.png and /dev/null differ diff --git a/app/assets/images/icons/diff.png b/app/assets/images/icons/diff.png deleted file mode 100644 index d4d1b56..0000000 Binary files a/app/assets/images/icons/diff.png and /dev/null differ diff --git a/app/assets/images/icons/dock-right.png b/app/assets/images/icons/dock-right.png deleted file mode 100644 index 0e51904..0000000 Binary files a/app/assets/images/icons/dock-right.png and /dev/null differ diff --git a/app/assets/images/icons/document-go.png b/app/assets/images/icons/document-go.png deleted file mode 100755 index f3e265d..0000000 Binary files a/app/assets/images/icons/document-go.png and /dev/null differ diff --git a/app/assets/images/icons/document.png b/app/assets/images/icons/document.png deleted file mode 100755 index 75f92b0..0000000 Binary files a/app/assets/images/icons/document.png and /dev/null differ diff --git a/app/assets/images/icons/draft.png b/app/assets/images/icons/draft.png deleted file mode 100755 index 0e2b42d..0000000 Binary files a/app/assets/images/icons/draft.png and /dev/null differ diff --git a/app/assets/images/icons/edit-small.png b/app/assets/images/icons/edit-small.png deleted file mode 100755 index 3d81c2f..0000000 Binary files a/app/assets/images/icons/edit-small.png and /dev/null differ diff --git a/app/assets/images/icons/edit.png b/app/assets/images/icons/edit.png deleted file mode 100644 index 0bfecd5..0000000 Binary files a/app/assets/images/icons/edit.png and /dev/null differ diff --git a/app/assets/images/icons/error.png b/app/assets/images/icons/error.png deleted file mode 100644 index 0496522..0000000 Binary files a/app/assets/images/icons/error.png and /dev/null differ diff --git a/app/assets/images/icons/flag-green.png b/app/assets/images/icons/flag-green.png deleted file mode 100644 index 6747730..0000000 Binary files a/app/assets/images/icons/flag-green.png and /dev/null differ diff --git a/app/assets/images/icons/flag.png b/app/assets/images/icons/flag.png deleted file mode 100644 index 5c008b0..0000000 Binary files a/app/assets/images/icons/flag.png and /dev/null differ diff --git a/app/assets/images/icons/glsa.png b/app/assets/images/icons/glsa.png deleted file mode 100644 index 779ad58..0000000 Binary files a/app/assets/images/icons/glsa.png and /dev/null differ diff --git a/app/assets/images/icons/glsa_draft.png b/app/assets/images/icons/glsa_draft.png deleted file mode 100644 index c61a6d8..0000000 Binary files a/app/assets/images/icons/glsa_draft.png and /dev/null differ diff --git a/app/assets/images/icons/glsa_new.png b/app/assets/images/icons/glsa_new.png deleted file mode 100644 index d5eac9b..0000000 Binary files a/app/assets/images/icons/glsa_new.png and /dev/null differ diff --git a/app/assets/images/icons/glsa_ready.png b/app/assets/images/icons/glsa_ready.png deleted file mode 100755 index c17bb7d..0000000 Binary files a/app/assets/images/icons/glsa_ready.png and /dev/null differ diff --git a/app/assets/images/icons/glsa_request.png b/app/assets/images/icons/glsa_request.png deleted file mode 100644 index f35a979..0000000 Binary files a/app/assets/images/icons/glsa_request.png and /dev/null differ diff --git a/app/assets/images/icons/glsa_sent.png b/app/assets/images/icons/glsa_sent.png deleted file mode 100644 index 1c856cd..0000000 Binary files a/app/assets/images/icons/glsa_sent.png and /dev/null differ diff --git a/app/assets/images/icons/impact.png b/app/assets/images/icons/impact.png deleted file mode 100644 index fa96cdd..0000000 Binary files a/app/assets/images/icons/impact.png and /dev/null differ diff --git a/app/assets/images/icons/info.png b/app/assets/images/icons/info.png deleted file mode 100644 index bd9fd94..0000000 Binary files a/app/assets/images/icons/info.png and /dev/null differ diff --git a/app/assets/images/icons/keyword.png b/app/assets/images/icons/keyword.png deleted file mode 100755 index ab11ce2..0000000 Binary files a/app/assets/images/icons/keyword.png and /dev/null differ diff --git a/app/assets/images/icons/larr.png b/app/assets/images/icons/larr.png deleted file mode 100644 index cdf1fb0..0000000 Binary files a/app/assets/images/icons/larr.png and /dev/null differ diff --git a/app/assets/images/icons/less_width.png b/app/assets/images/icons/less_width.png deleted file mode 100755 index 868cd87..0000000 Binary files a/app/assets/images/icons/less_width.png and /dev/null differ diff --git a/app/assets/images/icons/logout.png b/app/assets/images/icons/logout.png deleted file mode 100644 index 2541d2b..0000000 Binary files a/app/assets/images/icons/logout.png and /dev/null differ diff --git a/app/assets/images/icons/metadata.png b/app/assets/images/icons/metadata.png deleted file mode 100755 index 83f17cc..0000000 Binary files a/app/assets/images/icons/metadata.png and /dev/null differ diff --git a/app/assets/images/icons/minus-small.png b/app/assets/images/icons/minus-small.png deleted file mode 100644 index 46c4c0d..0000000 Binary files a/app/assets/images/icons/minus-small.png and /dev/null differ diff --git a/app/assets/images/icons/minus.png b/app/assets/images/icons/minus.png deleted file mode 100644 index f953427..0000000 Binary files a/app/assets/images/icons/minus.png and /dev/null differ diff --git a/app/assets/images/icons/more_width.png b/app/assets/images/icons/more_width.png deleted file mode 100755 index 2af50ef..0000000 Binary files a/app/assets/images/icons/more_width.png and /dev/null differ diff --git a/app/assets/images/icons/next.png b/app/assets/images/icons/next.png deleted file mode 100644 index 5102071..0000000 Binary files a/app/assets/images/icons/next.png and /dev/null differ diff --git a/app/assets/images/icons/not-approved.png b/app/assets/images/icons/not-approved.png deleted file mode 100755 index 20d6f5e..0000000 Binary files a/app/assets/images/icons/not-approved.png and /dev/null differ diff --git a/app/assets/images/icons/note.png b/app/assets/images/icons/note.png deleted file mode 100755 index adaf4f0..0000000 Binary files a/app/assets/images/icons/note.png and /dev/null differ diff --git a/app/assets/images/icons/ok.png b/app/assets/images/icons/ok.png deleted file mode 100644 index dff03da..0000000 Binary files a/app/assets/images/icons/ok.png and /dev/null differ diff --git a/app/assets/images/icons/package-add.png b/app/assets/images/icons/package-add.png deleted file mode 100755 index 9cea3b8..0000000 Binary files a/app/assets/images/icons/package-add.png and /dev/null differ diff --git a/app/assets/images/icons/package-go.png b/app/assets/images/icons/package-go.png deleted file mode 100755 index 4b8d163..0000000 Binary files a/app/assets/images/icons/package-go.png and /dev/null differ diff --git a/app/assets/images/icons/package-remove.png b/app/assets/images/icons/package-remove.png deleted file mode 100755 index 16c299f..0000000 Binary files a/app/assets/images/icons/package-remove.png and /dev/null differ diff --git a/app/assets/images/icons/package.png b/app/assets/images/icons/package.png deleted file mode 100755 index 78578c0..0000000 Binary files a/app/assets/images/icons/package.png and /dev/null differ diff --git a/app/assets/images/icons/paste.png b/app/assets/images/icons/paste.png deleted file mode 100644 index c0490eb..0000000 Binary files a/app/assets/images/icons/paste.png and /dev/null differ diff --git a/app/assets/images/icons/pending.png b/app/assets/images/icons/pending.png deleted file mode 100644 index c28a746..0000000 Binary files a/app/assets/images/icons/pending.png and /dev/null differ diff --git a/app/assets/images/icons/permission.png b/app/assets/images/icons/permission.png deleted file mode 100644 index 4ec1a92..0000000 Binary files a/app/assets/images/icons/permission.png and /dev/null differ diff --git a/app/assets/images/icons/plus-small.png b/app/assets/images/icons/plus-small.png deleted file mode 100644 index 33cf9af..0000000 Binary files a/app/assets/images/icons/plus-small.png and /dev/null differ diff --git a/app/assets/images/icons/plus.png b/app/assets/images/icons/plus.png deleted file mode 100644 index 3f2e8f7..0000000 Binary files a/app/assets/images/icons/plus.png and /dev/null differ diff --git a/app/assets/images/icons/profile.png b/app/assets/images/icons/profile.png deleted file mode 100644 index c02f315..0000000 Binary files a/app/assets/images/icons/profile.png and /dev/null differ diff --git a/app/assets/images/icons/public.png b/app/assets/images/icons/public.png deleted file mode 100755 index 1fff57c..0000000 Binary files a/app/assets/images/icons/public.png and /dev/null differ diff --git a/app/assets/images/icons/reference-add.png b/app/assets/images/icons/reference-add.png deleted file mode 100755 index 689c34c..0000000 Binary files a/app/assets/images/icons/reference-add.png and /dev/null differ diff --git a/app/assets/images/icons/reference-remove.png b/app/assets/images/icons/reference-remove.png deleted file mode 100755 index 8565b4d..0000000 Binary files a/app/assets/images/icons/reference-remove.png and /dev/null differ diff --git a/app/assets/images/icons/reference.png b/app/assets/images/icons/reference.png deleted file mode 100755 index 449037c..0000000 Binary files a/app/assets/images/icons/reference.png and /dev/null differ diff --git a/app/assets/images/icons/refresh.png b/app/assets/images/icons/refresh.png deleted file mode 100755 index 6d68b75..0000000 Binary files a/app/assets/images/icons/refresh.png and /dev/null differ diff --git a/app/assets/images/icons/rejection.png b/app/assets/images/icons/rejection.png deleted file mode 100644 index 558b7d0..0000000 Binary files a/app/assets/images/icons/rejection.png and /dev/null differ diff --git a/app/assets/images/icons/request.png b/app/assets/images/icons/request.png deleted file mode 100755 index 1e55e3f..0000000 Binary files a/app/assets/images/icons/request.png and /dev/null differ diff --git a/app/assets/images/icons/resolution-go.png b/app/assets/images/icons/resolution-go.png deleted file mode 100755 index bfbe022..0000000 Binary files a/app/assets/images/icons/resolution-go.png and /dev/null differ diff --git a/app/assets/images/icons/resolution.png b/app/assets/images/icons/resolution.png deleted file mode 100755 index f2af438..0000000 Binary files a/app/assets/images/icons/resolution.png and /dev/null differ diff --git a/app/assets/images/icons/restricted.png b/app/assets/images/icons/restricted.png deleted file mode 100644 index 282c64a..0000000 Binary files a/app/assets/images/icons/restricted.png and /dev/null differ diff --git a/app/assets/images/icons/sent.png b/app/assets/images/icons/sent.png deleted file mode 100755 index 95b0da4..0000000 Binary files a/app/assets/images/icons/sent.png and /dev/null differ diff --git a/app/assets/images/icons/severity.png b/app/assets/images/icons/severity.png deleted file mode 100644 index f250029..0000000 Binary files a/app/assets/images/icons/severity.png and /dev/null differ diff --git a/app/assets/images/icons/stamp.png b/app/assets/images/icons/stamp.png deleted file mode 100755 index 9d556de..0000000 Binary files a/app/assets/images/icons/stamp.png and /dev/null differ diff --git a/app/assets/images/icons/status-green.png b/app/assets/images/icons/status-green.png deleted file mode 100755 index 680bb8a..0000000 Binary files a/app/assets/images/icons/status-green.png and /dev/null differ diff --git a/app/assets/images/icons/status-grey.png b/app/assets/images/icons/status-grey.png deleted file mode 100755 index f148af4..0000000 Binary files a/app/assets/images/icons/status-grey.png and /dev/null differ diff --git a/app/assets/images/icons/status-red.png b/app/assets/images/icons/status-red.png deleted file mode 100755 index a9d5f4d..0000000 Binary files a/app/assets/images/icons/status-red.png and /dev/null differ diff --git a/app/assets/images/icons/status-yellow.png b/app/assets/images/icons/status-yellow.png deleted file mode 100755 index c7be0ab..0000000 Binary files a/app/assets/images/icons/status-yellow.png and /dev/null differ diff --git a/app/assets/images/icons/switch.png b/app/assets/images/icons/switch.png deleted file mode 100755 index 04bb1e0..0000000 Binary files a/app/assets/images/icons/switch.png and /dev/null differ diff --git a/app/assets/images/icons/synopsis.png b/app/assets/images/icons/synopsis.png deleted file mode 100755 index 363394b..0000000 Binary files a/app/assets/images/icons/synopsis.png and /dev/null differ diff --git a/app/assets/images/icons/template.png b/app/assets/images/icons/template.png deleted file mode 100644 index ed7ec0e..0000000 Binary files a/app/assets/images/icons/template.png and /dev/null differ diff --git a/app/assets/images/icons/time.png b/app/assets/images/icons/time.png deleted file mode 100755 index e4535fa..0000000 Binary files a/app/assets/images/icons/time.png and /dev/null differ diff --git a/app/assets/images/icons/title.png b/app/assets/images/icons/title.png deleted file mode 100755 index d0d2843..0000000 Binary files a/app/assets/images/icons/title.png and /dev/null differ diff --git a/app/assets/images/icons/toolbox.png b/app/assets/images/icons/toolbox.png deleted file mode 100755 index b581d77..0000000 Binary files a/app/assets/images/icons/toolbox.png and /dev/null differ diff --git a/app/assets/images/icons/txt.png b/app/assets/images/icons/txt.png deleted file mode 100755 index ed841a0..0000000 Binary files a/app/assets/images/icons/txt.png and /dev/null differ diff --git a/app/assets/images/icons/unaffected.png b/app/assets/images/icons/unaffected.png deleted file mode 100755 index 8889996..0000000 Binary files a/app/assets/images/icons/unaffected.png and /dev/null differ diff --git a/app/assets/images/icons/user.png b/app/assets/images/icons/user.png deleted file mode 100755 index f6e4dc8..0000000 Binary files a/app/assets/images/icons/user.png and /dev/null differ diff --git a/app/assets/images/icons/user_add.png b/app/assets/images/icons/user_add.png deleted file mode 100644 index deae99b..0000000 Binary files a/app/assets/images/icons/user_add.png and /dev/null differ diff --git a/app/assets/images/icons/warning.png b/app/assets/images/icons/warning.png deleted file mode 100644 index 628cf2d..0000000 Binary files a/app/assets/images/icons/warning.png and /dev/null differ diff --git a/app/assets/images/icons/workaround-no.png b/app/assets/images/icons/workaround-no.png deleted file mode 100755 index c08fc6e..0000000 Binary files a/app/assets/images/icons/workaround-no.png and /dev/null differ diff --git a/app/assets/images/icons/workaround.png b/app/assets/images/icons/workaround.png deleted file mode 100755 index dafa648..0000000 Binary files a/app/assets/images/icons/workaround.png and /dev/null differ diff --git a/app/assets/images/icons/xml.png b/app/assets/images/icons/xml.png deleted file mode 100644 index b5769e6..0000000 Binary files a/app/assets/images/icons/xml.png and /dev/null differ diff --git a/app/assets/images/icons/zoom_100.png b/app/assets/images/icons/zoom_100.png deleted file mode 100755 index a445ea6..0000000 Binary files a/app/assets/images/icons/zoom_100.png and /dev/null differ diff --git a/app/assets/images/icons/zoom_in.png b/app/assets/images/icons/zoom_in.png deleted file mode 100755 index a46dcc8..0000000 Binary files a/app/assets/images/icons/zoom_in.png and /dev/null differ diff --git a/app/assets/images/icons/zoom_out.png b/app/assets/images/icons/zoom_out.png deleted file mode 100755 index 49bb8f2..0000000 Binary files a/app/assets/images/icons/zoom_out.png and /dev/null differ diff --git a/app/assets/images/intel-editor.png b/app/assets/images/intel-editor.png deleted file mode 100644 index 7db46a6..0000000 Binary files a/app/assets/images/intel-editor.png and /dev/null differ diff --git a/app/assets/images/line.png b/app/assets/images/line.png deleted file mode 100644 index 1a8469c..0000000 Binary files a/app/assets/images/line.png and /dev/null differ diff --git a/app/assets/images/login-bg.png b/app/assets/images/login-bg.png deleted file mode 100644 index d2876a9..0000000 Binary files a/app/assets/images/login-bg.png and /dev/null differ diff --git a/app/assets/images/logo.png b/app/assets/images/logo.png deleted file mode 100644 index 9bc7bd5..0000000 Binary files a/app/assets/images/logo.png and /dev/null differ diff --git a/app/assets/images/menu-left.png b/app/assets/images/menu-left.png deleted file mode 100644 index d741c7e..0000000 Binary files a/app/assets/images/menu-left.png and /dev/null differ diff --git a/app/assets/images/menu-right.png b/app/assets/images/menu-right.png deleted file mode 100644 index cf42427..0000000 Binary files a/app/assets/images/menu-right.png and /dev/null differ diff --git a/app/assets/images/menubg.png b/app/assets/images/menubg.png deleted file mode 100644 index 19aba57..0000000 Binary files a/app/assets/images/menubg.png and /dev/null differ diff --git a/app/assets/images/rails.png b/app/assets/images/rails.png deleted file mode 100644 index d5edc04..0000000 Binary files a/app/assets/images/rails.png and /dev/null differ diff --git a/app/assets/images/separator.png b/app/assets/images/separator.png deleted file mode 100644 index 5a009e5..0000000 Binary files a/app/assets/images/separator.png and /dev/null differ diff --git a/app/assets/images/spinner.gif b/app/assets/images/spinner.gif deleted file mode 100644 index 39615c8..0000000 Binary files a/app/assets/images/spinner.gif and /dev/null differ diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js deleted file mode 100644 index d6f4b40..0000000 --- a/app/assets/javascripts/application.js +++ /dev/null @@ -1,14 +0,0 @@ -// This is a manifest file that'll be compiled into including all the files listed below. -// Add new JavaScript/Coffee code in separate files in this directory and they'll automatically -// be included in the compiled file accessible from http://example.com/assets/application.js -// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the -// the compiled file. -// -//= require prototype -//= require prototype_ujs -//= require effects -//= require glsamaker -//= require glsamaker_misc -//= require glsamaker_edit -//= require modalbox -//= require_self \ No newline at end of file diff --git a/app/assets/javascripts/glsamaker.js.erb b/app/assets/javascripts/glsamaker.js.erb deleted file mode 100644 index 92bc6ab..0000000 --- a/app/assets/javascripts/glsamaker.js.erb +++ /dev/null @@ -1,151 +0,0 @@ -/** - Sets the count of lines if more than 5 or less than 50. -*/ -function lines(id, amount) { -// if ($(id).rows > 0 && $(id).rows <= 50) { - $(id).rows += amount; -// } -} - -/** - Toggles extra-wide input fields -**/ -function toggleWide(id) { - if ($(id).style.width == "140%") { - $(id).style.width = ""; - $(id + "-widebtn").childNodes[1].src = "/images/icons/more_width.png"; - $(id + "-widebtn").title = "More columns"; - } else { - $(id).style.width = "140%"; - $(id + "-widebtn").childNodes[1].src = "/images/icons/less_width.png"; - $(id + "-widebtn").title = "Fewer columns"; - } -} - -function addBugDialog(glsaid) { - alert('deprecated. use GLSAMaker.editing.bugs.add_dialog() instead.'); -} - -function addCommentDialog(glsaid) { - Modalbox.show("/glsas/"+glsaid+"/comments/new", {title: "Add comment", width: 600}); -} - -function backgroundDialog() { - Modalbox.show("/tools/background/?id=dev-lang/ruby", {title: "Get background", width: 600}); -} - - -function getClientWidth() { - return document.compatMode=='CSS1Compat' && !window.opera?document.documentElement.clientWidth:document.body.clientWidth; -} - -function buginfo(bugid) { - Modalbox.show("/bug/" + bugid, {title: "Bug " + bugid, width: 800}); -} - -function generateResolution() { - $('resolution').value = ""; - var resolution = ""; - var unaffected_atoms = new Array(); - var name, atom, comp, version; - - // First find and list all upgrade paths... - for (i = 0; i < $('packages_table_unaffected').select('.entry').length; i++) { - if ($('packages_table_unaffected').down(".entry", i).select('input[type=hidden][value=ignore]').length > 0) - continue; - - atom = $('packages_table_unaffected').down(".entry", i).down("#glsa_package__atom").value; - name = atom.split("/")[1]; - if (name == undefined) - name = "UNDEFINED"; - comp = $('packages_table_unaffected').down(".entry", i).down("#glsa_package__comp").value.replace('*', ''); - version = $('packages_table_unaffected').down(".entry", i).down("#glsa_package__version").value; - - resolution += "All " + name + " users should upgrade to the latest version:\n\n\ -\n\ -# emerge --sync\n\ -# emerge --ask --oneshot --verbose \"" + comp + atom + "-" + version + "\"\n\n"; - - unaffected_atoms.push(atom); - } - - // Check if there are any packages that only have vulnerable entries. - // These need to be unmerged. - for (i = 0; i < $('packages_table_vulnerable').select('.entry').length; i++) { - if ($('packages_table_vulnerable').down(".entry", i).select('input[type=hidden][value=ignore]').length > 0) - continue; - - atom = $('packages_table_vulnerable').down(".entry", i).down("#glsa_package__atom").value; - if (unaffected_atoms.indexOf(atom) == -1) { - name = atom.split("/")[1]; - if (name == undefined) - name = "UNDEFINED"; - - resolution += "We recommend that users unmerge " + name + ":\n\n\ -\n\ -# emerge --unmerge \"" + atom + "\""; - } - } - - $('resolution').value = resolution; -} - -function generateDescription() { - // This code is pretty ugly. You have been warned. - // cnt is the number of 'entry's - // act_cnt is cnt minus the number of to be ignored 'entry's - // i is used to walk down into the i'th entry element - // act_i is used to keep track of how many packages have been / will be added - - var name = ""; - var cnt = $('packages_table_vulnerable').select('.entry').length; - var act_cnt = cnt - $('packages_table_vulnerable').select('.entry input[type=hidden][value=ignore]').length; - - var act_i = 0; - for (var i = 0; i < cnt; i++) { - if ($('packages_table_vulnerable').down(".entry", i).select('input[type=hidden][value=ignore]').length > 0) - continue; - - var atom = $('packages_table_vulnerable').down(".entry", i).down("#glsa_package__atom").value; - - if (act_cnt > 1 && act_i == act_cnt - 1) { - name += ", and "; - } else if (act_cnt > 1 && act_i != 0) { - name += ", "; - } - act_i++; - name += atom.split("/")[1]; - } - - if (name == "undefined") - name = "UNDEFINED"; - - $('description').value = "Multiple vulnerabilities have been discovered in " + name + ". Please review the CVE identifiers referenced below for details."; -} - -function toggleCommentRead(comment) { - if ($('commentread-' + comment).value == "true") { - $('commentread-' + comment).value = "false"; - $('commentflag-' + comment).update('Todo'); - } - else { - $('commentread-' + comment).value = "true"; - $('commentflag-' + comment).update('Done.'); - } -} - -function cveinfo(cveid) { - Modalbox.show("/cve/info/" + cveid, {title: cveid, width: 800}); -} - -function cvepopup(cveid) { - window.open("/cve/info/" + escapeHTML(cveid), "cvepopup-" + cveid, "width=500, height=600,status=no,menubar=no,toolbar=no,resizable=no"); -} - -function escapeHTML(str) { - return str.replace(/(<([^>]+)>)/ig,""); -} - -//document.observe('dom:loaded', function() { - -//}); diff --git a/app/assets/javascripts/glsamaker_edit.js b/app/assets/javascripts/glsamaker_edit.js deleted file mode 100644 index cc77621..0000000 --- a/app/assets/javascripts/glsamaker_edit.js +++ /dev/null @@ -1,181 +0,0 @@ -/** - * GLSAMaker 2 - * Draft editing JS - */ - -if (typeof GLSAMaker == "undefined" || !GLSAMaker) { - var GLSAMaker = {}; -} - -if (typeof GLSAMaker.editing == "undefined" || !GLSAMaker.editing) { - GLSAMaker.editing = function() { - return {}; - }(); -} - -GLSAMaker.editing.bugs = function() { - return { - /** - * Removes a bug from a draft being edited - */ - del : function(bug_id) { - // no such bug, or already removed - if (!$('bug-' + bug_id)) { - return; - } - - Effect.Fade('bug-' + bug_id, { - duration: .75, - afterFinish: function(e) { - $('bug-' + bug_id).remove(); - } - }); - }, - /** - * Opens a dialog to add bugs - */ - add_dialog : function(glsa_id) { - Modalbox.show("/glsas/" + glsa_id + "/bugs/new", {title: "Add bugs", width: 600}); - } - }; -}(); - -GLSAMaker.editing.references = function() { - return { - /** - * Removes a reference from a draft being edited - */ - del : function(ref) { - // no such reference, or already removed - if (!ref) { - return; - } - - var td = ref.up(".entry") - - Effect.Fade(td, { - duration: .75, - afterFinish: function(e) { - td.remove(); - } - }); - }, - /** - * Opens a dialog to import references from external data - */ - import_dialog : function(glsa_id) { - Modalbox.show("/glsa/import_references/" + glsa_id, {title: "Import references", width: 800}); - } - }; -}(); - -GLSAMaker.editing.packages = function() { - return { - /** - * Removes a reference from a draft being edited - */ - del : function(ref) { - // no such reference, or already removed - if (!ref) { - return; - } - - var td = ref.up(".entry"); - - Effect.Fade(td, { - duration: .75, - afterFinish: function(e) { - td.remove(); - } - }); - } - }; -}(); - -GLSAMaker.editing.templates = function() { - return { - /** - * Displays a drop down menu to select a template to append - */ - dropdown : function(button, target) { - var div = $('templates-' + target); - - if (!div) { - return; - } - - // Close the popup if it's already open - if (div.getStyle('display') != 'none') { - GLSAMaker.editing.templates.close(div); - return; - } - - var btn_layout = button.getLayout(); - - div.setStyle({ - position: 'absolute', - right: btn_layout.get('right') + "px", - top: btn_layout.get('top') + btn_layout.get('height') + 5 + "px" - }); - - Effect.SlideDown(div, { - duration: .15 - }); - }, - /** - * Closes a popup - * - * @param target The popup to close - */ - close : function(target) { - Effect.SlideUp(target, { - duration: .2 - }); - }, - /** - * Observes a field for clicks into template fields and sets the - * @param elem - */ - observeClick : function(elem) { - elem.observe('click', function(event) { - var before = '['; - var after = ']'; - - var selection_info = GLSAMaker.misc.getInputSelection(this); - var text = this.getValue(); - - // If the user clicked and did not select - if (selection_info.start == selection_info.end) { - var text_before = text.substring(0, selection_info.start); - var text_after = text.substring(selection_info.end, text.length - 1); - - // check if there is any template before this - var pos_prev = text_before.search(GLSAMaker.misc.escapeRegExp(after)); - var pos_comp = 0; - - while (pos_prev > 0) { - pos_comp += pos_prev; - text_before = text_before.slice(pos_prev); - pos_prev = text_before.search(GLSAMaker.misc.escapeRegExp(after)); - } - - var pos_before = text_before.search(GLSAMaker.misc.escapeRegExp(before)); - if (pos_before == -1) { - return; - } - - // pos_before is our selection start. - var pos_after = text_after.search(GLSAMaker.misc.escapeRegExp(after)); - if (pos_after == -1) { - return; - } - - pos_before += pos_comp; - pos_after += selection_info.end + 1; - - GLSAMaker.misc.setInputSelection(this, {start: pos_before, end: pos_after}); - } - }) - } - }; -}(); \ No newline at end of file diff --git a/app/assets/javascripts/glsamaker_misc.js b/app/assets/javascripts/glsamaker_misc.js deleted file mode 100644 index fb04be3..0000000 --- a/app/assets/javascripts/glsamaker_misc.js +++ /dev/null @@ -1,102 +0,0 @@ -/** - * GLSAMaker 2 - * Draft editing JS - */ - -if (typeof GLSAMaker == "undefined" || !GLSAMaker) { - var GLSAMaker = {}; -} - -if (typeof GLSAMaker.misc == "undefined" || !GLSAMaker.misc) { - GLSAMaker.misc = function() { - return { - /** - * Find out the selection position in a text field - * via: http://stackoverflow.com/questions/4928586/get-caret-position-in-html-input - * - * @param el - */ - getInputSelection : function(el) { - var start = 0, end = 0, normalizedValue, range, - textInputRange, len, endRange; - - if (typeof el.selectionStart == "number" && typeof el.selectionEnd == "number") { - start = el.selectionStart; - end = el.selectionEnd; - } else { - range = document.selection.createRange(); - - if (range && range.parentElement() == el) { - len = el.value.length; - normalizedValue = el.value.replace(/\r\n/g, "\n"); - - // Create a working TextRange that lives only in the input - textInputRange = el.createTextRange(); - textInputRange.moveToBookmark(range.getBookmark()); - - // Check if the start and end of the selection are at the very end - // of the input, since moveStart/moveEnd doesn't return what we want - // in those cases - endRange = el.createTextRange(); - endRange.collapse(false); - - if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) { - start = end = len; - } else { - start = -textInputRange.moveStart("character", -len); - start += normalizedValue.slice(0, start).split("\n").length - 1; - - if (textInputRange.compareEndPoints("EndToEnd", endRange) > -1) { - end = len; - } else { - end = -textInputRange.moveEnd("character", -len); - end += normalizedValue.slice(0, end).split("\n").length - 1; - } - } - } - } - - return { - start: start, - end: end - }; - }, - /** - * Sets the caret position of a control - * @param ctrl - * @param pos - */ - setInputSelection: function (ctrl, data) { - if (ctrl.setSelectionRange) { - ctrl.focus(); - ctrl.setSelectionRange(data.start, data.end); - } - else if (ctrl.createTextRange) { - var range = ctrl.createTextRange(); - range.collapse(true); - range.moveEnd('character', data.end); - range.moveStart('character', data.start); - range.select(); - } - }, - escapeRegExp : function(text) { - return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); - } - }; - }(); -} - -GLSAMaker.misc.ui = function() { - return { - /** - * Docks an element to the right - */ - dock : function(elem) { - if (!elem) { - return; - } - - elem.toggleClassName('docked-right'); - } - }; -}(); diff --git a/app/assets/javascripts/jsui.js b/app/assets/javascripts/jsui.js deleted file mode 100644 index 039f727..0000000 --- a/app/assets/javascripts/jsui.js +++ /dev/null @@ -1,8 +0,0 @@ -//= require prototype -//= require prototype_ujs -//= require effects -//= require uki -//= require uki-more -//= require searchable -//= require glsamaker -//= require glsamaker_misc \ No newline at end of file diff --git a/app/assets/javascripts/modalbox.js b/app/assets/javascripts/modalbox.js deleted file mode 100644 index 611c226..0000000 --- a/app/assets/javascripts/modalbox.js +++ /dev/null @@ -1,593 +0,0 @@ -// -// ModalBox - The pop-up window thingie with AJAX, based on Prototype JS framework. -// -// Created by Andrew Okonetchnikov -// Copyright 2006-2010 okonet.ru. All rights reserved. -// -// Licensed under MIT license. -// - -if (Object.isUndefined(Prototype.Browser.IE6)) { - Prototype.Browser.IE6 = (navigator.appName.indexOf("Microsoft Internet Explorer") != -1 && navigator.appVersion.indexOf("MSIE 6.0") != -1 && !window.XMLHttpRequest); -} - -if (!window.Modalbox) - var Modalbox = {}; - -Modalbox.Methods = { - overrideAlert: false, // Override standard browser alert message with ModalBox - focusableElements: [], - currFocused: 0, - initialized: false, // Modalbox is visible - active: true, // Modalbox is visible and active - options: { - title: "ModalBox Window", // Title of the ModalBox window - overlayClose: true, // Close modal box by clicking on overlay - width: 500, // Default width in px - height: 90, // Default height in px - overlayOpacity: 0.65, // Default overlay opacity - overlayDuration: 0.25, // Default overlay fade in/out duration in seconds - slideDownDuration: 0.5, // Default Modalbox appear slide down effect in seconds - slideUpDuration: 0.5, // Default Modalbox hiding slide up effect in seconds - resizeDuration: 0.25, // Default resize duration seconds - inactiveFade: true, // Fades MB window on inactive state - transitions: true, // Toggles transition effects. Transitions are enabled by default - loadingString: "Please wait. Loading...", // Default loading string message - closeString: "Close window", // Default title attribute for close window link - closeValue: "×", // Default string for close link in the header - params: {}, - method: 'get', // Default Ajax request method - autoFocusing: true, // Toggles auto-focusing for form elements. Disable for long text pages. - aspnet: false, // Should be true when using with ASP.NET controls. When true Modalbox window will be injected into the first form element. - resizeCSSID: '' - }, - _options: {}, - - setOptions: function(options) { - Object.extend(this.options, options || {}); - }, - - _init: function(options) { - // Setting up original options with default options - Object.extend(this._options, this.options); - this.setOptions(options); - - // Creating the overlay - this.MBoverlay = new Element("div", {id: "MB_overlay", style: "opacity: 0"}); - - // Creating the modal window - this.MBwindowwrapper = new Element("div", {id: "MB_windowwrapper"}).update( - this.MBwindow = new Element("div", {id: "MB_window", style: "display: none"}).update( - this.MBframe = new Element("div", {id: "MB_frame"}).update( - this.MBheader = new Element("div", {id: "MB_header"}).update( - this.MBcaption = new Element("div", {id: "MB_caption"}) - ) - ) - ) - ); - - this.MBclose = new Element("a", {id: "MB_close", title: this.options.closeString, href: "#"}).update("" + this.options.closeValue + ""); - this.MBheader.insert({'bottom':this.MBclose}); - - this.MBcontent = new Element("div", {id: "MB_content"}).update( - this.MBloading = new Element("div", {id: "MB_loading"}).update(this.options.loadingString) - ); - this.MBframe.insert({'bottom':this.MBcontent}); - - // Inserting into DOM. If parameter set and form element have been found will inject into it. Otherwise will inject into body as topmost element. - // Be sure to set padding and marging to null via CSS for both body and (in case of asp.net) form elements. - var injectToEl = this.options.aspnet ? $(document.body).down('form') : $(document.body); - injectToEl.insert({'top':this.MBwindowwrapper}); - injectToEl.insert({'top':this.MBoverlay}); - - var scrollOffsets = document.viewport.getScrollOffsets(); - if (scrollOffsets[1] > 0) { - $('MB_window').setStyle({top:scrollOffsets[1] + 'px'}); - } - - Event.observe(window, 'scroll', function() { - scrollOffsets = document.viewport.getScrollOffsets(); - $('MB_window').setStyle({top:scrollOffsets[1] + 'px'}); - }); - - // Initial scrolling position of the window. To be used for remove scrolling effect during ModalBox appearing - this.initScrollX = window.pageXOffset || document.body.scrollLeft || document.documentElement.scrollLeft; - this.initScrollY = window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop; - - //Adding event observers - this.hideObserver = this._hide.bindAsEventListener(this); - this.kbdObserver = this._kbdHandler.bindAsEventListener(this); - this.resizeObserver = this._setWidthAndPosition.bindAsEventListener(this); - this._initObservers(); - - this.initialized = true; // Mark as initialized - }, - - show: function(content, options) { - if (!this.initialized) this._init(options); // Check if MB is already initialized - - this._cleanUpContentIDs(); - - this.content = content; - this.setOptions(options); - - if (this.options.title) { // Updating title of the MB - this.MBcaption.update(this.options.title); - } else { // If title isn't given, the header will not displayed - this.MBheader.hide(); - this.MBcaption.hide(); - } - - if (this.MBwindow.style.display == "none") { // First modal box appearing - this._appear(); - this.event("onShow"); // Passing onShow callback - } else { // If MB already on the screen, update it - this._update(); - this.event("onUpdate"); // Passing onUpdate callback - } - }, - - hide: function(options) { // External hide method to use from external HTML and JS - if (this.initialized) { - // Reading for options/callbacks except if event given as a parameter - if (options && !Object.isFunction(options.element)) - Object.extend(this.options, options); - this.event("beforeHide"); // Passing beforeHide callback - if (this.options.transitions) { - Effect.SlideUp(this.MBwindow, { duration: this.options.slideUpDuration, transition: Effect.Transitions.sinoidal, afterFinish: this._deinit.bind(this) }); - } else { - this.MBwindow.hide(); - this._deinit(); - } - Event.stopObserving(window, 'scroll'); - } else { - throw("Modalbox is not initialized."); - } - }, - - _hide: function(event) { // Internal hide method to use with overlay and close link - event.stop(); // Stop event propagation for link elements - // When clicked on overlay we'll check the option and in case of overlayClose == false we'll break hiding execution [Fix for #139] - if (event.element().id == 'MB_overlay' && !this.options.overlayClose) return false; - this.hide(); - }, - - alert: function(message){ - var html = '

' + message + '

'; - Modalbox.show(html, {title: 'Alert: ' + document.title, width: 300}); - }, - - _appear: function() { // First appearing of MB - if (Prototype.Browser.IE6) { // Preparing IE 6 for showing modalbox - window.scrollTo(0,0); - this._prepareIEHtml("100%", "hidden"); - this._prepareIESelects("hidden"); - } - this._setWidth(); - if(this.options.transitions) { - this.MBoverlay.setOpacity(0); - new Effect.Fade(this.MBoverlay, { - from: 0, - to: this.options.overlayOpacity, - duration: this.options.overlayDuration, - afterFinish: (function() { - new Effect.SlideDown(this.MBwindow, { - duration: this.options.slideDownDuration, - transition: Effect.Transitions.sinoidal, - afterFinish: this.loadContent.bind(this) - }); - }).bind(this) - }); - } else { - this.MBoverlay.setOpacity(this.options.overlayOpacity); - this.MBwindow.show(); - this.loadContent(); - } - Event.observe(window, "resize", this.resizeObserver); - }, - - resize: function(byWidth, byHeight, options) { // Change size of MB without content reloading - var oWidth = $(this.MBoverlay).getWidth(); - var wHeight = $(this.MBwindow).getHeight(); - var wWidth = $(this.MBwindow).getWidth(); - var hHeight = $(this.MBheader).getHeight(); - var cHeight = $(this.MBcontent).getHeight(); - var newHeight = ((wHeight - hHeight + byHeight) < cHeight) ? (cHeight + hHeight) : (wHeight + byHeight); - - var el = $(this.MBwindow); - var contentEl = $(this.MBcontent); - var windowBottomMargin = 10; - newHeight += windowBottomMargin; - var windowOffset = (parseInt(el.getStyle('margin-top'), 0) + parseInt(el.getStyle('margin-bottom'), 0) + parseInt(el.getStyle('border-top-width'), 0) + parseInt(el.getStyle('border-bottom-width'), 0)) + windowBottomMargin; - var contentPadding = (parseInt(contentEl.getStyle('padding-top')) + parseInt(contentEl.getStyle('padding-bottom'))); - - if ((newHeight + windowOffset + contentPadding) > document.viewport.getHeight()) { - // adjust window height to account for margins and border widths - newHeight = document.viewport.getHeight() - windowOffset - windowBottomMargin; - // calculate content height including header height and padding values - newcHeight = newHeight - hHeight - parseInt($(this.MBframe).getStyle('padding-bottom'), 0) - parseInt($(this.MBcontent).getStyle('padding-bottom'), 0); - $(this.MBcontent).setStyle({height:newcHeight + 'px'}); - } else if ($(this.MBcontent).getStyle('height')) { - // release any MB_content height set prior to establish scrollbars in content area - $(this.MBcontent).setStyle({height:''}); - } - - var newWidth = wWidth + byWidth; - //var newStyle = {width: newWidth + "px", height: newHeight + "px", left: (o.width - newWidth)/2 + "px"}; - var newStyle = {width: newWidth + "px", height: newHeight + "px"}; - this.options.width = newWidth; - if (options) this.setOptions(options); // Passing callbacks - if (this.options.transitions && !Modalbox.animating) { - Modalbox.animating = true; - new Effect.Morph(this.MBwindow, { - style: newStyle, - duration: this.options.resizeDuration, - beforeStart: function(fx){ - fx.element.setStyle({overflow: "hidden"}); // Fix for MSIE 6 to resize correctly - }, - afterFinish: (function(fx) { - fx.element.setStyle({overflow: "visible"}); - this.event("_afterResize"); // Passing internal callback - this.event("afterResize"); // Passing callback - Modalbox.animating = false; - }).bind(this) - }); - } else { - this.MBwindow.setStyle(newStyle); - (function() { - this.event("_afterResize"); // Passing internal callback - this.event("afterResize"); // Passing callback - }).bind(this).defer(); - } - }, - - resizeToContent: function(options){ - // Resizes the modalbox window to the actual content height. - // This might be useful to resize modalbox after some content modifications which were changed content height. - - if (typeof options == "undefined") { - options = {}; - } - - // check to see if MB_content includes any images - var mbimages = $('MB_content').select('img'); - var totalimages = mbimages.length; - if (mbimages[0]) { - if (typeof options.imagesloaded == "undefined") { - - var loadedImages = $A(); - var loadedImageTotal = 0; - mbimages.each(function(o,idx) { - loadedImages[idx] = new Image(); - loadedImages[idx].src = o.src; - loadedImages[idx].onload = function() { - loadedImageTotal++; - if (loadedImageTotal == totalimages) { - // make sure all images have been rendered by checking their height - var imageincomplete = false; - mbimages.each(function(i) { - if (i.height == 0) { - imageincomplete = true; - } - }); - if (imageincomplete || Modalbox.animating) { - // some image hasn't been rendered yet, trigger resize loop until it is - Modalbox.resizeToContent(); - } else { - // trigger one final resize, but set imagesloaded option to skip inspection of images - options.imagesloaded = true; - Modalbox.resizeToContent(options); - } - } - } - }) - } - } - - var byWidth = 0, byHeight = this.options.height - this.MBwindow.getHeight(); - if (options.resizeCSSID && $(options.resizeCSSID)) { - // byWidth is the amount of pixels needed to increase/decrease window to meet width of options.resizeCSSID - // plus a 10 pixel margin to accommodate scrollbars - byWidth = $(options.resizeCSSID).getWidth() - $(this.MBwindow).getWidth() + (parseInt($(this.MBcontent).getStyle('padding-left'), 0) + parseInt($(this.MBcontent).getStyle('padding-right'), 0)) + 15; - } - if (byHeight != 0) { - this.resize(byWidth, byHeight, options); - } - }, - - resizeToInclude: function(element, options){ - // Resizes the modalbox window to the cumulative height of element. Calculations are using CSS properties for margins and border. - // This method might be useful to resize modalbox before including or updating content. - - var el = $(element); - var elHeight = el.getHeight() + parseInt(el.getStyle('margin-top'), 0) + parseInt(el.getStyle('margin-bottom'), 0) + parseInt(el.getStyle('border-top-width'), 0) + parseInt(el.getStyle('border-bottom-width'), 0); - if (elHeight > 0) { - this.resize(0, elHeight, options); - } - }, - - _update: function() { // Updating MB in case of wizards - this.MBcontent.update($(this.MBloading).update(this.options.loadingString)); - this.loadContent(); - }, - - loadContent: function() { - if (this.event("beforeLoad") != false) { // If callback passed false, skip loading of the content - if (typeof this.content == 'string') { - var htmlRegExp = new RegExp(/<\/?[^>]+>/gi); - if (htmlRegExp.test(this.content)) { // Plain HTML given as a parameter - this._processContent(this.content); - } else { // URL given as a parameter. We'll request it via Ajax - new Ajax.Request(this.content, { - method: this.options.method.toLowerCase(), - parameters: this.options.params, - onComplete: (function(response) { - this._processContent(response.responseText); - }).bind(this), - onException: function(instance, exception){ - Modalbox.hide(); - throw('Modalbox Loading Error: ' + exception); - } - }); - } - } else if (typeof this.content == 'object') { // HTML Object is given - this._insertContent(this.content); - } else { - this.hide(); - throw('Modalbox Parameters Error: Please specify correct URL or HTML element (plain HTML or object)'); - } - } - }, - - _processContent: function(content) { - var html = content.stripScripts(), scripts = content.extractScripts(); - this._insertContent(html, function() { - scripts.map(function(script) { - return eval(script.replace("", "")); - }, window); - }); - }, - - _insertContent: function(content, callback) { - this.MBcontent.hide().update(); - - if (typeof content == 'string') { // Plain HTML is given - this.MBcontent.insert(new Element("div", { style: "display: none" }).update(content)).down().show(); - } else if (typeof content == 'object') { // HTML Object is given - var _htmlObj = content.cloneNode(true); // If node is already a part of DOM we'll clone it - // If cloneable element has ID attribute defined, modify it to prevent duplicates - if (content.id) content.id = "MB_" + content.id; - // Add prefix for IDs on all elements inside the DOM node - $(content).select('*[id]').each(function(el) { el.id = "MB_" + el.id; }); - this.MBcontent.insert(_htmlObj).down('div').show(); - if (Prototype.Browser.IE6) { // Toggling back visibility for hidden selects in IE - this._prepareIESelects("", "#MB_content "); - } - } - - // Prepare and resize modal box for content - if (this.options.height == this._options.height) { - this.resize((this.options.width - $(this.MBwindow).getWidth()), this.MBcontent.getHeight() - $(this.MBwindow).getHeight() + this.MBheader.getHeight(), { - afterResize: (function() { - this._putContent.bind(this, callback).defer(); // MSIE fix - }).bind(this) - }); - } else { // Height is defined. Creating a scrollable window - this._setWidth(); - this.MBcontent.setStyle({ - overflow: 'auto', - height: this.MBwindow.getHeight() - this.MBheader.getHeight() - 13 + 'px' - }); - this._putContent.bind(this, callback).defer(); // MSIE fix - } - }, - - _putContent: function(callback) { - this.MBcontent.show(); - this._findFocusableElements(); - this._setFocus(); // Setting focus on first 'focusable' element in content (input, select, textarea, link or button) - if (Object.isFunction(callback)) - callback(); // Executing internal JS from loaded content - this.event("afterLoad"); // Passing callback - }, - - activate: function(options) { - this.setOptions(options); - this.active = true; - if (this.options.overlayClose) - this.MBoverlay.observe("click", this.hideObserver); - this.MBclose.observe("click", this.hideObserver).show(); - if (this.options.transitions && this.options.inactiveFade) - new Effect.Appear(this.MBwindow, {duration: this.options.slideUpDuration}); - }, - - deactivate: function(options) { - this.setOptions(options); - this.active = false; - if (this.options.overlayClose) - this.MBoverlay.stopObserving("click", this.hideObserver); - this.MBclose.stopObserving("click", this.hideObserver).hide(); - if (this.options.transitions && this.options.inactiveFade) - new Effect.Fade(this.MBwindow, {duration: this.options.slideUpDuration, to: 0.75}); - }, - - _initObservers: function() { - this.MBclose.observe("click", this.hideObserver); - if (this.options.overlayClose) - this.MBoverlay.observe("click", this.hideObserver); - // Gecko and Opera are moving focus a way too fast, all other browsers are okay with keydown - var kbdEvent = (Prototype.Browser.Gecko || Prototype.Browser.Opera) ? "keypress" : "keydown"; - Event.observe(document, kbdEvent, this.kbdObserver); - }, - - _removeObservers: function() { - this.MBclose.stopObserving("click", this.hideObserver); - if (this.options.overlayClose) - this.MBoverlay.stopObserving("click", this.hideObserver); - var kbdEvent = (Prototype.Browser.Gecko || Prototype.Browser.Opera) ? "keypress" : "keydown"; - Event.stopObserving(document, kbdEvent, this.kbdObserver); - }, - - _setFocus: function() { - // Setting focus to the first 'focusable' element which is one with tabindex = 1 or the first in the form loaded. - if (this.focusableElements.length > 0 && this.options.autoFocusing == true) { - var firstEl = this.focusableElements.find(function (el){ - return el.tabIndex == 1; - }) || this.focusableElements.first(); - this.currFocused = this.focusableElements.toArray().indexOf(firstEl); - firstEl.focus(); // Focus on first focusable element except close button - } else if (this.MBclose.visible()) { - this.MBclose.focus(); // If no focusable elements exist focus on close button - } - }, - - _findFocusableElements: function() { // Collect form elements and links from MB content - if (this.options.autoFocusing === true) { - // TODO maybe add :enabled to select and textarea elements - this.MBcontent.select('input:not([type=hidden]):enabled, select, textarea, button, a[href]').invoke('addClassName', 'MB_focusable'); - this.focusableElements = this.MBcontent.select('.MB_focusable'); - } - }, - - _kbdHandler: function(event) { - var node = event.element(); - switch(event.keyCode) { - case Event.KEY_TAB: - event.stop(); - - // Switching currFocused to the element which was focused by mouse instead of TAB-key. Fix for #134 - if (node != this.focusableElements[this.currFocused]) - this.currFocused = this.focusableElements.indexOf(node); - - if (!event.shiftKey) { // Focusing in direct order - if (this.currFocused >= this.focusableElements.length - 1) { - this.currFocused = 0; - } else { - this.currFocused++; - } - } else { // Shift key is pressed. Focusing in reverse order - if (this.currFocused <= 0) { - this.currFocused = this.focusableElements.length - 1; - } else { - this.currFocused--; - } - } - this.focusableElements[this.currFocused].focus(); - break; - case Event.KEY_ESC: - if (this.active) this._hide(event); - break; - case 32: - this._preventScroll(event); - break; - case 0: // For Gecko browsers compatibility - if (event.which == 32) this._preventScroll(event); - break; - case Event.KEY_UP: - case Event.KEY_DOWN: - case Event.KEY_PAGEDOWN: - case Event.KEY_PAGEUP: - case Event.KEY_HOME: - case Event.KEY_END: - var tagName = node.tagName.toLowerCase(); - // Safari operates in slightly different way. This realization is still buggy in Safari. - if (Prototype.Browser.WebKit && !["textarea", "select"].include(tagName)) { - event.stop(); - } else if ((tagName == "input" && ["submit", "button"].include(node.type)) || (tagName == "a")) { - event.stop(); - } - break; - } - }, - - _preventScroll: function(event) { // Disabling scrolling by "space" key - if (!["input", "textarea", "select", "button"].include(event.element().tagName.toLowerCase())) - event.stop(); - }, - - _deinit: function() { - this._removeObservers(); - Event.stopObserving(window, "resize", this.resizeObserver); - if (this.options.transitions) { - Effect.toggle(this.MBoverlay, 'appear', {duration: this.options.overlayDuration, afterFinish: this._removeElements.bind(this) }); - } else { - this.MBoverlay.hide(); - this._removeElements(); - } - this.MBcontent.setStyle({overflow: '', height: ''}); - }, - - _cleanUpContentIDs: function() { - // Replace prefixes 'MB_' in IDs for the original content - if (typeof this.content == 'object') { - if (this.content.id && this.content.id.match(/MB_/)) { - this.content.id = this.content.id.replace(/MB_/, ""); - } - - this.content.select('*[id]').each(function(el) { - el.id = el.id.replace(/MB_/, ""); - }); - } - }, - - _removeElements: function() { - if (Prototype.Browser.Opera) { // Remove overlay after-effects in Opera - window.scrollBy(0, 0); - } - this.MBoverlay.remove(); - $(this.MBwindowwrapper).remove(); - if (Prototype.Browser.IE6) { - this._prepareIEHtml("", ""); // If set to auto MSIE will show horizontal scrolling - this._prepareIESelects(""); - window.scrollTo(this.initScrollX, this.initScrollY); - } - - this._cleanUpContentIDs(); - - // Initialized will be set to false - this.initialized = false; - this.event("afterHide"); // Passing afterHide callback - this.setOptions(this._options); // Settings options object into initial state - }, - - _setWidth: function() { // Set size - this.MBwindow.setStyle({width: this.options.width + "px", height: this.options.height + "px"}); - }, - - _setWidthAndPosition: function() { - this.MBwindow.setStyle({ - width: this.options.width + "px" - }); - }, - - _prepareIEHtml: function(height, overflow) { - // IE6 requires width and height set to 100% and overflow hidden - $$('html, body').invoke('setStyle', { - width: height, - height: height, - overflow: overflow - }); - }, - - _prepareIESelects: function(visibility, prefix) { - // Toggle visibility for select elements - $$((prefix || "") + "select").invoke('setStyle', { - 'visibility': visibility - }); - }, - - event: function(eventName) { - var r = true; - if (this.options[eventName]) { - var returnValue = this.options[eventName](); // Executing callback - this.options[eventName] = null; // Removing callback after execution - if (!Object.isUndefined(returnValue)) - r = returnValue; - } - return r; - } -}; - -Object.extend(Modalbox, Modalbox.Methods); - -if (Modalbox.overrideAlert) window.alert = Modalbox.alert; diff --git a/app/assets/javascripts/searchable.js b/app/assets/javascripts/searchable.js deleted file mode 100644 index 6ef683d..0000000 --- a/app/assets/javascripts/searchable.js +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Search with chunks - */ -window.Searchable = uki.newClass(uki.view.Observable, new function() { - this.chunkSize = 100; - this.chunkTimeout = 20; - - this.init = function(data) { - this.items = data; - }; - - this.search = function(query, callback) { - stopSearch.call(this); - - this._query = query; - var iterator = this.createIterator(query, callback); - - this.trigger('search.start', iterator); - filterChunk.call(this, iterator); - }; - - this.matchRow = function( row, iterator ) { return false; }; - - this.createIterator = function(query, callback) { - return { - query: query, - iteration: 0, - found: 0, - callback: callback - }; - }; - - this._bindToDom = function() { return true }; - - function filterChunk(iterator) { - var filtered = 0, - _this = this, - foundInChunk = [], - item; - - while(iterator.iteration < this.items.length) { - if (filtered == this.chunkSize) { - if (foundInChunk.length) this.trigger('search.foundInChunk', foundInChunk); - this._searchTimer = setTimeout(function() { filterChunk.call(_this, iterator); }, this.chunkTimeout); - return; - } - item = this.items[iterator.iteration]; - if (this.matchRow( item, iterator )) { - iterator.found++; - foundInChunk.push(item); - this.trigger('search.found', item, iterator); - if (iterator.callback) iterator.callback(item, iterator); - } else { - this.trigger('search.missed', item, iterator); - } - iterator.iteration++; - filtered++; - } - this.trigger('search.foundInChunk', foundInChunk); - - stopSearch.call(this); - this.trigger('search.finish', iterator); - }; - - function stopSearch () { - if (this._searchTimer) { - clearTimeout(this._searchTimer); - this._searchTimer = false; - } - } -}); \ No newline at end of file diff --git a/app/assets/javascripts/uki-more.js b/app/assets/javascripts/uki-more.js deleted file mode 100644 index 9f75423..0000000 --- a/app/assets/javascripts/uki-more.js +++ /dev/null @@ -1,827 +0,0 @@ -uki.more = {}; - -uki.more.utils = { - range: function (from, to) { - var result = new Array(to - from), idx = 0; - for (; from <= to; from++, idx++) { - result[idx] = from; - }; - return result; - } -}; - -uki.extend(uki, uki.more.utils); - -uki.more.view = {}; - -uki.viewNamespaces.push('uki.more.view.'); - -// really basic tree list implementation -uki.more.view.treeList = {}; - -uki.view.declare('uki.more.view.TreeList', uki.view.List, function(Base) { - this._setup = function() { - Base._setup.call(this); - this._render = new uki.more.view.treeList.Render(); - }; - - this.listData = Base.data; - - this.data = uki.newProp('_treeData', function(v) { - this._treeData = v; - this._data = this._treeNodeToListData(v); - var children = this.listData(), opened = false; - for (var i=children.length - 1; i >= 0 ; i--) { - if (this._data[i].__opened) { - opened = true; - this._openSubElement(i); - } - }; - this.listData(this._data); - if (opened) this.trigger('open'); - }); - - this._treeNodeToListData = function(node, indent) { - indent = indent || 0; - return uki.map(node, function(row) { - row.__indent = indent; - return row; - }); - }; - - this.toggle = function(index) { - this._data[index].__opened ? this.close(index) : this.open(index); - }; - - function offsetFrom (array, from, offset) { - for (var i = from; i < array.length; i++) { - array[i] += offset; - }; - } - - function recursiveLength (item) { - var children = uki.attr(item, 'children'), - length = children.length; - - for (var i=0; i < children.length; i++) { - if (children[i].__opened) length += recursiveLength(children[i]); - }; - return length; - } - - this._openSubElement = function(index) { - var item = this._data[index], - children = uki.attr(item, 'children'); - - if (!children || !children.length) return 0; - var length = children.length; - - item.__opened = true; - this._data.splice.apply(this._data, [index+1, 0].concat( this._treeNodeToListData(children, item.__indent + 1) )); - - for (var i=children.length - 1; i >= 0 ; i--) { - if (this._data[index+1+i].__opened) { - length += this._openSubElement(index+1+i); - } - }; - return length; - }; - - this.open = function(index) { - if (this._data[index].__opened) return this; - - var length = this._openSubElement(index), - positionInSelection = uki.binarySearch(index, this._selectedIndexes), - clickIndex = this._lastClickIndex, - indexes = this._selectedIndexes; - - this.clearSelection(true); - offsetFrom( - indexes, - positionInSelection + (indexes[positionInSelection] == index ? 1 : 0), - length - ); - - this.listData(this._data); - this.selectedIndexes(indexes); - this._lastClickIndex = clickIndex > index ? clickIndex + length : clickIndex; - this.trigger('open'); - return this; - }; - - this.close = function(index) { - var item = this._data[index], - indexes = this._selectedIndexes, - children = uki.attr(item, 'children'); - if (!children || !children.length || !item.__opened) return; - - var length = recursiveLength(item); - - item.__opened = false; - this._data.splice(index+1, length); - - var positionInSelection = uki.binarySearch(index, indexes), - removeFrom = positionInSelection + (indexes[positionInSelection] == index ? 1 : 0), - toRemove = 0, - clickIndex = this._lastClickIndex; - while (indexes[removeFrom + toRemove] && indexes[removeFrom + toRemove] <= index + length) toRemove++; - - this.clearSelection(true); - offsetFrom(indexes, removeFrom, -length); - if (toRemove > 0) { - indexes.splice(positionInSelection, toRemove); - } - - this.listData(this._data); - this.selectedIndexes(indexes); - this._lastClickIndex = clickIndex > index ? clickIndex - length : clickIndex; - this.trigger('close'); - }; - - this._mousedown = function(e) { - if (e.target.className.indexOf('toggle-tree') > -1) { - var o = uki.dom.offset(this._dom), - y = e.pageY - o.y, - p = y / this._rowHeight << 0; - this.toggle(p); - } else { - Base._mousedown.call(this, e); - } - }; - - this._keypress = function(e) { - Base._keypress.call(this, e); - e = e.domEvent; - if (e.which == 39 || e.keyCode == 39) { // RIGHT - this.open(this._lastClickIndex); - } else if (e.which == 37 || e.keyCode == 37) { // LEFT - this.close(this._lastClickIndex); - } - }; - -}); -// tree list render -uki.more.view.treeList.Render = uki.newClass(uki.view.list.Render, new function() { - this._parentTemplate = new uki.theme.Template( - '
' + - '
${text}' + - '
' - ); - - this._leafTemplate = new uki.theme.Template( - '
${text}
' - ); - - this.initStyles = function() { - this.classPrefix = 'treeList-' + uki.guid++; - var style = new uki.theme.Template( - '.${classPrefix}-row { color: #333; position:relative; padding-top:3px; } ' + - '.${classPrefix}-toggle { overflow: hidden; position:absolute; left:-15px; top:5px; width: 10px; height:9px; } ' + - '.${classPrefix}-toggle i { display: block; position:absolute; left: 0; top: 0; width:20px; height:18px; background: url(${imageSrc});} ' + - '.${classPrefix}-selected { background: #3875D7; } ' + - '.${classPrefix}-selected .${classPrefix}-row { color: #FFF; } ' + - '.${classPrefix}-selected i { left: -10px; } ' + - '.${classPrefix}-selected-blured { background: #CCCCCC; } ' + - '.${classPrefix}-opened i { top: -9px; }' - ).render({ - classPrefix: this.classPrefix, - imageSrc: 'i/arrows.png' // should call uki.image here - }); - uki.dom.createStylesheet(style); - }; - - this.render = function(row, rect, i) { - this.classPrefix || this.initStyles(); - var text = row.data, - children = uki.attr(row, 'children'); - if (children && children.length) { - return this._parentTemplate.render({ - text: text, - indent: row.__indent*18 + 22, - classPrefix: this.classPrefix, - opened: row.__opened ? 'opened' : '' - }); - } else { - return this._leafTemplate.render({ - text: text, - indent: row.__indent*18 + 22, - classPrefix: this.classPrefix - }); - } - }; - - this.setSelected = function(container, data, state, focus) { - container.className = !state ? '' : focus ? this.classPrefix + '-selected' : this.classPrefix + '-selected-blured'; - }; -}); - -uki.view.declare('uki.more.view.ToggleButton', uki.view.Button, function(Base) { - - this._setup = function() { - Base._setup.call(this); - this._focusable = false; - }; - - this.value = this.checked = uki.newProp('_checked', function(state) { - this._checked = !!state; - this._updateBg(); - }); - - this._updateBg = function() { - var name = this._disabled ? 'disabled' : this._down || this._checked ? 'down' : this._over ? 'hover' : 'normal'; - this._backgroundByName(name); - }; - - this._mouseup = function(e) { - if (!this._down) return; - this._down = false; - if (!this._disabled) this.checked(!this.checked()) - }; - -}); - - -uki.view.declare('uki.more.view.RadioButton', uki.more.view.ToggleButton, function(base) { - var manager = uki.view.Radio; - - this.group = uki.newProp('_group', function(g) { - manager.unregisterGroup(this); - this._group = g; - manager.registerGroup(this); - if (this.checked()) manager.clearGroup(this); - }); - - this.value = this.checked = uki.newProp('_checked', function(state) { - this._checked = !!state; - if (state) manager.clearGroup(this); - this._updateBg(); - }); - - this._mouseup = function() { - if (!this._down) return; - this._down = false; - if (!this._checked && !this._disabled) { - this.checked(!this._checked); - this.trigger('change', {checked: this._checked, source: this}); - } - } -}); -uki.more.view.splitTable = {}; - -uki.view.declare('uki.more.view.SplitTable', uki.view.Container, function(Base) { - var Rect = uki.geometry.Rect, - Size = uki.geometry.Size; - - var propertiesToDelegate = 'rowHeight data packSize visibleRectExt render selectedIndex focusable textSelectable multiselect'.split(' '); - - - this._defaultHandlePosition = 200; - this._headerHeight = 17; - - this._style = function(name, value) { - this._leftHeader.style(name, value); - this._rightHeader.style(name, value); - return Base._style.call(this, name, value); - }; - - this.columns = uki.newProp('_columns', function(c) { - this._columns = uki.build(c); - this._totalWidth = 0; - this._leftHeader.columns([this._columns[0]]); - - this._columns[0].bind('beforeResize', uki.proxy(this._syncHandlePosition, this, this._columns[0])); - - for (var i = 1; i < this._columns.length; i++) { - this._columns[i].position(i - 1); - this._columns[i].bind('beforeResize', uki.proxy(this._rightColumnResized, this, this._columns[i])); - }; - this._updateTotalWidth(); - this._rightHeader.columns(Array.prototype.slice.call(this._columns, 1)); - this._splitPane.leftMin(this._columns[0].minWidth() - 1) - // this._splitPane.handlePosition(this._columns[0].width()); - this._syncHandlePosition(this._splitPane); - }); - - uki.each(propertiesToDelegate, function(i, name) { - this[name] = function(v) { - if (v === undefined) return this._leftList[name](); - this._leftList[name](v); - this._rightList[name](v); - return this; - }; - }, this); - - this.hasFocus = function() { - return this._leftList.hasFocus() || this._rightList.hasFocus(); - }; - - this.rightColumns = function() { - return this._rightHeader.columns(); - }; - - this._rightColumnResized = function(column) { - this._updateTotalWidth(); - this._horizontalScroll.layout(); - }; - - this.rowHeight = function(value) { - if (value === undefined) return this._leftList.rowHeight(); - this._leftList.rowHeight(value); - this._rightList.rowHeight(value); - return this; - }; - - this.data = function(d) { - if (d === undefined) return uki.map(this._leftList.data(), function(value, i) { - return [value].concat(this._rightList.data()[i]); - }, this); - - this._leftList.data(uki.map(d, function(value) { - return [value[0]]; - })); - - this._rightList.data(uki.map(d, function(value) { - return value.slice(1); - })); - - this._splitPane.minSize(new Size(0, this._leftList.minSize().height)); - this._verticalScroll.layout(); - }; - - this._createDom = function() { - Base._createDom.call(this); - var scrollWidth = uki.view.ScrollPane.initScrollWidth(), - bodyHeight = this.rect().height - this._headerHeight - scrollWidth, - contents = uki( - [ - { - view: 'table.Header', - rect: new Rect(this._defaultHandlePosition, this._headerHeight), - anchors: 'left top' - }, - { - view: 'Box', - className: 'table-header-container', - style: { overflow: 'hidden' }, - rect: new Rect(this._defaultHandlePosition, 0, this.rect().width - this._defaultHandlePosition - 1, this._headerHeight), - anchors: 'left top right', - childViews: { - view: 'table.Header', - rect: new Rect(this.rect().width - this._defaultHandlePosition - 1, this._headerHeight), - anchors: 'top left right', - className: 'table-header' - } - }, - { - view: 'ScrollPane', - rect: new Rect(0, this._headerHeight, this.rect().width, bodyHeight), - anchors: 'left top right bottom', - className: 'table-v-scroll', - scrollV: true, - childViews: [ - { - view: 'HSplitPane', - rect: new Rect(this.rect().width, bodyHeight), - anchors: 'left top right bottom', - className: 'table-horizontal-split-pane', - handlePosition: this._defaultHandlePosition, - handleWidth: 1, - leftChildViews: [ - { - view: 'List', - rect: new Rect(this._defaultHandlePosition, bodyHeight), - anchors: 'left top right bottom', - className: 'table-list-left' - } - ], - rightChildViews: [ - { - view: 'Box', - rect: '0 0 100 100', - anchors: 'left top right bottom', - style: { overflow: 'hidden' }, - rect: new Rect(this.rect().width - this._defaultHandlePosition - 1, bodyHeight), - childViews: { - view: 'ScrollPane', - rect: new Rect(this.rect().width - this._defaultHandlePosition - 1, bodyHeight + scrollWidth), - scrollableV: false, - scrollableH: true, - anchors: 'left top right bottom', - className: 'table-h-scroll', - childViews: [ - { - view: 'List', - rect: new Rect(this.rect().width - this._defaultHandlePosition - 1, bodyHeight + scrollWidth), - anchors: 'left top right bottom' - } - ] - } - - } - ] - } - ] - }, - { - view: 'ScrollPane', - rect: new Rect(this._defaultHandlePosition + 1, bodyHeight + this._headerHeight, this.rect().width - this._defaultHandlePosition - 1, scrollWidth), - anchors: 'left bottom right', - scrollableH: true, - scrollableV: false, - scrollH: true, - className: 'table-h-scroll-bar', - childViews: { view: 'Box', rect: '1 1', anchors: 'left top' } - } - ]).appendTo(this); - - this._verticalScroll = uki('ScrollPane[className=table-v-scroll]', this)[0]; - this._horizontalScroll = uki('ScrollPane[className=table-h-scroll]', this)[0]; - this._horizontalScrollBar = uki('ScrollPane[className=table-h-scroll-bar]', this)[0]; - this._leftList = uki('List:eq(0)', this)[0]; - this._rightList = uki('List:eq(1)', this)[0]; - this._splitPane = uki('HSplitPane', this)[0]; - this._leftHeader = uki('table.Header:eq(0)', this)[0]; - this._rightHeader = uki('table.Header:eq(1)', this)[0]; - this._rightHeaderContainer = uki('[className=table-header-container]', this)[0]; - this._dummyScrollContents = uki('Box', this._horizontalScrollBar); - - this._leftList._scrollableParent = this._verticalScroll; - this._rightList._scrollableParent = this._verticalScroll; - this._verticalScroll.bind('scroll', uki.proxy(this._leftList._scrollableParentScroll, this._leftList)); - this._verticalScroll.bind('scroll', uki.proxy(this._rightList._scrollableParentScroll, this._rightList)); - - this._leftList.render(new uki.more.view.splitTable.Render(this._leftHeader)); - this._rightList.render(new uki.more.view.splitTable.Render(this._rightHeader)); - this._bindEvents(); - }; - - this._bindEvents = function() { - this._splitPane.bind('handleMove', uki.proxy(this._syncHandlePosition, this, this._splitPane)); - this._horizontalScroll.bind('scroll', uki.proxy(this._syncHScroll, this, this._horizontalScroll)); - this._horizontalScrollBar.bind('scroll', uki.proxy(this._syncHScroll, this, this._horizontalScrollBar)); - this._leftList.bind('selection', uki.proxy(this._syncSelection, this, this._leftList)); - this._rightList.bind('selection', uki.proxy(this._syncSelection, this, this._rightList)); - }; - - var updatingHandlePosition = false; - this._syncHandlePosition = function(source) { - if (updatingHandlePosition) return; - updatingHandlePosition = true; - var w, rect; - if (source == this._splitPane) { - w = this._splitPane.handlePosition() + 1; - this.columns()[0].width(w); - } else { - var w = this.columns()[0].width(); - this._splitPane.handlePosition(w - 1).layout(); - } - - this._leftHeader.rect(new Rect(w, this._headerHeight)).layout(); - - rect = this._rightHeaderContainer.rect().clone(); - rect.x = w; - rect.width = this._rect.width - w - uki.view.ScrollPane.initScrollWidth(); - this._rightHeaderContainer.rect(rect).layout(); - rect = this._horizontalScrollBar.rect().clone(); - rect.x = w; - rect.width = this._rect.width - w - uki.view.ScrollPane.initScrollWidth(); - this._horizontalScrollBar.rect(rect).layout(); - updatingHandlePosition = false; - }; - - var updatingHScroll = false; - this._syncHScroll = function(source) { - if (updatingHScroll) return; - updatingHScroll = true; - var scroll, target = source == this._horizontalScroll ? this._horizontalScrollBar : this._horizontalScroll; - scroll = source.scrollLeft(); - target.scrollLeft(scroll); - this._rightHeader.dom().style.marginLeft = -scroll + 'px'; - updatingHScroll = false; - }; - - var updatingSelection = false; - this._syncSelection = function(source) { - if (updatingSelection) return; - updatingSelection = true; - var target = source == this._leftList ? this._rightList : this._leftList; - target.selectedIndexes(source.selectedIndexes()); - updatingSelection = false; - }; - - this._updateTotalWidth = function() { - this._totalWidth = 0; - for (var i=1; i < this._columns.length; i++) { - this._totalWidth += this._columns[i].width(); - }; - this._rightHeader.minSize(new Size(this._totalWidth, 0)); - this._rightList.minSize(new Size(this._totalWidth, this._rightList.minSize().height)); - this._dummyScrollContents.rect(new Rect(this._totalWidth, 1)).parent().layout(); - this._rightHeader.minSize(new Size(this._totalWidth, 0)); - this._horizontalScroll.layout(); - }; - -}); -uki.more.view.splitTable.Render = uki.newClass(uki.view.table.Render, new function() { - - this.setSelected = function(container, data, state, focus) { - focus = true; - container.style.backgroundColor = state && focus ? '#3875D7' : state ? '#CCC' : ''; - container.style.color = state && focus ? '#FFF' : '#000'; - } - -}); - - -uki.view.declare('uki.more.view.Form', uki.view.Container, function(Base) { - - this._setup = function() { - Base._setup.call(this); - uki.extend(this, { - _method: 'GET', - _action: '' - }); - }; - - this.action = uki.newProp('_action', function(action) { - this._dom.action = this._action = action; - }); - this.method = uki.newProp('_method', function(method) { - this._dom.method = this._method = method; - }); - - this.submit = function() { this._dom.submit(); } - this.reset = function() { this._dom.reset(); } - - this._createDom = function() { - this._dom = uki.createElement('form', Base.defaultCss); - this._initClassName(); - this._dom.action = this._action; - this._dom.method = this._method; - }; - -}); - - -uki.view.declare('uki.more.view.Select', uki.view.Checkbox, function(Base) { - this._backgroundPrefix = 'select-'; - this._popupBackground = 'theme(select-popup)'; - this._listBackground = 'theme(select-list)'; - this._popupOffset = 0; - - this._setup = function() { - Base._setup.call(this); - this._inset = new uki.geometry.Inset(0, 20, 0, 4); - this._selectFirst = true; - this._focusable = true; - this._options = []; - this._maxPopupHeight = 200; - this._lastScroll = 0; - }; - - this.Render = uki.newClass(uki.view.list.Render, function(Base) { - this.render = function(data, rect, i) { - return '' + data + ''; - } - - this.setSelected = function(container, data, state, focus) { - container.style.backgroundColor = state ? '#3875D7' : ''; - container.style.color = state ? '#FFF' : '#000'; - } - }); - - this.selectFirst = uki.newProp('_selectFirst'); - - this.opened = function() { - return this._popup.visible() && this._popup.parent(); - }; - - this.popupAnchors = function(v) { - if (v === undefined) return this._popup.anchors(); - this._popup.anchors(v); - return this; - }; - - this._createDom = function() { - Base._createDom.call(this); - this.style({ fontWeight: 'normal', textAlign: 'left' }); - - this._label.style.overflow = 'hidden'; - this._popup = uki( - { view: 'Popup', anchors: 'left top', rect: '100 100', style: {zIndex: 1000}, offset: this._popupOffset, - background: this._popupBackground, relativeTo: this, visible: false, - childViews: [ - { view: 'ScrollPane', rect: '100 100', anchors: 'left top right bottom', childViews: [ - { view: 'List', rect: '100 100', anchors: 'left top right bottom', rowHeight: 22, - textSelectable: false, focusable: true, background: this._listBackground, - render: new this.Render(), style: { fontSize: '12px' } } - ] } - ] } - )[0]; - - this._popup.hide(); - - this._list = uki('List', this._popup)[0]; - this._scroll = uki('ScrollPane', this._popup)[0]; - - this._popup.bind('toggle', uki.proxy(function(e) { - this._down = this._popup.visible(); - if (this._popup.visible()) { - this._updateWidth(); - this._scroll.scrollTop(this._lastScroll); - } - this._checked = this._popup.visible(); - this._updateBg(); - }, this)); - - this.bind(this._list.keyPressEvent(), function(e) { - if (this.preventTransfer) { - this.preventTransfer = false; - return; - } - if (this._popup.visible()) { - this._list.trigger(e.type, e); - } - }); - - this.bind('blur', function() { - setTimeout(uki.proxy(function() { - if (!this._hasFocus && this.opened()) { - this._lastScroll = this._scroll.scrollTop(); - this._popup.hide(); - } - }, this), 50) - }); - - // refocus on list click - this._list.bind('focus', uki.proxy(function() { - this._hasFocus = false; - this.focus(); - // setTimeout(uki.proxy(this.focus, this), 5); - }, this)); - - this._list.bind('click', uki.proxy(this.selectCurrent, this)); - }; - - this.contentsSize = function(autosize) { - var html = this.html(), size; - this.html(this._longestText); - size = Base.contentsSize.call(this, autosize); - this.html(html); - return size; - }; - - this._keydown = function(e) { - if ((e.which == 32 || e.which == 13) && this._popup.visible()) { - this.selectCurrent(e); - } else if ((e.which == 40 || e.which == 38) && !this._popup.visible()) { - this._popup.toggle(); - e.preventDefault(); - this.preventTransfer = true; - } else { - Base._keydown.call(this, e); - } - }; - - this.selectCurrent = function(e) { - if (this.selectedIndex() == -1) { - this.text(this._selectFirst && this._options[0] ? this._options[0].text : ''); - } else { - this.text(this._options[this.selectedIndex()].text); - } - this._lastScroll = this._scroll.scrollTop(); - this._popup.hide(); - if (e) this.trigger('change', { source: this }); - }; - - this.value = function(v) { - if (v === undefined) { - return this._options[this.selectedIndex()] ? this._options[this.selectedIndex()].value : undefined; - } else { - var index = -1, - option, - l = this._options.length, - i; - for (i=0; i < l; i++) { - option = this._options[i]; - if (option.value == v) { - index = i; - break; - } - }; - this.selectedIndex(index); - this.selectCurrent(); - } - }; - - this.maxPopupHeight = uki.newProp('_maxPopupHeight'); - - this._updateWidth = function() { - if (this._widthCached || !this._options.length) return; - var source = this._list.dom().firstChild.firstChild.firstChild, /// omg! - html = source.innerHTML; - - source.innerHTML = this._longestText; - this._widthCached = source.offsetWidth + 8; - source.innerHTML = html; - this._popup.rect(new uki.geometry.Rect( - this._popup.rect().x, - this._popup.rect().y, - Math.max(this._widthCached, this.rect().width), - Math.min(this._maxPopupHeight, this._options.length * 22) - )).layout(); - }; - - this.options = uki.newProp('_options', function(o) { - this._options = o; - this._list - .data(uki.map(o, 'text')) - .selectedIndex(0); - - if (this._selectFirst && (o.length > 0)) this.text(o[0].text); - this._longestText = ''; - uki.each(o, function(i, row) { - if (row.text.length > this._longestText.length) this._longestText = row.text; - }, this); - this._widthCached = false; - this._lastScroll = 0; - }); - - uki.delegateProp(this, 'selectedIndex', '_list'); - - this._updateBg = function() { - return Base._updateBg.call(this); - }; - - this._mousedown = function(e) { - Base._mousedown.call(this, e); - if (this.disabled()) return; - this._popup.toggle(); - this.trigger('toggle', { opened: this.opened() }); - // if (this._popup.visible()) this._list.focus(); - }; - - this._mouseup = function(e) { - if (!this._down) return; - this._down = false; - }; - -}); - -uki.Collection.addAttrs(['options']); - - -(function() { - function selectHandle (image, css) { - return new uki.background.CssBox((css || '') + 'background: url(' + uki.theme.imageSrc(image) + '); background-position: 100% 50%; background-repeat: no-repeat;'); - } - - var theme = uki.extend({}, uki.theme.Base, { - backgrounds: { - // 'select-list': function() { - // - // }, - // 'select-popup': function() { - // - // }, - 'select-normal': function() { - return new uki.background.Multi( - selectHandle('select-handle-normal'), - uki.theme.background('button-normal') - ); - }, - 'select-hover': function() { - return new uki.background.Multi( - selectHandle('select-handle-normal'), - uki.theme.background('button-hover') - ); - }, - 'select-checked-normal': function() { - return new uki.background.Multi( - selectHandle('select-handle-normal'), - uki.theme.background('button-down') - ); - }, - 'select-disabled': function() { - return new uki.background.Multi( - selectHandle('select-handle-normal', 'opacity:0.4;'), - uki.theme.background('button-disabled') - ); - }, - - 'select-popup': function() { - return uki.theme.background('popup-normal'); - } - }, - - imageSrcs: { - 'select-handle-normal': function() { - return ["select-down-m.png", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAABkCAYAAABtnKvPAAAAeUlEQVRo3u3SMQ2AMBAFUCQgAQlIQUKTthq6IhEpOIAOTIWFABPvkr/c8IZ/15VStu6rgcPhcDgcDofD4XA4HA6HnybnvNRsF1ke4yGEoUJrA691379SS4xxavDx1c5TSvMBh08Oegv253A4HA6Hw+FwOBwOh8P/ie9z0RuWFOYPhAAAAABJRU5ErkJggg==", "select-down-m.gif"]; - } - } - }); - theme.backgrounds['select-checked-hover'] = theme.backgrounds['select-checked-normal']; - - uki.theme.register(theme); -})(); - diff --git a/app/assets/javascripts/uki.js b/app/assets/javascripts/uki.js deleted file mode 100644 index e748c85..0000000 --- a/app/assets/javascripts/uki.js +++ /dev/null @@ -1,8022 +0,0 @@ -/*! - * uki JavaScript Library - * Licensed under the MIT license http://ukijs.org/LICENSE - * - * Copyright (c) 2010 Vladimir Kolesnikov - * - * Parts of code derived from jQuery JavaScript Library - * Copyright (c) 2009 John Resig - */ -(function() { - /** - * Global uki constants, for speed optimization and better merging - */ -/** @ignore */ -var root = this, - doc = document, - nav = navigator, - ua = nav.userAgent, - expando = 'uki' + (+new Date), - - MAX = Math.max, - MIN = Math.min, - FLOOR = Math.floor, - CEIL = Math.ceil, - - PX = 'px'; - - - -/** - * Shortcut access to uki.build, uki.Selector.find and uki.Collection constructor - * uki('#id') is also a shortcut for search by id - * - * @param {String|uki.view.Base|Object|Array.} val - * @param {Array.=} optional context for selector - * @class - * @namespace - * @name uki - * @return {uki.Collection} - */ -root.uki = root.uki || function(val, context) { - if (typeof val === "string") { - - var m = val.match(/^#((?:[\w\u00c0-\uFFFF_-]|\\.)+)$/), - e = m && uki._ids[m[1]]; - if (m && !context) { - return new uki.Collection( e ? [e] : [] ); - } - return uki.find(val, context); - - } - if (val.length === undefined) val = [val]; - if (val.length > 0 && uki.isFunction(val[0].typeName)) return new uki.Collection(val); - - return uki.build(val); -}; - -/** - * @type string - * @field - */ -uki.version = '0.3.8'; -uki.guid = 1; - -/** - * Empty function - * @type function():boolean - */ -uki.F = function() { return false; }; -uki._ids = {}; - -uki.registerId = function(comp) { - uki._ids[ uki.attr(comp, 'id') ] = comp; -}; -uki.unregisterId = function(comp) { - uki._ids[ uki.attr(comp, 'id') ] = undefined; -}; - - - -(function() { - -var toString = Object.prototype.toString, - trim = String.prototype.trim, - slice = Array.prototype.slice, - - trimRe = /^\s+|\s+$/g; - -var marked = '__uki_marked'; - -// dummy subclass -/** @ignore */ -function inheritance () {} - -/** - * Utility functions. - */ -var utils = { - - /** - * Sets or retrieves attribute on an object. - *

If target has function with attr it will be called target[attr](value=) - * If no function present attribute will be set/get directly: target[attr] = value or return target[attr]

- * - * @example - * uki.attr(view, 'name', 'funny') // sets name to funny on view - * uki.attr(view, 'id') // gets id attribute of view - * - * @param {object} target - * @param {string} attr Attribute name - * @param {object=} value Value to set - * @returns {object} target if value is being set, retrieved value otherwise - */ - attr: function(target, attr, value) { - if (value !== undefined) { - if (target[attr] && target[attr].apply) { - // if (uki.isFunction(target[attr])) { - target[attr](value); - } else { - target[attr] = value; - } - return target; - } else { - if (target[attr] && target[attr].apply) { - // if (uki.isFunction(target[attr])) { - return target[attr](); - } else { - return target[attr]; - } - } - }, - - /** - * Runs a function in a given context - * - * @param {function()} fn - * @param {object} context - */ - proxy: function(fn, context) { - var args = slice.call(arguments, 2), - result = function() { - return fn.apply(context, args.concat(slice.call(arguments, 0))); - }; - result.huid = fn.huid = fn.huid || uki.guid++; - return result; - }, - - /** - * Checks if obj is a function - * - * @param {object} object Object to check - * @returns {boolean} - */ - isFunction: function( obj ) { - return toString.call(obj) === "[object Function]"; - }, - - /** - * Checks if obj is an Array - * - * @param {object} object Object to check - * @returns {boolean} - */ - isArray: function( obj ) { - return toString.call(obj) === "[object Array]"; - }, - - /** - * Trims the string - * - * @param {string} text - * @returns {string} trimmed text - */ - trim: function( text ) { - text = text || ''; - return trim ? trim.call(text) : text.replace( trimRe, "" ); - }, - - /** - * Converts unsafe symbols to entities - * - * @param {string} html - * @returns {string} escaped html - */ - escapeHTML: function( html ) { - var trans = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''' - }; - return (html + '').replace(/[&<>\"\']/g, function(c) { return trans[c]; }); - }, - - /** - * Iterates through all non empty values of object or an Array - * - * @param {object|Array} object Object to iterate through - * @param {function(number, object):boolean} callback Called for every item, may return false to stop iteration - * @param {object} context Context in which callback should called. If not specified context will be set to - * current item - * @returns {object} - */ - each: function( object, callback, context ) { - var name, i = 0, length = object.length; - - if ( length === undefined ) { - for ( name in object ) { - if ( !name || object[ name ] === undefined || !object.hasOwnProperty(name) ) continue; - if ( callback.call( context || object[ name ], name, object[ name ] ) === false ) { break; } - } - } else { - for ( var value = object[0]; i < length && callback.call( context || value, i, value ) !== false; value = object[++i] ){} - } - return object; - }, - - /** - * Checks if elem is in array - * - * @param {object} elem - * @param {object} array - * @returns {boolean} - */ - inArray: function( elem, array ) { - for ( var i = 0, length = array.length; i < length; i++ ) { - if ( array[ i ] === elem ) { return i; } - } - - return -1; - }, - - /** - * Returns unique elements in array - * - * @param {Array} array - * @returns {Array} - */ - unique: function( array ) { - if (array.length && (typeof array[0] == 'object' || typeof array[0] == 'function')) { - var result = [], - i; - - for (i = 0; i < array.length; i++) { - if (!array[i][marked]) { result[result.length] = array[i]; } - array[i][marked] = true; - }; - for (i = 0; i < result.length; i++) { - delete result[i][marked]; - }; - return result; - - } else { - - var ret = [], - done = {}; - - for ( var i = 0, length = array.length; i < length; i++ ) { - var id = array[ i ]; - - if ( !done[ id ] ) { - done[ id ] = true; - ret.push( array[ i ] ); - } - } - - return ret; - } - }, - - /** - * Searches for all items matching given criteria - * - * @param {Array} elems Element to search through - * @param {function(object, number)} callback Returns true for every matched element - * @returns {Array} matched elements - */ - grep: function( elems, callback ) { - var ret = []; - - for ( var i = 0, length = elems.length; i < length; i++ ) { - if ( callback( elems[ i ], i ) ) { ret.push( elems[ i ] ); } - } - - return ret; - }, - - /** - * Maps elements passing them to callback - * @example - * x = uki.map([1, 2, 3], function(item) { return -item }); - * - * @param {Array} elems Elements to map - * @param {function(object, number)} mapping function - * @param {object} context Context in which callback should called. If not specified context will be set to - * current item - * @returns {Array} mapped values - */ - map: function( elems, callback, context ) { - var ret = [], - mapper = uki.isFunction(callback) ? callback : - function(e) { return uki.attr(e, callback); }; - - for ( var i = 0, length = elems.length; i < length; i++ ) { - var value = mapper.call( context || elems[ i ], elems[ i ], i ); - - if ( value != null ) { ret[ ret.length ] = value; } - } - - return ret; - }, - - /** - * Reduces array - * @example - * x = uki.reduce(1, [1, 2, 3], function(p, x) { return p * x}) // calculates product - * - * @param {object} initial Initial value - * @param {Array} elems Elements to reduce - * @param {function(object, number)} reduce function - * @param {object} context Context in which callback should called. If not specified context will be set to - * current item - * @returns {object} - */ - reduce: function( initial, elems, callback, context ) { - for ( var i = 0, length = elems.length; i < length; i++ ) { - initial = callback.call( context || elems[ i ], initial, elems[ i ], i ); - } - return initial; - }, - - /** - * Copies properties from one object to another - * @example - * uki.extend(x, { width: 13, height: 14 }) // sets x.width = 13, x.height = 14 - * options = uki.extend({}, defaultOptions, options) - * - * @param {object} target Object to copy properties into - * @param {...object} sources Objects to take properties from - * @returns Describe what it returns - */ - extend: function() { - var target = arguments[0] || {}, i = 1, length = arguments.length, options; - - for ( ; i < length; i++ ) { - if ( (options = arguments[i]) != null ) { - - for ( var name in options ) { - var copy = options[ name ]; - - if ( copy !== undefined ) { - target[ name ] = copy; - } - - } - } - } - - return target; - }, - - /** - * Creates a new class inherited from base classes. Init function is used as constructor - * @example - * baseClass = uki.newClass({ - * init: function() { this.x = 3 } - * }); - * - * childClass = uki.newClass(baseClass, { - * getSqrt: function() { return this.x*this.x } - * }); - * - * @param {object=} superClass If superClass has prototype "real" prototype base inheritance is used, - * otherwise superClass properties are simply copied to newClass prototype - * @param {Array.=} mixins - * @param {object} methods - * @returns Describe what it returns - */ - newClass: function(/* [[superClass], mixin1, mixin2, ..] */ methods) { - var klass = function() { - this.init.apply(this, arguments); - }, - - i, startFrom = 0, tmp, baseClasses = [], base, name, copy, $arguments = arguments, length; - - if ((length = $arguments.length) > 1) { - base = $arguments[0]; - if (base.prototype) { // real inheritance - inheritance.prototype = base.prototype; - klass.prototype = new inheritance(); - startFrom = 1; - baseClasses = [inheritance.prototype]; - - // class method inheritance - for ( name in base ) { - copy = base[ name ]; - if ( !base.hasOwnProperty(name) || copy === undefined || name == 'prototype' ) continue; - klass[ name ] = copy; - } - } - } - - for (i=startFrom; i < length; i++) { - base = $arguments[i]; - if (this.isFunction(base)) { - tmp = {}; - base.apply(tmp, baseClasses); - base = tmp; - } - baseClasses[ baseClasses.length ] = base; - - uki.extend(klass.prototype, base); - }; - if (!klass.prototype.init) klass.prototype.init = function() {}; - return klass; - }, - - /** - * Search closest value in a sorted array - * @param {nubmer} value to search - * @param {array} array sorted array - * @returns {number} index of closest value - */ - binarySearch: function (value, array) { - var low = 0, high = array.length, mid; - - while (low < high) { - mid = (low + high) >> 1; - array[mid] < value ? low = mid + 1 : high = mid; - } - - return low; - }, - - - /** - * Creates default uki property function - *

If value is given to this function it sets property to value - * If no arguments given than function returns current property value

- * - *

Optional setter can be given. In this case setter will be called instead - * of simple this[field] = value

- * - *

If used as setter function returns self

- * - * @example - * x.width = uki.newProperty('_width'); - * x.width(12); // x._width = 12 - * x.width(); // return 12 - * - * @param {string} field Field name - * @param {function(object)=} setter - * @returns {function(object=):object} - */ - newProp: function(field, setter) { - return function(value) { - if (value === undefined) return this[field]; - if (setter) { setter.call(this, value); } else { this[field] = value; }; - return this; - }; - }, - - /** - * Adds several properties (uki.newProp) to a given object. - *

Field name equals to '_' + property name

- * - * @example - * uki.addProps(x, ['width', 'height']) - * - * @param {object} proto Object to add properties to - * @param {Array.} props Property names - */ - addProps: function(proto, props) { - for (var i =0, len = props.length; i= this.minX() && - point.x <= this.maxX() && - point.y >= this.minY() && - point.y <= this.maxY(); - }, - - /** - * Checks if this contains given rect - * - * @this {uki.geometry.Rect} - * @param {uki.geometry.Rect} rect - * @returns {boolean} - */ - containsRect: function(rect) { - return this.eq(this.union(rect)); - }, - - constructor: Rect -}; - -Rect.prototype.left = Rect.prototype.minX; -Rect.prototype.top = Rect.prototype.minY; - -/** - * Creates Rect from minX, minY, maxX, maxY - * - * @memberOf uki.geometry.Rect - * @name fromCoords - * @function - * - * @param {number} minX - * @param {number} maxX - * @param {number} minY - * @param {number} maxY - * @returns {uki.geometry.Rect} - */ -Rect.fromCoords = function(minX, minY, maxX, maxY) { - if (maxX === undefined) { - return new Rect( - minX.x, - minX.y, - minY.x - minX.x, - minY.y - minX.y - ); - } - return new Rect(minX, minY, maxX - minX, maxY - minY); -}; - -/** - * Creates Rect from "minX minY maxX maxY" string - * - * @memberOf uki.geometry.Rect - * @name fromCoordsString - * @function - * - * @param {string} string - * @returns {uki.geometry.Rect} - */ -Rect.fromCoordsString = function(string) { - var parts = string.split(/\s+/); - return Rect.fromCoords( - parts[0], - parts[1], - parts[2], - parts[3] - ) ; -}; - -/** - * Creates Rect from "x y width height" or "width height" string - * - * @memberOf uki.geometry.Rect - * @name fromString - * @function - * - * @param {string} string - * @returns {uki.geometry.Rect} - */ -Rect.fromString = function(string) { - var parts = string.split(/\s+/); - - if (parts.length > 2) return new Rect( - parts[0], - parts[1], - parts[2], - parts[3] - ); - return new Rect( - parts[0], - parts[1] - ) ; -}; - -/** - * Creates rect from different representations - * - if no params given returns null - * - if uki.geometry.Rect given returns it - * - if "200 300" or "0 10 200 300" string converts it to rect - * - if two or four params given creates rect from them - * - * @memberOf uki.geometry.Rect - * @name creates - * @function - * - * @param {...string|number|uki.geometry.Rect} var_args Rect representation - * - * @returns {uki.geometry.Rect} created size - */ -Rect.create = function(a1, a2, a3, a4) { - if (a1 === undefined) return null; - if (a1.x !== undefined) return a1; - if (/\S+\s+\S+/.test(a1 + '')) return Rect.fromString(a1, a2); - if (a3 === undefined) return new Rect(a1, a2); - return new Rect(a1, a2, a3, a4); -}; - - -/** - * Inset with top, right, bottom and left properties - * - if no params given top = right = bottom = left = 0 - * - if two params given top = bottom and right = left - * - * @param {number=} top - * @param {number=} right - * @param {number=} bottom - * @param {number=} left - * - * @name uki.geometry.Inset - * @constructor - */ -var Inset = uki.geometry.Inset = function(top, right, bottom, left) { - this.top = top*1.0 || 0; - this.right = right*1.0 || 0; - this.bottom = bottom === undefined ? this.top*1.0 : bottom*1.0; - this.left = left === undefined ? this.right*1.0 : left*1.0; -}; - -Inset.prototype = /** @lends uki.geometry.Inset.prototype */ { - - /** - * Converts Inset to "top right bottom left" string - * - * @returns {string} - */ - toString: function() { - return [this.top, this.right, this.bottom, this.left].join(' '); - }, - - /** - * Creates a new Inset with same properties - * - * @this {uki.geometry.Inset} - * @return {uki.geometry.Inset} new Inset - */ - clone: function() { - return new Inset(this.top, this.right, this.bottom, this.left); - }, - - /** - * left + right - * - * @this {uki.geometry.Inset} - * @return {number} - */ - width: function() { - return this.left + this.right; - }, - - /** - * top + bottom - * - * @this {uki.geometry.Inset} - * @return {number} - */ - height: function() { - return this.top + this.bottom; - }, - - /** - * True if any property < 0 - * - * @this {uki.geometry.Inset} - * @return {boolean} - */ - negative: function() { - return this.top < 0 || this.left < 0 || this.right < 0 || this.bottom < 0; - }, - - /** - * True if all properties = 0 - * - * @this {uki.geometry.Inset} - * @return {boolean} - */ - empty: function() { - return !this.top && !this.left && !this.right && !this.bottom; - } -}; - -/** - * Creates Rect from "top right bottom left" or "top right" string - * - * @memberOf uki.geometry.Inset - * @name fromString - * @function - * - * @param {string} string - * @returns {uki.geometry.Inset} - */ -Inset.fromString = function(string) { - var parts = string.split(/\s+/); - if (parts.length < 3) parts[2] = parts[0]; - if (parts.length < 4) parts[3] = parts[1]; - - return new Inset( - parts[0], - parts[1], - parts[2], - parts[3] - ); -}; - -/** - * Creates rect from different representations - * - if no params given returns null - * - if uki.geometry.Inset given returns it - * - if "200 300" or "0 10 200 300" string converts it to inset - * - if two or four params given creates inset from them - * - * @memberOf uki.geometry.Inset - * @name create - * @function - * - * @param {...string|number|uki.geometry.Inset} var_args Rect representation - * - * @returns {uki.geometry.Inset} created inset - */ -Inset.create = function(a1, a2, a3, a4) { - if (a1 === undefined) return null; - if (a1.top !== undefined) return a1; - if (/\S+\s+\S+/.test(a1 + '')) return Inset.fromString(a1, a2); - if (a3 === undefined) return new Inset(a1, a2); - return new Inset(a1, a2, a3, a4); -}; - - - - -/** - * Basic utils to work with the dom tree - * @namespace - * @author voloko - */ -uki.dom = { - /** - * Convenience wrapper around document.createElement - * Creates dom element with given tagName, cssText and innerHTML - * - * @param {string} tagName - * @param {string=} cssText - * @param {string=} innerHTML - * @returns {Element} created element - */ - createElement: function(tagName, cssText, innerHTML) { - var e = doc.createElement(tagName); - if (cssText) e.style.cssText = cssText; - if (innerHTML) e.innerHTML = innerHTML; - e[expando] = uki.guid++; - return e; - }, - - /** - * Adds a probe element to page dom tree, callbacks, removes the element - * - * @param {Element} dom Probing dom element - * @param {function(Element)} callback - */ - probe: function(dom, callback) { - var target = doc.body; - target.appendChild(dom); - var result = callback(dom); - target.removeChild(dom); - return result; - }, - - /** - * Assigns layout style properties to an element - * - * @param {CSSStyleDeclaration} style Target declaration - * @param {object} layout Properties to assign - * @param {object=} prevLayout If given assigns only difference between layout and prevLayout - */ - layout: function(style, layout, prevLayout) { - prevLayout = prevLayout || {}; - if (prevLayout.left != layout.left) style.left = layout.left + PX; - if (prevLayout.top != layout.top) style.top = layout.top + PX; - if (prevLayout.right != layout.right) style.right = layout.right + PX; - if (prevLayout.bottom != layout.bottom) style.bottom = layout.bottom + PX; - if (prevLayout.width != layout.width) style.width = MAX(layout.width, 0) + PX; - if (prevLayout.height != layout.height) style.height = MAX(layout.height, 0) + PX; - return layout; - }, - - /** - * Computed style for a give element - * - * @param {Element} el - * @returns {CSSStyleDeclaration} style declaration - */ - computedStyle: function(el) { - if (doc && doc.defaultView && doc.defaultView.getComputedStyle) { - return doc.defaultView.getComputedStyle( el, null ); - } else if (el.currentStyle) { - return el.currentStyle; - } - }, - - /** - * Checks if parent contains child - * - * @param {Element} parent - * @param {Element} child - * @return {Boolean} - */ - contains: function(parent, child) { - try { - if (parent.contains) return parent.contains(child); - if (parent.compareDocumentPosition) return !!(parent.compareDocumentPosition(child) & 16); - } catch (e) {} - while ( child && child != parent ) { - try { child = child.parentNode } catch(e) { child = null }; - } - return parent == child; - }, - - createStylesheet: function(code) { - var style = doc.createElement('style'); - doc.getElementsByTagName('head')[0].appendChild(style); - if (style.styleSheet) { //IE - style.styleSheet.cssText = code; - } else { - style.appendChild(document.createTextNode(code)); - } - return style; - } - -}; - -uki.each(['createElement'], function(i, name) { - uki[name] = uki.dom[name]; -}); - -uki.dom.special = {}; - -uki.dom.Event = function( domEvent ) { - domEvent = domEvent || {}; - this.domEvent = domEvent.domEvent || domEvent; - - for ( var i = uki.dom.props.length, prop; i; ){ - prop = uki.dom.props[ --i ]; - this[ prop ] = domEvent[ prop ]; - } - - // this.dataTransfer = new uki.dom.DataTransfer(domEvent); -}; - -uki.dom.Event.prototype = new function() { - function returnTrue () { - return true; - } - - this.preventDefault = function() { - var domEvent = this.domEvent; - domEvent.preventDefault && domEvent.preventDefault(); - domEvent.returnValue = false; - - this.isDefaultPrevented = returnTrue; - } - - this.stopPropagation = function() { - var domEvent = this.domEvent; - domEvent.stopPropagation && domEvent.stopPropagation(); - domEvent.cancelBubble = true; - - this.isPropagationStopped = returnTrue; - } - - this.isDefaultPrevented = this.isPropagationStopped = uki.F; -} - -uki.extend(uki.dom, /** @lends uki.dom */ { - bound: {}, - handlers: {}, - - props: "type altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which dragOffset dataTransfer".split(" "), - - events: "blur focus load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error draggesturestart draggestureend draggesture dragstart dragend drag drop dragenter dragleave dragover".split(" "), - - bind: function(el, types, listener) { - if ( el.setInterval && el != window ) - el = window; - - listener.huid = listener.huid || uki.guid++; - - var id = el[expando] = el[expando] || uki.guid++, - handler = uki.dom.handlers[id] = uki.dom.handlers[id] || function() { - uki.dom.handler.apply(arguments.callee.elem, arguments); - }, - i, type; - - handler.elem = el; - - if (!uki.dom.bound[id]) uki.dom.bound[id] = {}; - - types = types.split(' '); - for (i=0; i < types.length; i++) { - type = types[i]; - if (!uki.dom.bound[id][type]) { - uki.dom.bound[id][type] = []; - if ( !uki.dom.special[type] || uki.dom.special[type].setup.call(el) === false ) { - el.addEventListener ? el.addEventListener(type, handler, false) : el.attachEvent('on' + type, handler); - } - } - uki.dom.bound[id][type].push(listener); - }; - listener = handler = el = null; - }, - - unbind: function(el, types, listener) { - var id = el[expando], - huid = listener && listener.huid, - i, type; - if (types) { - types = types.split(' '); - } else { - types = []; - uki.each(uki.dom.bound[id] || [], function(k, v) { types.push(k); }); - } - for (i=0; i < types.length; i++) { - type = types[i]; - if (!id || !uki.dom.bound[id] || !uki.dom.bound[id][type]) continue; - uki.dom.bound[id][type] = listener ? uki.grep(uki.dom.bound[id][type], function(h) { return h.huid !== huid; }) : []; - - if (uki.dom.bound[id][type].length == 0) { - var handler = uki.dom.handlers[id]; - if ( !uki.dom.special[type] || uki.dom.special[type].teardown.call(el) === false ) { - el.removeEventListener ? el.removeEventListener(type, handler, false) : el.detachEvent('on' + type, handler); - } - uki.dom.bound[id][type] = null; - } - } - }, - - /** @ignore */ - handler: function( e ) { - - e = e || root.event; - - var type = e.type, - id = this[expando], - handlers = uki.dom.bound[id], - i; - - if (!e.domEvent) { - e = new uki.dom.Event(e); - e = uki.dom.fix( e ); - } - - if (!id || !handlers || !handlers[type]) return; - - uki.after.start(); - for (i=0, handlers = handlers[type]; i < handlers.length; i++) { - handlers[i].call(this, e); - }; - uki.after.stop(); - }, - - /** - * Taken from jQuery - * @ignore - */ - fix: function( event ) { - // Fix target property, if necessary - if ( !event.target ) - event.target = event.srcElement || doc; - - // check if target is a textnode (safari) - if ( event.target.nodeType == 3 ) - event.target = event.target.parentNode; - - // Add relatedTarget, if necessary - if ( !event.relatedTarget && event.fromElement ) - event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement; - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && event.clientX != null ) { - var de = doc.documentElement, body = doc.body; - event.pageX = event.clientX + (de && de.scrollLeft || body && body.scrollLeft || 0) - (de.clientLeft || 0); - event.pageY = event.clientY + (de && de.scrollTop || body && body.scrollTop || 0) - (de.clientTop || 0); - } - - // Add which for key events - if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) ) - event.which = event.charCode || event.keyCode; - - // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) - if ( !event.metaKey && event.ctrlKey ) - try { event.metaKey = event.ctrlKey; } catch(e){}; - - // Add which for click: 1 == left; 2 == middle; 3 == right - // Note: button is not normalized, so don't use it - if ( !event.which && event.button ) - event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); - - return event; - }, - - preventDefaultHandler: function(e) { - e && e.preventDefault(); - return false; - } -}); - -uki.each({ - mouseover: 'mouseenter', - mouseout: 'mouseleave' -}, function( orig, fix ){ - var handler = function(e) { - if (!uki.dom.contains(this, e.relatedTarget)) { - e.type = fix; - uki.dom.handler.apply(this, arguments); - } - }; - - uki.dom.special[ fix ] = { - setup: function() { - uki.dom.bind( this, orig, handler ); - }, - teardown: function(){ - uki.dom.unbind( this, orig, handler ); - } - }; -}); - - -if (root.attachEvent) { - root.attachEvent('onunload', function() { - uki.each(uki.dom.bound, function(id, types) { - uki.each(types, function(type, handlers) { - try { - uki.dom.handlers[id].elem.detachEvent('on' + type, uki.dom.handlers[id]); - } catch (e) {}; - }); - }); - }); -}; - - - -(function() { -/** - * Drag and Drop support for uki - * @namespace - */ -var dnd = uki.dom.dnd = { - draggable: null, - nativeDnD: false, - position: null -}; - -// detect if native DnD is supported -try { - if ( - // typeof doc.createElement('div').ondragstart == 'object' || // ie support - typeof doc.createEvent('MouseEvent').dataTransfer == 'object' || // safari - doc.createEvent('DragEvent').initDragEvent // w3c support - ) { - // Google Chrome has to many issues with native d&d. It is simpler to disable than to fix - dnd.nativeDnD = !ua.match(/Chrome\/4/); - } -} catch (e) {} - -// bind single drag set of drag events for an element -// regardless of the number of listeners -var bindDraggestures = { - setup: function() { - if (this.__draggesturebound) { - this.__draggesturebound++; - } else { - this.__draggesturebound = 1; - uki.dom.bind( this, 'mousedown', draggesturestart ); - // prevent interference with ie drag events - if (!dnd.nativeDnD && typeof this.ondragstart == 'object') - this.ondragstart = function() { event.returnValue = false; }; - } - }, - teardown: function() { - this.__draggesturebound--; - if (!this.__draggesturebound) uki.dom.unbind( this, 'mousedown', draggesturestart ); - } -}; - -// drag gestures -uki.extend(uki.dom.special, { - draggesturestart: bindDraggestures, - draggestureend: bindDraggestures, - draggesture: bindDraggestures -}); - -var dragEndEvents = 'mouseup ' + (dnd.nativeDnD ? ' dragend' : ''); -// if (window.attachEvent && !window.opera) dragEndEvents += ' mouseleave'; - -function startGesture (el) { - if (dnd.draggable) return; - dnd.draggable = el; - uki.dom.bind(doc, 'mousemove scroll', draggesture); - uki.dom.bind(doc, dragEndEvents, draggestureend); - uki.dom.bind(doc, 'selectstart mousedown', uki.dom.preventDefaultHandler); -} - -function stopGesture () { - dnd.draggable = null; - uki.dom.unbind(doc, 'mousemove scroll', draggesture); - uki.dom.unbind(doc, dragEndEvents, draggestureend); - uki.dom.unbind(doc, 'selectstart mousedown', uki.dom.preventDefaultHandler); -} - -function draggesturestart (e) { - e = new uki.dom.Event(e); - e.type = 'draggesturestart'; - uki.dom.handler.apply(this, arguments); - if (!e.isDefaultPrevented()) { - startGesture(this); - dnd.position = new Point(-e.pageX, -e.pageY); - } -} - -function draggesture (e) { - e = new uki.dom.Event(e); - e.type = 'draggesture'; - e.dragOffset = (new Point(e.pageX, e.pageY)).offset(dnd.position); - uki.dom.handler.apply(dnd.draggable, arguments); - if (e.isDefaultPrevented()) stopGesture(dnd.draggable); -} - -function draggestureend (e) { - e = new uki.dom.Event(e); - e.type = 'draggestureend'; - e.dragOffset = (new Point(e.pageX, e.pageY)).offset(dnd.position); - uki.dom.handler.apply(dnd.draggable, arguments); - stopGesture(dnd.draggable); -} - -})(); - - - -(function() { - - var dnd = uki.dom.dnd, - retriggering = false; - - // common properties - uki.extend(dnd, { - dragDelta: 5, - initNativeDnD: function() { - // moz needs the drag image to be appended to document - // so create an offscreen container to hold drag images. - // note that it can't have overflow:hidden, since drag image will be cutted to container - var container = uki.createElement('div', 'position: absolute;left:-999em;'); - doc.body.appendChild(container); - dnd.dragImageContainer = container; - dnd.initNativeDnD = uki.F; - return true; - }, - dragImageContainer: null, - dataTransfer: null, - target: null, - dragOver: null - }); - - - function viewToDom (element) { - if (uki.isFunction(element.dom)) { - if (element.parent().length) return element.dom(); - var container = uki.createElement('div', 'width:1px;height:1px;position:absolute;left:-999em;top:0'); - doc.body.appendChild(container); - element.attachTo(container); - return container; - } - return element; - } - - var dataTransferProps = ['dropEffect', 'effectAllowed', 'types', 'files']; - - uki.dom.DataTransferWrapper = uki.newClass(new function() { - this.init = function(dataTransfer) { - this.dataTransfer = dataTransfer; - for (var i = dataTransferProps.length - 1; i >= 0; i--){ - this[ dataTransferProps[i] ] = dataTransfer[ dataTransferProps[i] ]; - }; - }; - - this.setData = function(format, data) { - return this.dataTransfer.setData(format, data); - }; - - this.clearData = function(format) { - return this.dataTransfer.clearData(format); - }; - - this.getData = function(format) { - return this.dataTransfer.getData(format); - }; - - this.setDragImage = function(image, x, y) { - dnd.initNativeDnD(); - image = viewToDom(image); - var clone = image.cloneNode(true), - style = clone.style; - style.left = style.right = style.top = style.bottom = ''; - style.position = 'static'; - dnd.dragImageContainer.appendChild(clone); - setTimeout(function() { - dnd.dragImageContainer.removeChild(clone); - }, 1); - return this.dataTransfer.setDragImage(clone, x, y); - }; - }) - - // w3c spec based dataTransfer implementation - uki.dom.DataTransfer = uki.newClass(new function() { - this.init = function() { - uki.extend(this, { - dropEffect: 'none', - effectAllowed: 'none', - types: [], - files: [], - dragImage: new Image(), - imagePosition: new Point(), - data: {} - }); - }; - - this.setData = function(format, data) { - this.data[format] = data; - if (uki.inArray(format, this.types) == -1) this.types.push(format); - }; - - this.clearData = function(format) { - if (format) { - delete this.data[format]; - this.types = uki.grep(this.types, function(x) { return x != format; }); - } else { - this.data = {}; - this.types = []; - } - }; - - this.getData = function(format) { - return this.data[format]; - }; - - this.setDragImage = function(image, x, y) { - this._dragImage = this._initDragImage(image); - this._imagePosition = new Point(x || 0, y || 0); - }; - - this.update = function(e) { - if (!this._dragImage) return; - this._dragImage.style.left = e.pageX - this._imagePosition.x + 'px'; - this._dragImage.style.top = e.pageY - this._imagePosition.y + 'px'; - }; - - this.cleanup = function() { - this._dragImage && this._dragImage.parentNode.removeChild(this._dragImage); - this._dragImage = undefined; - }; - - this._initDragImage = function(image) { - image = viewToDom(image); - var clone = image.cloneNode(true), - style = clone.style; - - style.left = style.right = style.top = style.bottom = ''; - style.position = 'absolute'; - style.left = '-999em'; - style.zIndex = '9999'; - doc.body.appendChild(clone); - return clone; - }; - }); - - - var bindW3CDrag = { - setup: function() { - if (this.__w3cdragbound) { - this.__w3cdragbound++; - } else { - this.__w3cdragbound = 1; - uki.dom.bind( this, 'draggesture', drag ); - } - }, - teardown: function() { - this.__w3cdragbound--; - if (!this.__draggesturebound) uki.dom.unbind( this, 'draggesture', drag ); - } - }; - - if (dnd.nativeDnD) { - uki.extend(uki.dom.special, { - dragstart: { - setup: function() { - this.addEventListener('dragstart', nativeDragWrapper, false); - }, - teardown: function() { - this.removeEventListener('dragstart', nativeDragWrapper, false); - } - } - }) - - } else { - uki.extend(uki.dom.special, { - dragstart: bindW3CDrag, - drag: bindW3CDrag, - dragend: bindW3CDrag - }); - - uki.each({ - dragover: 'mousemove', - drop: 'mouseup' - }, function( source, target ){ - - var handler = function(e) { - if (dnd.dataTransfer && retriggering) { - e = new uki.dom.Event(e); - e.type = source; - e.dataTransfer = dnd.dataTransfer; - if (source == 'dragover') { - dnd.__canDrop = false; - } else { - stopW3Cdrag(this); - if (!dnd.__canDrop) return; - } - uki.dom.handler.apply(this, arguments); - if (e.isDefaultPrevented()) { - dnd.__canDrop = true; - } - } - }; - - uki.dom.special[ source ] = { - setup: function() { - uki.dom.bind( this, target, handler ); - }, - teardown: function(){ - uki.dom.unbind( this, target, handler ); - } - }; - }); - - uki.dom.special.dragenter = { - setup: function() { - uki.dom.bind( this, 'mousemove', dragenter ); - }, - teardown: function(){ - uki.dom.unbind( this, 'mousemove', dragenter ); - } - }; - uki.dom.special.dragleave = { setup: function() {}, teardown: function() {} } - } - - function nativeDragWrapper (e) { - e = new uki.dom.Event(e); - var dataTransfer = e.dataTransfer; - e.dataTransfer = new uki.dom.DataTransferWrapper(dataTransfer); - uki.dom.handler.apply(this, arguments); - dataTransfer.effectAllowed = e.dataTransfer.effectAllowed; - dataTransfer.dropEffect = e.dataTransfer.dropEffect; - } - - function startW3Cdrag (element) { - uki.dom.bind( element, 'draggestureend', dragend ); - } - - function stopW3Cdrag (element) { - if (!dnd.dataTransfer) return; - dnd.dataTransfer.cleanup(); - dnd.dragOver = dnd.dataTransfer = dnd.target = null; - uki.dom.unbind( element, 'draggestureend', dragend ); - } - - function dragenter (e) { - if (!dnd.dataTransfer || e.domEvent.__dragEntered || !retriggering) return; - e = new uki.dom.Event(e); - e.domEvent.__dragEntered = true; - if (dnd.dragOver == this) return; - dnd.dragOver = this; - e.type = 'dragenter'; - uki.dom.handler.apply(this, arguments); - } - - function drag (e) { - if (retriggering) { - if (!e.domEvent.__dragEntered && dnd.dragOver) { - e = new uki.dom.Event(e); - e.type = 'dragleave'; - uki.dom.handler.apply(dnd.dragOver, arguments); - dnd.dragOver = null; - } - return; - }; - - if (dnd.dataTransfer) { // dragging - e.type = 'drag'; - e.target = dnd.target; - } else if (e.dragOffset.x > dnd.dragDelta || e.dragOffset.y > dnd.dragDelta) { // start drag - var target = e.target, - parent = this.parentNode; - try { - while (target && target != parent && !target.getAttribute('draggable')) target = target.parentNode; - } catch (ex) { target = null; } - if (target && target.getAttribute('draggable')) { - dnd.target = e.target = target; - e.type = 'dragstart'; - dnd.dataTransfer = e.dataTransfer = new uki.dom.DataTransfer(e.domEvent.dataTransfer); - startW3Cdrag(this); - } else { - return; - } - } else { - return; - } - e = new uki.dom.Event(e); - uki.dom.handler.apply(this, arguments); - if (e.isDefaultPrevented()) { - stopW3Cdrag(this); - } else { - retriggerMouseEvent(e); - } - - } - - var props = 'detail screenX screenY clientX clientY ctrlKey altKey shiftKey metaKey button'.split(' '); - - function retriggerMouseEvent (e) { - var imageStyle = dnd.dataTransfer._dragImage.style, - type = e.domEvent.type, target; - e.stopPropagation(); - e.preventDefault(); - imageStyle.left = '-999em'; - target = doc.elementFromPoint(e.pageX, e.pageY); - dnd.dataTransfer.update(e); - - try { - var newEvent; - retriggering = true; - try { - if (doc.createEventObject) { - newEvent = doc.createEventObject(); - for ( var i = props.length, prop; i; ){ - prop = uki.dom.props[ --i ]; - newEvent[ prop ] = e.domEvent[ prop ]; - } - target.fireEvent('on' + type, newEvent) - } else { - newEvent = doc.createEvent('MouseEvents'); - newEvent.initMouseEvent( - type, - true, - true, - doc.defaultView, - e.detail, - e.screenX, - e.screenY, - e.clientX, - e.clientY, - e.ctrlKey, - e.altKey, - e.shiftKey, - e.metaKey, - e.button, - null - ); - target.dispatchEvent(newEvent) - } - } catch (e) {} - retriggering = false; - } catch (e) {} - } - - function dragend (e) { - if (retriggering) return; - if (dnd.dataTransfer) { // drag started - e.type = 'dragend'; - e.target = dnd.target; - e.dataTransfer = dnd.dataTransfer; - uki.dom.handler.apply(this, arguments); - retriggerMouseEvent(e); - stopW3Cdrag(this); - } - } -})(); - - -(function() { - var self; - - if ( doc.documentElement["getBoundingClientRect"] ) { - self = uki.dom.offset = function( elem ) { - if ( !elem || elem == root ) return new Point(); - if ( elem === elem.ownerDocument.body ) return self.bodyOffset( elem ); - self.boxModel === undefined && self.initializeBoxModel(); - var box = elem.getBoundingClientRect(), - doc = elem.ownerDocument, - body = doc.body, - docElem = doc.documentElement, - clientTop = docElem.clientTop || body.clientTop || 0, - clientLeft = docElem.clientLeft || body.clientLeft || 0, - top = box.top + (self.pageYOffset || self.boxModel && docElem.scrollTop || body.scrollTop ) - clientTop, - left = box.left + (self.pageXOffset || self.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft; - - return new Point(left, top); - }; - } else { - self = uki.dom.offset = function( elem ) { - if ( !elem || elem == root ) return new Point(); - if ( elem === elem.ownerDocument.body ) return self.bodyOffset( elem ); - self.initialized || self.initialize(); - - var offsetParent = elem.offsetParent, - prevOffsetParent = elem, - doc = elem.ownerDocument, - computedStyle, - docElem = doc.documentElement, - body = doc.body, - defaultView = doc.defaultView, - prevComputedStyle = defaultView.getComputedStyle(elem, null), - top = elem.offsetTop, - left = elem.offsetLeft; - - while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) { - computedStyle = defaultView.getComputedStyle(elem, null); - top -= elem.scrollTop; - left -= elem.scrollLeft; - - if ( elem === offsetParent ) { - top += elem.offsetTop; - left += elem.offsetLeft; - - if ( self.doesNotAddBorder && !(self.doesAddBorderForTableAndCells && (/^t(able|d|h)$/i).test(elem.tagName)) ) { - top += parseInt( computedStyle.borderTopWidth, 10) || 0; - left += parseInt( computedStyle.borderLeftWidth, 10) || 0; - } - prevOffsetParent = offsetParent; - offsetParent = elem.offsetParent; - } - if ( self.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) { - top += parseInt( computedStyle.borderTopWidth, 10) || 0; - left += parseInt( computedStyle.borderLeftWidth, 10) || 0; - } - prevComputedStyle = computedStyle; - } - - if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) { - top += body.offsetTop; - left += body.offsetLeft; - } - - if ( prevComputedStyle.position === "fixed" ) { - top += MAX(docElem.scrollTop, body.scrollTop); - left += MAX(docElem.scrollLeft, body.scrollLeft); - } - - return new Point(left, top); - }; - } - - uki.extend(self, { - initialize: function() { - if ( this.initialized ) return; - var body = doc.body, - container = doc.createElement('div'), - innerDiv, checkDiv, table, td, rules, prop, - bodyMarginTop = body.style.marginTop, - html = '
'; - - rules = { position: 'absolute', top: 0, left: 0, margin: 0, border: 0, width: '1px', height: '1px', visibility: 'hidden' }; - for ( prop in rules ) container.style[prop] = rules[prop]; - - container.innerHTML = html; - body.insertBefore(container, body.firstChild); - innerDiv = container.firstChild; - checkDiv = innerDiv.firstChild; - td = innerDiv.nextSibling.firstChild.firstChild; - - this.doesNotAddBorder = (checkDiv.offsetTop !== 5); - this.doesAddBorderForTableAndCells = (td.offsetTop === 5); - - innerDiv.style.overflow = 'hidden'; - innerDiv.style.position = 'relative'; - this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5); - - body.style.marginTop = '1px'; - this.doesNotIncludeMarginInBodyOffset = (body.offsetTop === 0); - body.style.marginTop = bodyMarginTop; - - body.removeChild(container); - this.boxModel === undefined && this.initializeBoxModel(); - this.initialized = true; - }, - - initializeBoxModel: function() { - if (this.boxModel !== undefined) return; - var div = doc.createElement("div"); - div.style.width = div.style.paddingLeft = "1px"; - - doc.body.appendChild( div ); - this.boxModel = div.offsetWidth === 2; - doc.body.removeChild( div ).style.display = 'none'; - }, - - bodyOffset: function(body) { - self.initialized || self.initialize(); - var top = body.offsetTop, left = body.offsetLeft; - if ( uki.dom.doesNotIncludeMarginInBodyOffset ) { - top += parseInt( uki.dom.elem.currentStyle(body).marginTop, 10 ) || 0; - left += parseInt( uki.dom.elem.currentStyle(body).marginLeft, 10 ) || 0; - } - return new Point(left, top); - } - }); -})(); - - - -uki.browser = new function() { - - var boxShadow; - this.cssBoxShadow = function() { - // Opera 10.5 consistently fails to redraw shadows. Easier to switch off - boxShadow = boxShadow || (root.opera ? 'unsupported' : checkPrefixes('box-shadow')); - return boxShadow; - }; - - var borderRadius; - this.cssBorderRadius = function() { - borderRadius = borderRadius || checkPrefixes('border-radius'); - return borderRadius; - }; - - var userSelect; - this.cssUserSelect = function() { - userSelect = userSelect || checkPrefixes('user-select'); - return userSelect; - }; - - var linearGradient; - this.cssLinearGradient = function() { - linearGradient = linearGradient || initLinearGradient(); - return linearGradient; - }; - - var canvas; - this.canvas = function() { - if (canvas === undefined) canvas = !!uki.createElement('canvas').getContext; - return canvas; - }; - - var filter; - this.cssFilter = function() { - if (filter === undefined) filter = typeof uki.createElement('div').style.filter != 'undefined'; - return filter; - }; - - function swap (obj, src, dst) { - var v = obj[src]; - obj[src] = undefined; - obj[dst] = v; - } - this.css = function(css) { - if (!css) return ''; - if (typeof css == 'string') { - return css.replace(/(^|[^-])(box-shadow|border-radius|user-select)/g, function(value) { - var p; - if ((p = value.indexOf('box-shadow')) > -1) return value.substr(0, p) + uki.browser.cssBoxShadow(); - if ((p = value.indexOf('border-radius')) > -1) return value.substr(0, p) + uki.browser.cssBorderRadius(); - if ((p = value.indexOf('user-select')) > -1) return value.substr(0, p) + uki.browser.cssUserSelect(); - }); - } - - uki.each(['boxShadow', 'borderRadius', 'userSelect'], function(k, v) { - if (css[v]) swap(css, v, uki.camalize( uki.browser[ uki.camalize('css-' + v) ]() ) ); - }); - return css; - }; - - this.textStyles = 'font fontFamily fontWeight fontSize textDecoration textOverflow textAlign textShadow overflow color'.split(' '); - - function checkPrefixes (dashProp) { - var e = uki.createElement('div'), - style = e.style, - prefixes = ['', '-webkit-', '-moz-']; - - for (var i=0; i < prefixes.length; i++) { - if (style[ uki.camalize(prefixes[i] + dashProp) ] !== undefined) return prefixes[i] + dashProp; - }; - return 'unsupported'; - } - - function initLinearGradient () { - var e = uki.createElement( - 'div', - 'background-image:-moz-linear-gradient(right,red,red);'+ - 'background-image:linear-gradient(right,red,red);'+ - 'background-image:-webkit-gradient(linear,0 0,100% 0,from(red),to(red))' - ), - style = e.style, - bgi = style.backgroundImage + ''; - - if (bgi.indexOf('-moz-linear-gradient') > -1) { - return '-moz-linear-gradient'; - } else if (bgi.indexOf('-webkit-gradient') > -1) { - return '-webkit-gradient'; - } else if (bgi.indexOf('linear-gradient') > -1) { - return 'linear-gradient'; - } else { - return 'unsupported'; - } - } -}; - -uki.initNativeLayout = function() { - if (uki.supportNativeLayout === undefined) { - uki.dom.probe( - uki.createElement( - 'div', - 'position:absolute;width:100px;height:100px;left:-999em;', - '
' - ), - function(div) { - uki.supportNativeLayout = div.childNodes[0].offsetWidth == 100 && !root.opera; - } - ); - } -}; - -// uki.supportNativeLayout = false; - - - - - -/** - * Executes callback at or after the end of processing. - * Example: execute flow layout after all child views were added. - * Runs either at the end of event handling or after a timeout. - * Each callback (by huid) is executed once - * @function - * @param {function()} callback - */ -uki.after = (function() { - var after = function(callback) { - callback.huid = callback.huid || uki.guid++; - if (after._bound[callback.huid]) return; - after._bound[callback.huid] = true; - after._queue.push(callback); - if (!after._running) after._startTimer(); - }; - - after._bound = {}; - after._running = false; - after._timer = 0; - after._queue = []; - - after.start = function() { - after._clearTimer(); - after._running++; - }; - - after.stop = function() { - if (--after._running) return; - after._runCallbacks(); - }; - - - - after._runCallbacks = function() { - after._clearTimer(); - var queue = after._queue; - after._queue = []; - after._bound = {}; - for (var i=0; i < queue.length; i++) queue[i](); - }; - - after._startTimer = function() { - if (after._timer) return; - after._timer = setTimeout(after._runCallbacks, 1); - }; - - after._clearTimer = function() { - if (!after._timer) return; - clearTimeout(after._timer); - after._timer = 0; - }; - - return after; -})(); - - - - -/** @namespace */ -uki.view = { - declare: function(/*name, baseClasses, implementation*/) { - var args = uki.toArray(arguments), - name = args.shift(), - klass = uki.newClass.apply(uki, args), - parts = name.split('.'), - obj = root, - i, part, l = parts.length - 1; - - klass.prototype.typeName = function() { return name; }; - - for ( i= 0; i < l; i++ ) { - part = parts[i]; - if (!obj[part]) obj[part] = {}; - obj = obj[part]; - - }; - - obj[ parts[l] ] = klass; - return klass; - } -}; - -/** - * @class - */ -uki.view.Observable = /** @lends uki.view.Observable.prototype */ { - // dom: function() { - // return null; // should implement - // }, - - /** - * @param {String} name Event name - * @param {function()} callback - */ - bind: function(name, callback) { - callback.huid = callback.huid || uki.guid++; - uki.each(name.split(' '), function(i, name) { - if (!this._bound(name)) this._bindToDom(name); - this._observersFor(name).push(callback); - }, this); - return this; - }, - - unbind: function(name, callback) { - if (!this._observers) return; - var names; - if (name) { - names = name.split(' '); - } else { - names = []; - uki.each(this._observers, function(k, v) { names.push(k) }); - } - uki.each(names, function(i, name) { - this._observers[name] = !callback ? [] : uki.grep(this._observersFor(name, true), function(observer) { - return observer != callback && observer.huid != callback.huid; - }); - if (this._observers[name].length == 0) { - this._observers[name] = undefined; - this._unbindFromDom(name); - } - }, this); - return this; - }, - - trigger: function(name/*, data1, data2*/) { - var attrs = Array.prototype.slice.call(arguments, 1); - uki.each(this._observersFor(name, true), function(i, callback) { - callback.apply(this, attrs); - }, this); - return this; - }, - - _unbindFromDom: function(name) { - if (!this._domHander || !this._eventTargets[name]) return; - uki.dom.unbind(this._eventTargets[name], name, this._domHander); - }, - - _bindToDom: function(name, target) { - if (!target && !this.dom) return false; - this._domHander = this._domHander || uki.proxy(function(e) { - e.source = this; - this.trigger(e.type, e); - }, this); - this._eventTargets = this._eventTargets || {}; - this._eventTargets[name] = target || this.dom(); - uki.dom.bind(this._eventTargets[name], name, this._domHander); - return true; - }, - - _bound: function(name) { - return this._observers && this._observers[name]; - }, - - _observersFor: function(name, skipCreate) { - if (skipCreate && (!this._observers || !this._observers[name])) return []; - if (!this._observers) this._observers = {}; - if (!this._observers[name]) this._observers[name] = []; - return this._observers[name]; - } -}; - -(function() { - var self = uki.Attachment = uki.newClass(uki.view.Observable, /** @lends uki.Attachment.prototype */ { - /** - * Attachment serves as a connection between a uki view and a dom container. - * It notifies its view with parentResized on window resize. - * Attachment supports part of uki.view.Base API like #domForChild or #rectForChild - * - * @param {Element} dom Container element - * @param {uki.view.Base} view Attached view - * @param {uki.geometry.Rect} rect Initial size - * - * @see uki.view.Base#parentResized - * @name uki.Attachment - * @augments uki.view.Observable - * @constructor - */ - init: function( dom, view, rect ) { - uki.initNativeLayout(); - - this._dom = dom = dom || root; - this._view = view; - this._rect = Rect.create(rect) || this.rect(); - - uki.dom.offset.initialize(); - - view.parent(this); - this.domForChild().appendChild(view.dom()); - - if (dom != root && dom.tagName != 'BODY') { - var computedStyle = dom.runtimeStyle || dom.ownerDocument.defaultView.getComputedStyle(dom, null); - if (!computedStyle.position || computedStyle.position == 'static') dom.style.position = 'relative'; - } - self.register(this); - - this.layout(); - }, - - /** - * Returns document.body if attached to window. Otherwise returns dom - * uki.view.Base api - * - * @type Element - */ - domForChild: function() { - return this._dom === root ? doc.body : this._dom; - }, - - /** - * uki.view.Base api - * - * @type uki.geometry.Rect - */ - rectForChild: function(child) { - return this.rect(); - }, - - /** - * uki.view.Base api - */ - scroll: function() { - // TODO: support window scrolling - }, - - /** - * uki.view.Base api - */ - scrollTop: function() { - // TODO: support window scrolling - return this._dom.scrollTop || 0; - }, - - /** - * uki.view.Base api - */ - scrollLeft: function() { - // TODO: support window scrolling - return this._dom.scrollLeft || 0; - }, - - /** - * uki.view.Base api - */ - parent: uki.F, - - /** - * uki.view.Base api - */ - childResized: uki.F, - - /** - * On window resize resizes and layout its child view - * @fires event:layout - */ - layout: function() { - var oldRect = this._rect; - - // if (rect.eq(this._rect)) return; - var newRect = this._rect = this.rect(); - this._view.parentResized(oldRect, newRect); - if (this._view._needsLayout) this._view.layout(); - this.trigger('layout', {source: this, rect: newRect}); - }, - - /** - * @return {Element} Container dom - */ - dom: function() { - return this._dom; - }, - - /** - * @return {Element} Child view - */ - view: function() { - return this._view; - }, - - /** - * @private - * @return {uki.geometry.Rect} Size of the container - */ - rect: function() { - var width = this._dom === root || this._dom === doc.body ? - MAX(getRootElement().clientWidth, this._dom.offsetWidth || 0) : - this._dom.offsetWidth, - height = this._dom === root || this._dom === doc.body ? - MAX(getRootElement().clientHeight, this._dom.offsetHeight || 0) : - this._dom.offsetHeight; - - return new Rect(width, height); - } - }); - - function getRootElement() { - return doc.compatMode == "CSS1Compat" && doc.documentElement || doc.body; - } - - self.instances = []; - - /** - * @memberOf uki.Attachment - */ - self.register = function(a) { - if (self.instances.length == 0) { - var timeout = false; - uki.dom.bind(root, 'resize', function() { - if (!timeout) { - timeout = true; - setTimeout(function(i,len) { - uki.after.start(); - - timeout = false; - for (i=0,len=self.instances.length;iBehaves much like result jQuery(dom nodes). - * Most methods are chainable like .attr('text', 'somevalue').bind('click', function() { ... })

- * - *

Its easier to call uki([view1, view2]) or uki('selector') instead of creating collection directly

- * - * @author voloko - * @constructor - * @class - */ -uki.Collection = function( elems ) { - this.length = 0; - Array.prototype.push.apply( this, elems ); -}; - -uki.fn = uki.Collection.prototype = new function() { - var proto = this; - - /**#@+ @memberOf uki.Collection# */ - /** - * Iterates trough all items within itself - * - * @function - * - * @param {function(this:uki.view.Base, number, uki.view.Base)} callback Callback to call for every item - * @returns {uki.view.Collection} self - */ - this.each = function( callback ) { - return uki.each( this, callback ); - }; - - /** - * Creates a new uki.Collection populated with found items - * - * @function - * - * @param {function(uki.view.Base, number):boolean} callback Callback to call for every item - * @returns {uki.view.Collection} created collection - */ - this.grep = function( callback ) { - return new uki.Collection( uki.grep(this, callback) ); - }; - - /** - * Sets an attribute on all views or gets the value of the attribute on the first view - * - * @example - * c.attr('text', 'my text') // sets text to 'my text' on all collection views - * c.attr('name') // gets name attribute on the first view - * - * @function - * - * @param {string} name Name of the attribute - * @param {object=} value Value to set - * @returns {uki.view.Collection|Object} Self or attribute value - */ - this.attr = function( name, value ) { - if (value !== undefined) { - for (var i=this.length-1; i >= 0; i--) { - uki.attr( this[i], name, value ); - }; - return this; - } else { - return this[0] ? uki.attr( this[0], name ) : ""; - } - }; - - /** - * Finds views within collection context - * @example - * c.find('Button') - * - * @function - * - * @param {string} selector - * @returns {uki.view.Collection} Collection of found items - */ - this.find = function( selector ) { - return uki.find( selector, this ); - }; - - /** - * Attaches all child views to dom container - * - * @function - * - * @param {Element} dom Container dom element - * @param {uki.geometry.Rect} rect Default size - * @returns {uki.view.Collection} self - */ - this.attachTo = function( dom, rect ) { - this.each(function() { - new uki.Attachment( dom, this, rect ); - }); - return this; - }; - - /** - * Appends views to the first item in collection - * - * @function - * - * @param {Array.} views Views to append - * @returns {uki.view.Collection} self - */ - this.append = function( views ) { - var target = this[0]; - if (!target) return this; - - views = views.length !== undefined ? views : [views]; - - for (var i = views.length-1; i >= 0; i--) { - target.appendChild(views[i]); - }; - - return this; - }; - - this.appendTo = function( target ) { - target = uki(target)[0]; - this.each(function() { - target.appendChild(this); - }); - return this; - - }; - - /**#@-*/ - - /** - * @function - */ - uki.Collection.addAttrs = function(attrNames) { - uki.each(attrNames, function(i, name) { - proto[name] = function( value ) { return this.attr( name, value ); }; - }); - }; - - /** @function - @name uki.Collection#html */ - /** @function - @name uki.Collection#text */ - /** @function - @name uki.Collection#background */ - /** @function - @name uki.Collection#value */ - /** @function - @name uki.Collection#rect */ - /** @function - @name uki.Collection#checked */ - /** @function - @name uki.Collection#anchors */ - /** @function - @name uki.Collection#childViews */ - /** @function - @name uki.Collection#typeName */ - /** @function - @name uki.Collection#id */ - /** @function - @name uki.Collection#name */ - /** @function - @name uki.Collection#visible */ - /** @function - @name uki.Collection#disabled */ - /** @function - @name uki.Collection#focusable */ - /** @function - @name uki.Collection#style */ - uki.Collection.addAttrs('dom html text background value rect checked anchors childViews typeName id name visible disabled focusable style draggable textSelectable width height minX maxX minY maxY left top x y contentsSize'.split(' ')); - - - /** @function - @name uki.Collection#parent */ - /** @function - @name uki.Collection#next */ - /** @function - @name uki.Collection#prev */ - uki.each([ - ['parent', 'parent'], - ['next', 'nextView'], - ['prev', 'prevView'] - ], function(i, desc) { - proto[ desc[0] ] = function() { - return new uki.Collection( uki.unique( uki.map(this, desc[1]) ) ); - }; - }); - - - /** @function - @name uki.Collection#bind */ - /** @function - @name uki.Collection#unload */ - /** @function - @name uki.Collection#trigger */ - /** @function - @name uki.Collection#layout */ - /** @function - @name uki.Collection#appendChild */ - /** @function - @name uki.Collection#removeChild */ - /** @function - @name uki.Collection#insertBefore */ - /** @function - @name uki.Collection#addRow */ - /** @function - @name uki.Collection#removeRow */ - /** @function - @name uki.Collection#resizeToContents */ - /** @function - @name uki.Collection#toggle */ - uki.each('bind unbind trigger layout appendChild removeChild insertBefore addRow removeRow resizeToContents toggle'.split(' '), function(i, name) { - proto[name] = function() { - for (var i=this.length-1; i >=0; i--) { - this[i][name].apply(this[i], arguments); - }; - return this; - }; - }); - - /** @function - @name uki.Collection#blur */ - /** @function - @name uki.Collection#focus */ - /** @function - @name uki.Collection#load */ - /** @function - @name uki.Collection#resize */ - /** @function - @name uki.Collection#scroll */ - /** @function - @name uki.Collection#unload */ - /** @function - @name uki.Collection#click */ - /** @function - @name uki.Collection#dblclick */ - /** @function - @name uki.Collection#mousedown */ - /** @function - @name uki.Collection#mouseup */ - /** @function - @name uki.Collection#mousemove */ - /** @function - @name uki.Collection#mouseover */ - /** @function - @name uki.Collection#mouseout */ - /** @function - @name uki.Collection#mouseenter */ - /** @function - @name uki.Collection#mouseleave */ - /** @function - @name uki.Collection#change */ - /** @function - @name uki.Collection#select */ - /** @function - @name uki.Collection#submit */ - /** @function - @name uki.Collection#keydown */ - /** @function - @name uki.Collection#keypress */ - /** @function - @name uki.Collection#keyup */ - /** @function - @name uki.Collection#error */ - uki.each( uki.dom.events, function(i, name){ - proto[name] = function( handler ){ - if (handler) { - this.bind(name, handler); - } else { - for (var i=this.length-1; i >=0; i--) { - this[i][name] ? this[i][name]() : this[i].trigger(name); - }; - } - return this; - }; - }); -}; - - - - -(function() { - - /** - * Creates uki view tree from JSON-like markup - * - * @example - * uki.build( {view: 'Button', rect: '100 100 100 24', text: 'Hello world' } ) - * // Creates uki.view.Button with '100 100 100 24' passed to constructor, - * // and calls text('Hello world') on it - * - * @function - * @name uki.build - * - * @param {object} ml JSON-like markup - * @returns {uki.view.Collection} collection of created elements - */ - uki.build = function(ml) { - - return new uki.Collection( createMulti( (ml.length === undefined) ? [ml] : ml ) ); - - }; - - uki.viewNamespaces = ['uki.view.', '']; - - function createMulti (ml) { - return uki.map(ml, function(mlRow) { return createSingle(mlRow); }); - } - - function createSingle (mlRow) { - if (uki.isFunction(mlRow.typeName)) { - return mlRow; - } - - var c = mlRow.view || mlRow.type, - result; - if (uki.isFunction(c)) { - result = new c(mlRow.rect); - } else if (typeof c === 'string') { - for (var i=0, ns = uki.viewNamespaces, ns$length = ns.length; i < ns$length; i++) { - var parts = (ns[i] + c).split('.'), - obj = root; - - for (var j=0, parts$length = parts.length; obj && j < parts$length; j++) { - obj = obj[parts[j]]; - }; - if (obj) { - result = new obj(mlRow.rect); - break; - } - }; - if (!obj) throw 'No view of type ' + c + ' found'; - } else { - result = c; - } - - copyAttrs(result, mlRow); - return result; - } - - function copyAttrs(comp, mlRow) { - uki.each(mlRow, function(name, value) { - if (name == 'view' || name == 'type' || name == 'rect') return; - uki.attr(comp, name, value); - }); - return comp; - } - - uki.build.copyAttrs = copyAttrs; -})(); - - - - -/* Ideas and code parts borrowed from Sizzle (http://sizzlejs.com/) */ -(function() { - /**#@+ @ignore */ - var self, - attr = uki.attr, - chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g, - regexps = [ // enforce order - { name: 'ID', regexp: /#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/ }, - { name: 'ATTR', regexp: /\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/ }, - { name: 'TYPE', regexp: /^((?:[\w\u00c0-\uFFFF\*_\.-]|\\.)+)/ }, - { name: 'POS', regexp: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/ } - ], - posRegexp = regexps.POS, - posFilters = { - first: function(i){ - return i === 0; - }, - last: function(i, match, array){ - return i === array.length - 1; - }, - even: function(i){ - return i % 2 === 0; - }, - odd: function(i){ - return i % 2 === 1; - }, - lt: function(i, match){ - return i < match[2] - 0; - }, - gt: function(i, match){ - return i > match[2] - 0; - }, - nth: function(i, match){ - return match[2] - 0 == i; - }, - eq: function(i, match){ - return match[2] - 0 == i; - } - }, - reducers = { - TYPE: function(comp, match) { - var expected = match[1]; - if (expected == '*') return true; - var typeName = attr(comp, 'typeName'); - return typeName && typeName.length >= expected.length && - ('.' + typeName).indexOf('.' + expected) == (typeName.length - expected.length); - }, - - ATTR: function(comp, match) { - var result = attr(comp, match[1]), - value = result + '', - type = match[2], - check = match[4]; - - return result == null ? type === "!=" : - type === "=" ? value === check : - type === "*=" ? value.indexOf(check) >= 0 : - type === "~=" ? (" " + value + " ").indexOf(check) >= 0 : - !check ? value && result !== false : - type === "!=" ? value != check : - type === "^=" ? value.indexOf(check) === 0 : - type === "$=" ? value.substr(value.length - check.length) === check : - false; - }, - - ID: function(comp, match) { - return reducers.ATTR(comp, ['', 'id', '=', '', match[1]]); - }, - - POS: function(comp, match, i, array) { - var filter = posFilters[match[1]]; - return filter ? filter( i, match, array ) : false; - } - }, - mappers = { - "+": function(context){ - return uki.unique( uki.map(context, 'nextView') ); - }, - - ">": function(context){ - return uki.unique( flatten(uki.map(context, 'childViews')) ); - }, - - "": function(context) { - return uki.unique( recChildren(flatten(uki.map(context, 'childViews'))) ); - }, - - "~": function(context){ - return uki.unique( flatten( uki.map(context, nextViews) ) ); - } - }; - - function nextViews (view) { - return view.parent().childViews().slice((view._viewIndex || 0) + 1); - } - - function recChildren (comps) { - return flatten(uki.map(comps, function(comp) { - return [comp].concat( recChildren(attr(comp, 'childViews')) ); - })); - } - - function flatten (array) { - return uki.reduce( [], array, reduceFlatten ); - } - - function reduceFlatten (x, e) { - return x.concat(e); - } - /**#@-*/ - - self = - /** - * @namespace - */ - uki.Selector = { - /** - * Finds views by CSS3 selectors in view tree. - *

Can be called as uki(selector) instead of uki.Selector.find(selector)

- * - * @example - * uki('Label') find all labels on page - * uki('Box[name=main] > Label') find all immediate descendant Labels in a box with name = "main" - * uki('> Slider', context) find all direct descendant Sliders within given context - * uki('Slider,Checkbox') find all Sliders and Checkboxes - * uki('Slider:eq(3)') find 3-d slider - * - * @param {string} selector - * @param {Array.} context to search in - * - * @return {uki.Collection} found views - */ - find: function(selector, context, skipFiltering) { - context = context || uki.top(); - if (context.length === undefined) context = [context]; - - var tokens = self.tokenize(selector), - expr = tokens[0], - extra = tokens[1], - result = context, - mapper; - - while (expr.length > 0) { - mapper = mappers[expr[0]] ? mappers[expr.shift()] : mappers['']; - result = mapper(result); - if (expr.length == 0) break; - result = self.reduce(expr.shift(), result); - } - - if (extra) { - result = result.concat(self.find(extra, context, true)); - } - - return skipFiltering ? result : new uki.Collection(uki.unique(result)); - }, - - /** @ignore */ - reduce: function(exprItem, context) { - if (!context || !context.length) return []; - - var match, found; - - while (exprItem != '') { - found = false; - uki.each(regexps, function(index, row) { - - /*jsl:ignore*/ - if (match = exprItem.match(row.regexp)) { - /*jsl:end*/ - found = true; - context = uki.grep(context, function(comp, index) { - return reducers[row.name](comp, match, index, context); - }); - exprItem = exprItem.replace(row.regexp, ''); - return false; - } - }); - if (!found) break; - } - return context; - }, - - /** @ignore */ - tokenize: function(expr) { - var parts = [], match, extra; - - chunker.lastIndex = 0; - - while ( (match = chunker.exec(expr)) !== null ) { - parts.push( match[1] ); - - if ( match[2] ) { - extra = RegExp.rightContext; - break; - } - } - - return [parts, extra]; - } - }; - - uki.find = self.find; -})(); - - - - -/** - * Creates image element from url - * - * @param {string} url Image url - * @param {string=} dataUrl Data url representation of image, used if supported - * @param {string=} alphaUrl Gif image url for IE6 - * - * @namespace - * @function - * - * @returns {Element} - */ -uki.image = function(url, dataUrl, alphaUrl) { - var result = new Image(); - result.src = uki.imageSrc(url, dataUrl, alphaUrl); - return result; -}; -/** - * Selects image src depending on browser - * - * @param {string} url Image url - * @param {string=} dataUrl Data url representation of image, used if supported - * @param {string=} alphaUrl Gif image url for IE6 - * - * @returns {string} - */ -uki.imageSrc = function(url, dataUrl, alphaUrl) { - if (uki.image.dataUrlSupported && dataUrl) return dataUrl; - if (alphaUrl && uki.image.needAlphaFix) return alphaUrl; - return url; -}; - -/** - * Image html representation: '' - * - * @param {string} url Image url - * @param {string=} dataUrl Data url representation of image, used if supported - * @param {boolean=} alphaUrl Gif image url for IE6 - * @param {string=} html Additional html - * - * @returns {string} html - */ -uki.imageHTML = function(url, dataUrl, alphaUrl, html) { - if (uki.image.needAlphaFix && alphaUrl) { - url = alphaUrl; - } else if (uki.image.dataUrlSupported) { - url = dataUrl; - } - return ''; -}; - - -/** - * @type boolean - */ -uki.image.dataUrlSupported = doc.createElement('canvas').toDataURL || (/MSIE (8)/).test(ua); - -/** - * @type boolean - */ -uki.image.needAlphaFix = /MSIE 6/.test(ua); -if(uki.image.needAlphaFix) try { doc.execCommand("BackgroundImageCache", false, true); } catch(e){} - - - - -(function() { - var nullRegexp = /^\s*null\s*$/, - themeRegexp = /theme\s*\(\s*(.*\s*)\)/, - rowsRegexp = /rows\s*\(\s*(.*\s*)\)/, - cssBoxRegexp = /cssBox\s*\(\s*(.*\s*)\)/; - - /** - * Transforms a bg string into a background object - *

Supported strings:
- * theme(bg-name) Takes background with bg-name from uki.theme
- * rows(30, #CCFFFF, #FFCCFF, #FFFFCC) Creates Rows background with 30px rowHeight and 3 colors
- * cssBox(border:1px solid red;background:blue) Creates CssBox background with given cssText
- * url(i.png) or #FFFFFF Creates Css background with single property

- * - * @param {String} bg - * @name uki.background - * @namespace - * @returns {uki.background.Base} created background - */ - var self = uki.background = function(bg) { - if (typeof(bg) === 'string') { - var match; - /*jsl:ignore*/ - if ( match = bg.match(nullRegexp) ) return new self.Null(); - - if ( match = bg.match(themeRegexp) ) return uki.theme.background( match[1] ); - if ( match = bg.match(rowsRegexp) ) return new self.Rows( match[1].split(',')[0], match[1].split(/\s*,\s*/).slice(1) ); - if ( match = bg.match(cssBoxRegexp) ) return new self.CssBox( match[1] ); - /*jsl:end*/ - return new self.Css(bg); - } - return bg; - }; -})(); - - - -/** - * @class - */ -uki.background.Base = uki.background.Null = uki.newClass({ - init: uki.F, - attachTo: uki.F, - detach: uki.F -}); - - - -/** - * Adds a div with 9 sliced images in the corners, sides and center - * - * @class - */ -uki.background.Sliced9 = uki.newClass(new function() { - var nativeCss = ['MozBorderImage', 'WebkitBorderImage', 'borderImage'], - dom = uki.dom; - - var LEFT = 'left:', - TOP = 'top:', - RIGHT = 'right:', - BOTTOM = 'bottom:', - WIDTH = 'width:', - HEIGHT = 'height:', - PX = 'px', - P100 = '100%'; - - var cache = {}; - - /**#@+ @memberOf uki.background.Sliced9.prototype */ - - this.init = function(partSettings, inset, options) { - this._settings = uki.extend({}, partSettings); - this._inset = Inset.create(inset); - this._size = null; - this._inited = false; - - options = options || {}; - this._fixedSize = Size.create(options.fixedSize) || new Size(); - this._bgInset = Inset.create(options.inset) || new Inset(); - this._zIndex = options.zIndex || -1; - - this._container = this._getContainer(); - this._container.style.zIndex = this._zIndex; - }; - - /** @ignore */ - function makeDiv (name, style, setting, imgStyle, bgSettings) { - var inner = setting[3] ? img(setting, imgStyle) : ''; - if (!setting[3]) style += bgStyle(setting, bgSettings); - return '
' + inner + '
'; - } - - /** @ignore */ - function bgStyle (setting, bgSettings) { - return ';background: url(' + uki.imageSrc(setting[0], setting[1], setting[2]) + ') ' + bgSettings; - } - - /** @ignore */ - function img (setting, style) { - return uki.imageHTML(setting[0], setting[1], setting[2], ' ondragstart="return false;" galleryimg="no" style="-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;position:absolute;' + style + '"'); - } - - /** @ignore */ - this._getContainer = function() { - var key = this._getKey(); - if (!cache[key]) { - return cache[key] = this._createContainer(); - } - return cache[key].cloneNode(true); - }; - - /** @ignore */ - this._createContainer = function() { - var inset = this._inset, - bgInset = this._bgInset, - settings = this._settings, - width = inset.left + inset.right, - height = inset.top + inset.bottom, - css = [LEFT + bgInset.left + PX, RIGHT + bgInset.right + PX, TOP + bgInset.top + PX, BOTTOM + bgInset.bottom + PX].join(';'), - html = []; - - if (inset.top && inset.left) { - html[html.length] = makeDiv('tl', - [LEFT + 0, TOP + 0, WIDTH + inset.left + PX, HEIGHT + inset.top + PX].join(';'), - settings.c, [LEFT + 0, TOP + 0, WIDTH + width + PX, HEIGHT + height + PX].join(';'), 'top left' - ); - } - if (inset.top) { - html[html.length] = makeDiv('t', - [LEFT + inset.left + PX, TOP + 0, HEIGHT + inset.top + PX, RIGHT + inset.right + PX].join(';'), - settings.h, [LEFT + 0, TOP + 0, WIDTH + P100, HEIGHT + height + PX].join(';'), 'repeat-x top' - ); - } - if (inset.top && inset.right) { - html[html.length] = makeDiv('tr', - [RIGHT + 0, TOP + 0, WIDTH + inset.right + PX, HEIGHT + inset.top + PX].join(';'), - settings.c, [LEFT + '-' + inset.left + PX, TOP + 0, WIDTH + width + PX, HEIGHT + height + PX].join(';'), 'top right' - ); - } - - if (inset.left) { - html[html.length] = makeDiv('l', - [LEFT + 0, TOP + inset.top + PX, WIDTH + inset.left + PX, BOTTOM + inset.bottom + PX].join(';'), - settings.v, [LEFT + 0, TOP + 0, HEIGHT + P100, WIDTH + width + PX].join(';'), 'repeat-y left' - ); - } - if (settings.m) { - html[html.length] = makeDiv('m', - [LEFT + inset.left + PX, TOP + inset.top + PX, RIGHT + inset.right + PX, BOTTOM + inset.bottom + PX].join(';'), - settings.m, [LEFT + 0, TOP + 0, HEIGHT + P100, WIDTH + P100].join(';'), '' - ); - } - if (inset.right) { - html[html.length] = makeDiv('r', - [RIGHT + 0, TOP + inset.top + PX, WIDTH + inset.right + PX, BOTTOM + inset.bottom + PX].join(';'), - settings.v, [LEFT + '-' + inset.left + PX, TOP + 0, HEIGHT + P100, WIDTH + width + PX].join(';'), 'repeat-y right' - ); - } - - if (inset.bottom && inset.left) { - html[html.length] = makeDiv('bl', - [LEFT + 0, BOTTOM + 0, WIDTH + inset.left + PX, HEIGHT + inset.bottom + PX].join(';'), - settings.c, [LEFT + 0, TOP + '-' + inset.top + PX, WIDTH + width + PX, HEIGHT + height + PX].join(';'), 'left -' + inset.top + PX - ); - } - if (inset.bottom) { - html[html.length] = makeDiv('b', - [LEFT + inset.left + PX, BOTTOM + 0, HEIGHT + inset.bottom + PX, RIGHT + inset.right + PX].join(';'), - settings.h, [LEFT + 0, TOP + '-' + inset.top + PX, WIDTH + P100, HEIGHT + height + PX].join(';'), 'repeat-x 0 -' + inset.top + PX - ); - } - if (inset.bottom && inset.right) { - html[html.length] = makeDiv('br', - [RIGHT + 0, BOTTOM + 0, WIDTH + inset.right + PX, HEIGHT + inset.bottom + PX].join(';'), - settings.c, [LEFT + '-' + inset.left + PX, TOP + '-' + inset.top + PX, WIDTH + width + PX, HEIGHT + height + PX].join(';'), 'right -' + inset.top + PX - ); - } - var container = uki.createElement('div', 'position:absolute;overflow:hidden;' + css, html.join('')); - container.className = 'uki-background-Sliced9'; - return container; - }; - - /** @ignore */ - this._getKey = function() { - return uki.map(['v', 'h', 'm', 'c'], function(x) { - return this._settings[x] && this._settings[x][0] || ''; - }, this).concat([this._inset, this._bgInset, this._fixedSize]).join(','); - }; - - this.attachTo = function(comp) { - this._comp = comp; - - this._container.style.visibility = 'visible'; - this._comp.dom().insertBefore(this._container, this._comp.dom().firstChild); - // this._comp.dom().appendChild(this._container); - - if (!uki.supportNativeLayout) { - this._layoutHandler = this._layoutHandler || uki.proxy(function(e) { - if (this._size && this._size.eq(e.rect)) return; - this._size = e.rect; - this.layout(); - }, this); - this._comp.bind('layout', this._layoutHandler); - this.layout(); - } - }; - - this.detach = function() { - if (this._comp) { - // this._comp.dom().removeChild(this._container); - this._container.style.visibility = 'hidden'; - if (!uki.supportNativeLayout) this._comp.unbind('layout', this._layoutHandler); - this._size = this._comp = null; - this._attached = this._inited = false; - } - }; - - this.layout = function(e) { - var size = this._comp.rect(), - parts = this._parts, - inset = this._inset, - bgInset = this._bgInset, - fixedSize = this._fixedSize, - width = FLOOR(fixedSize.width || size.width - bgInset.left - bgInset.right), - height = FLOOR(fixedSize.height || size.height - bgInset.top - bgInset.bottom), - insetWidth = inset.left + inset.right, - insetHeight = inset.top + inset.bottom; - - if (!parts) { - parts = {}; - uki.each(this._container.childNodes, function() { - if (this.className) parts[this.className] = this; - }); - this._parts = parts; - } - // parts.b.style.bottom = '' - // parts.b.style.top = '100%'; - // parts.b.style.marginTop = - inset.bottom + 'px'; - if (parts.t) dom.layout(parts.t.style, { width: width - insetWidth }); - if (parts.b) dom.layout(parts.b.style, { width: width - insetWidth }); - if (parts.l) dom.layout(parts.l.style, { height: height - insetHeight }); - if (parts.r) dom.layout(parts.r.style, { height: height - insetHeight }); - if (parts.m) dom.layout(parts.m.style, { - height: height - insetHeight, - width: width - insetWidth - }); - dom.layout(this._container.style, { - width: width, - height: height - }); - }; - - /**#@-*/ -}); - - - -/** - * Writes css properties to targets dom() - * - * @class - */ -uki.background.Css = uki.newClass(new function() { - - /**#@+ @memberOf uki.background.Css.prototype */ - this.init = function(options) { - this._options = typeof options == 'string' ? {background: options} : options; - this._options = uki.browser.css(this._options); - }; - - this.attachTo = function(comp) { - this._comp = comp; - this._originalValues = {}; - - uki.each(this._options, function(name, value) { - // this._originalValues[name] = dom.style[name]; - // dom.style[name] = value; - this._originalValues[name] = comp.style(name); - comp.style(name, value); - }, this); - }; - - this.detach = function() { - if (this._comp) { - uki.each(this._options, function(name, value) { - this._comp.style(name, this._originalValues[name]); - }, this); - } - - }; - /**#@-*/ -}); - - - -/** - * Adds a div with given cssText to dom() - * - * @class - */ -uki.background.CssBox = uki.newClass(new function() { - - var cache = {}; - /** @ignore */ - function getInsets(options) { - if (!cache[options]) { - uki.dom.probe( - uki.createElement('div', options + ';position:absolute;overflow:hidden;left:-999em;width:10px;height:10px;'), - function(c) { - cache[options] = new Inset( - c.offsetHeight - 10, - c.offsetWidth - 10 - ); - } - ); - } - return cache[options]; - } - - /**#@+ @memberOf uki.background.CssBox.prototype */ - - this.init = function(options, ext) { - this._options = options; - ext = ext || {}; - this._inset = inset = Inset.create(ext.inset) || new Inset(); - this._insetWidth = getInsets(options).left + inset.left + inset.right; - this._insetHeight = getInsets(options).top + inset.top + inset.bottom; - - this._container = uki.createElement( - 'div', - 'position:absolute;overflow:hidden;z-index:' + (ext.zIndex || '-1') + ';' + - 'left:' + inset.left + 'px;top:' + inset.top + 'px;right:' + inset.right + 'px;bottom:' + inset.bottom + 'px;' + - uki.browser.css(options), - ext.innerHTML - ); - this._container.className = 'uki-background-CssBox'; - this._attached = false; - }; - - this.attachTo = function(comp) { - this._comp = comp; - this._comp.dom().insertBefore(this._container, this._comp.dom().firstChild); - - if (uki.supportNativeLayout) return; - - this._layoutHandler = this._layoutHandler || uki.proxy(function(e) { this.layout(e.rect); }, this); - this._comp.bind('layout', this._layoutHandler); - this.layout(this._comp.rect()); - }; - - this.layout = function(size) { - this._prevLayout = uki.dom.layout(this._container.style, { - width: size.width - this._insetWidth, - height: size.height - this._insetHeight - }, this._prevLayout); - }; - - this.detach = function() { - if (this._comp) { - this._comp.dom().removeChild(this._container); - if (!uki.supportNativeLayout) this._comp.unbind('layout', this._layoutHandler); - this._attached = false; - } - }; - - /**#@-*/ -}); - - -/** - * Adds a div with given cssText to dom() - * - * @class - */ -uki.background.LinearGradient = uki.newClass(uki.background.CssBox, new function() { - - var CANVAS_GRADIENT_SIZE = 200; - - /** - * @param options Object { startColor: '#FFFFFF', endColor: '#CCCCCC', horizontal: true, css: 'border: 1px solid #CCC' } - */ - this.init = function(options) { - this._options = options; - var inset = this._inset = uki.geometry.Inset.create(this._options.inset) || new uki.geometry.Inset(); - - this._container = this._createContainer(); - var clone = this._container.cloneNode(true); - clone.style.cssText += ';width:100px;height:100px;'; - uki.dom.probe(clone, uki.proxy(function(c) { - this._insetWidth = c.offsetWidth - 100 + inset.width(); - this._insetHeight = c.offsetHeight - 100 + inset.height(); - }, this)); - this._container.style.cssText += ';left:' + inset.left + 'px;top:' + inset.top + 'px;right:' + inset.right + 'px;bottom:' + inset.bottom + 'px;'; - - this._attached = false; - }; - - var urlCache = {}; - function getGradientURL (startColor, endColor, horizontal, stops) { - var key = startColor + endColor + (horizontal ? 1 : 0) + uki.map(stops, function(stop) { return stop.pos + '-' + stop.color; }); - if (!urlCache[key]) { - - var canvas = document.createElement('canvas'); - canvas.width = canvas.height = CANVAS_GRADIENT_SIZE; - - var context = canvas.getContext('2d'), - gradient = context.createLinearGradient(0, 0, horizontal ? CANVAS_GRADIENT_SIZE : 0, horizontal ? 0 : CANVAS_GRADIENT_SIZE); - - gradient.addColorStop(0, startColor); - gradient.addColorStop(1, endColor); - for (var i=0; i < stops.length; i++) { - gradient.addColorStop(stops[i].pos, stops[i].color); - }; - context.fillStyle = gradient; - context.fillRect(0, 0, CANVAS_GRADIENT_SIZE, CANVAS_GRADIENT_SIZE); - urlCache[key] = canvas.toDataURL && canvas.toDataURL(); - } - return urlCache[key]; - } - - function mosFilter (horizontal, startColor, endColor) { - return 'filter:progid:DXImageTransform.Microsoft.gradient(gradientType=' + (horizontal ? '1' : '0') + ', startColorstr=#FF' + startColor.substr(1) + ', endColorstr=#FF' + endColor.substr(1) + ');'; - } - - - this._createContainer = function() { - var startColor = this._options.startColor || '#FFFFFF', - endColor = this._options.endColor || '#CCCCCC', - horizontal = this._options.horizontal, - stops = this._options.stops || [], - css = '', - i = 0, - cssProp = uki.browser.cssLinearGradient(), - url; - - if (cssProp == '-moz-linear-gradient' || cssProp == 'linear-gradient') { - css += 'background-image:' + cssProp + '(' + (horizontal ? 'left' : 'top') + ', ' + startColor; - for (;i 0) { - stops.unshift({ pos: 0, color: startColor }); - stops.push({ pos: 1, color: endColor }); - var child; - for (;i'].join(''); - }; - for (i=0; i < packSize; i++) { - html[i] = rows[i%l]; - }; - cache[key] = html.join(''); - } - return cache[key]; - } -}); - - -/** - * @class - */ -uki.background.Multi = uki.newClass({ - init: function() { - this._bgs = Array.prototype.slice.call(arguments, 0); - }, - attachTo: function(comp) { - for (var i=0, $this$_bgs$length = this._bgs.length; i < $this$_bgs$length; i++) { - this._bgs[i].attachTo(comp); - }; - }, - detach: function() { - for (var i=0, $this$_bgs$length = this._bgs.length; i < $this$_bgs$length; i++) { - this._bgs[i].detach(); - }; - } -}); - - -/** - * @namespace - */ -(function() { -var self = uki.theme = { - themes: [], - - register: function(theme, /* internal */ themes) { - (themes = self.themes)[ themes.length] = theme; - }, - - background: function(name, params) { - return self._namedResource(name, 'background', params) || new uki.background.Null(); - }, - - image: function(name, params) { - return self._namedResource(name, 'image', params) || new Image(); - }, - - imageSrc: function(name, params) { - return self._namedResource(name, 'imageSrc', params) || ''; - }, - - style: function(name, params) { - return self._namedResource(name, 'style', params) || ''; - }, - - dom: function(name, params) { - return self._namedResource(name, 'dom', params) || uki.createElement('div'); - }, - - template: function(name, params) { - return self._namedResource(name, 'template', params) || ''; - }, - - _namedResource: function(name, type, params, i, result) { - for ( i = self.themes.length - 1 ; i >= 0; i--) { - if (result = (self.themes[i] [type](name, params))) - return result; - }; - return null; - } -}; -})(); - - - -/** - * @class - */ -uki.theme.Base = { - images: [], - imageSrcs: [], - backgrounds: [], - doms: [], - styles: [], - templates: [], - - background: function(name, params) { - return this.backgrounds[name] && this.backgrounds[name](params); - }, - - image: function(name, params) { - if (this.images[name]) return this.images[name](params); - return this.imageSrcs[name] && uki.image.apply(uki, this.imageSrcs[name](params)); - }, - - imageSrc: function(name, params) { - if (this.imageSrcs[name]) return uki.imageSrc.apply(uki, this.imageSrcs[name](params)); - return this.images[name] && this.images[name](params).src; - }, - - dom: function(name, params) { - return this.doms[name] && this.doms[name](params); - }, - - style: function(name, params) { - return this.styles[name] && this.styles[name](params); - }, - - template: function(name, params) { - return this.templates[name] && this.templates[name](params); - } -}; - - -/** - * Simple and fast (2x-15x faster than regexp) html template - * @example - * var t = new uki.theme.Template('

${value}

') - * t.render({className: 'myClass', value: 'some html'}) - */ -uki.theme.Template = function(code) { - var parts = code.split('${'), i, l, tmp; - this.parts = [parts[0]]; - this.names = []; - for (i=1, l = parts.length; i < l; i++) { - tmp = parts[i].split('}'); - this.names.push(tmp.shift()); - this.parts.push(''); - this.parts.push(tmp.join('}')); - }; -}; - -uki.theme.Template.prototype.render = function(values) { - for (var i=0, names = this.names, l = names.length; i < l; i++) { - this.parts[i*2+1] = values[names[i]] || ''; - }; - return this.parts.join(''); -}; - - -/** - * @namespace - */ -uki.view.utils = new function() { - this.visibleRect = function (from, upTo) { - var queue = [], - rect, i, tmpRect, c = from; - - do { - queue[queue.length] = c; - c = c.parent(); - } while (c && c != upTo); - - if (upTo && upTo != from) queue[queue.length] = upTo; - - for (i = queue.length - 1; i >= 0; i--){ - c = queue[i]; - tmpRect = visibleRect(c); - rect = rect ? rect.intersection(tmpRect) : tmpRect; - rect.x -= c.rect().x; - rect.y -= c.rect().y; - - }; - return rect; - }; - - this.top = function(c) { - while (c.parent()) c = c.parent(); - return c; - }; - - this.offset = function(c, upTo) { - var offset = new Point(), - rect; - - while (c && c != upTo) { - rect = c.rect(); - offset.x += rect.x; - offset.y += rect.y; - if (c.scrollTop) { - offset.x -= c.scrollLeft(); - offset.y -= c.scrollTop(); - } - c = c.parent(); - } - return offset; - }; - - this.scrollableParent = function(c) { - do { - if (uki.isFunction(c.scrollTop)) return c; - c = c.parent(); - } while (c); - return null; - }; - - /** @inner */ - function visibleRect (c) { - return c.visibleRect ? c.visibleRect() : c.rect().clone(); - } - /**#@-*/ -}; - -uki.extend(uki.view, uki.view.utils); - - -/** - * @class - */ -uki.view.Styleable = new function() { - /** @scope uki.view.Styleable.prototype */ - - /** - * @name style - * @memberOf uki.view.Styleable# - * @function - */ - this.style = function(name, value) { - if (typeof name == 'string') return this._style(name, value); - - uki.each(name, function(name, value) { - this._style(name, value); - }, this); - return this; - }; - - this._style = function(name, value) { - if (value === undefined) return this._dom.style[name]; - this._dom.style[name] = value; - return this; - }; - - // TODO: is this really needed? - // uki.each('fontSize,textAlign,color,fontFamily,fontWeight,lineHeight,zIndex'.split(','), function(i, name) { - // proto[name] = function(value) { - // return this._style(name, value); - // }; - // }); - - /** - * Sets whether text of the view can be selected. - * - * @memberOf uki.view.Styleable# - * @name textSelectable - * @function - * @param {boolean=} state - * @returns {boolean|uki.view.Base} current textSelectable state of self - */ - this.textSelectable = uki.newProp('_textSelectable', function(state) { - this._textSelectable = state; - if (uki.browser.cssUserSelect() != 'unsupported') { - this._dom.style[uki.camalize(uki.browser.cssUserSelect())] = (state ? '' : uki.browser.cssUserSelect() == '-moz-user-select' ? '-moz-none' : 'none'); - } else { - uki.dom[state ? 'unbind' : 'bind'](this.dom(), 'selectstart', uki.dom.preventDefaultHandler); - } - this._dom.style.cursor = state ? '' : 'default'; - }); - - this.draggable = function(state) { - if (state === undefined) return this._dom.getAttribute('draggable'); - this._dom.setAttribute('draggable', true); - this._dom.style.WebkitUserDrag = 'element'; - return this; - }; - - /**#@-*/ -}; - - - - -/** - * @interface - */ -uki.view.Focusable = new function() {/** @lends uki.view.Focusable.prototype */ - - // dom: function() { - // return null; // should implement - // }, - this._focusable = true; // default value - this._focusOnClick = true; - - this.focusOnClick = uki.newProp('_focusOnClick'); - - this.focusable = uki.newProp('_focusable', function(v) { - this._focusable = v; - if (v) this._initFocusable(); - this._updateFocusable(); - }), - - this.disabled = uki.newProp('_disabled', function(d) { - var changed = d !== !!this._disabled; - this._disabled = d; - if (d) this.blur(); - this._updateFocusable(); - if (changed && this._updateBg) this._updateBg(); - }), - - this._updateFocusable = function() { - if (this._preCreatedFocusTarget || !this._focusTarget) return; - - if (this._focusable && !this._disabled) { - this._focusTarget.style.display = 'block'; - } else { - this._focusTarget.style.display = 'none'; - } - }, - - this._initFocusable = function(preCreatedFocusTarget) { - if ((!preCreatedFocusTarget && !this._focusable) || this._focusTarget) return; - this._focusTarget = preCreatedFocusTarget; - this._preCreatedFocusTarget = preCreatedFocusTarget; - - if (!preCreatedFocusTarget) { - this._focusTarget = uki.createElement('input', 'position:absolute;left:-9999px;top:0;width:1px;height:1px;'); - this._focusTarget.className = 'uki-view-Focusable'; - this.dom().appendChild(this._focusTarget); - } - this._hasFocus = false; - this._firstFocus = true; - - uki.dom.bind(this._focusTarget, 'focus', uki.proxy(function(e) { - this._stopWatingForBlur(); - if (!this._hasFocus) this._focus(e); - }, this)); - - uki.dom.bind(this._focusTarget, 'blur', uki.proxy(function(e) { - if (this._hasFocus) { - this._hasFocus = false; - this._waitingForBlur = - setTimeout(uki.proxy(function() { // wait for mousedown refocusing - this._waitingForBlur = false; - if (!this._hasFocus) this._blur(); - }, this), 1); - } - }, this)); - - if (!preCreatedFocusTarget) this.bind('mousedown', function(e) { - if (this._focusOnClick) this.focus(); - }); - this._updateFocusable(); - } - - this._focus = function(e) { - this._hasFocus = true; - this._firstFocus = false; - } - - this._blur = function(e) { - this._hasFocus = false; - } - - this._stopWatingForBlur = function() { - if (this._waitingForBlur) { - clearTimeout(this._waitingForBlur); - this._waitingForBlur = false; - this._hasFocus = true; - } - }; - - this.focus = function() { - if (this._focusable && !this._disabled) { - this._stopWatingForBlur(); - if (!this._hasFocus) this._focus(); - var target = this._focusTarget; - setTimeout(function() { - try { - target.focus(); - } catch(e) { } - target = null; - }, 1); - } - return this; - }, - - this.blur = function() { - try { - this._focusTarget.blur(); - } catch(e) {} - return this; - } - - this.hasFocus = function() { - return this._hasFocus; - } - - this._bindToDom = function(name) { - if (!this._focusTarget || 'keyup keydown keypress focus blur'.indexOf(name) == -1) return false; - - return uki.view.Observable._bindToDom.call(this, name, this._focusTarget); - } - - -}; - - - - - - - - -var ANCHOR_TOP = 1, - ANCHOR_RIGHT = 2, - ANCHOR_BOTTOM = 4, - ANCHOR_LEFT = 8, - ANCHOR_WIDTH = 16, - ANCHOR_HEIGHT = 32; - -uki.view.declare('uki.view.Base', uki.view.Observable, uki.view.Styleable, function(Observable, Styleable) { - - var layoutId = 1; - - this.defaultCss = 'position:absolute;z-index:100;-moz-user-focus:none;'; - - /** - * Base class for all uki views. - * - *

View creates and layouts dom nodes. uki.view.Base defines basic API for other views. - * It also defines common layout algorithms.

- * - * Layout - * - *

View layout is defined by rectangle and anchors. - * Rectangle is passed to constructor, anchors are set through the #anchors attribute.

- * - *

Rectangle defines initial position and size. Anchors specify how view will move and - * resize when its parent is resized.

- * - * 2 phases of layout - * - *

Layout process has 2 phases. - * First views rectangles are recalculated. This may happen several times before dom - * is touched. This is done either explicitly through #rect attribute or through - * #parentResized callbacks. - * After rectangles are set #layout is called. This actually updates dom styles.

- * - * @example - * uki({ view: 'Base', rect: '10 20 100 50', anchors: 'left top right' }) - * // Creates Base view with initial x = 10px, y = 20px, width = 100px, height = 50px. - * // When parent resizes x, y and height will stay the same. Width will resize with parent. - * - * - * @see uki.view.Base#anchors - * @constructor - * @augments uki.view.Observable - * @augments uki.view.Styleable - * - * @name uki.view.Base - * @implements uki.view.Observable - * @param {uki.geometry.Rect} rect initial position and size - */ - this.init = function(rect) { - this._parentRect = this._rect = Rect.create(rect); - this._setup(); - uki.initNativeLayout(); - this._createDom(); - }; - - /**#@+ @memberOf uki.view.Base# */ - - /** @private */ - this._setup = function() { - uki.extend(this, { - _anchors: 0, - _parent: null, - _visible: true, - _needsLayout: true, - _textSelectable: false, - _styleH: 'left', - _styleV: 'top', - _firstLayout: true - }); - this.defaultCss += uki.theme.style('base'); - }; - - /** - * Get views container dom node. - * @returns {Element} dom - */ - this.dom = function() { - return this._dom; - }; - - /* ------------------------------- Common settings --------------------------------*/ - /** - * Used for fast (on hash lookup) view searches: uki('#view_id'); - * - * @param {string=} id New id value - * @returns {string|uki.view.Base} current id or self - */ - this.id = function(id) { - if (id === undefined) return this._dom.id; - if (this._dom.id) uki.unregisterId(this); - this._dom.id = id; - uki.registerId(this); - return this; - }; - - /** - * Accessor for dom().className - * @param {string=} className - * - * @returns {string|uki.view.Base} className or self - */ - uki.delegateProp(this, 'className', '_dom'); - - /** - * Accessor for view visibility. - * - * @param {boolean=} state - * @returns {boolean|uki.view.Base} current visibility state of self - */ - this.visible = function(state) { - if (state === undefined) return this._dom.style.display != 'none'; - - this._dom.style.display = state ? 'block' : 'none'; - return this; - }; - - /** - * Accessor for background attribute. - * @param {string|uki.background.Base=} background - * @returns {uki.background.Base|uki.view.Base} current background or self - */ - this.background = function(val) { - if (val === undefined && !this._background && this.defaultBackground) this._background = this.defaultBackground(); - if (val === undefined) return this._background; - val = uki.background(val); - - if (val == this._background) return this; - if (this._background) this._background.detach(this); - val.attachTo(this); - - this._background = val; - return this; - }; - - /** - * Accessor for default background attribute. - * @name defaultBackground - * @function - * @returns {uki.background.Base} default background if not overridden through attribute - */ - this.defaultBackground = function() { - return this._defaultBackground && uki.background(this._defaultBackground); - }; - - /* ----------------------------- Container api ------------------------------*/ - - /** - * Accessor attribute for parent view. When parent is set view appends its #dom - * to parents #domForChild - * - * @param {?uki.view.Base=} parent - * @returns {uki.view.Base} parent or self - */ - this.parent = function(parent) { - if (parent === undefined) return this._parent; - - // if (this._parent) this._dom.parentNode.removeChild(this._dom); - this._parent = parent; - // if (this._parent) this._parent.domForChild(this).appendChild(this._dom); - return this; - }; - - /** - * Accessor for childViews. @see uki.view.Container for implementation - * @returns {Array.} - */ - this.childViews = function() { - return []; - }; - - /** - * Reader for previous view - * @returns {uki.view.Base} - */ - this.prevView = function() { - if (!this.parent()) return null; - return this.parent().childViews()[this._viewIndex - 1] || null; - }; - - /** - * Reader for next view - * @returns {uki.view.Base} - */ - this.nextView = function() { - if (!this.parent()) return null; - return this.parent().childViews()[this._viewIndex + 1] || null; - }; - - - /* ----------------------------- Layout ------------------------------*/ - - /** - * Sets or retrieves view's position and size. - * - * @param {string|uki.geometry.Rect} newRect - * @returns {uki.view.Base} self - */ - this.rect = function(newRect) { - if (newRect === undefined) return this._rect; - - newRect = Rect.create(newRect); - this._parentRect = newRect; - this._rect = this._normalizeRect(newRect); - this._needsLayout = this._needsLayout || layoutId++; - return this; - }; - - /** - * Set or get sides which the view should be attached to. - * When a view is attached to a side the distance between this side and views border - * will remain constant on resize. Anchor can be any combination of - * "top", "right", "bottom", "left", "width" and "height". - * If you set both "right" and "left" than "width" is assumed. - * - * Anchors are stored as a bit mask. Though its easier to set them using strings - * - * @function - * @param {string|number} anchors - * @returns {number|uki.view.Base} anchors or self - */ - this.anchors = uki.newProp('_anchors', function(anchors) { - if (anchors.indexOf) { - var tmp = 0; - if (anchors.indexOf('right' ) > -1) tmp |= ANCHOR_RIGHT; - if (anchors.indexOf('bottom' ) > -1) tmp |= ANCHOR_BOTTOM; - if (anchors.indexOf('top' ) > -1) tmp |= ANCHOR_TOP; - if (anchors.indexOf('left' ) > -1) tmp |= ANCHOR_LEFT; - if (anchors.indexOf('width' ) > -1 || (tmp & ANCHOR_LEFT && tmp & ANCHOR_RIGHT)) tmp |= ANCHOR_WIDTH; - if (anchors.indexOf('height' ) > -1 || (tmp & ANCHOR_BOTTOM && tmp & ANCHOR_TOP)) tmp |= ANCHOR_HEIGHT; - anchors = tmp; - } - this._anchors = anchors; - this._styleH = anchors & ANCHOR_LEFT ? 'left' : 'right'; - this._styleV = anchors & ANCHOR_TOP ? 'top' : 'bottom'; - }); - - /** - * Returns rectangle for child layout. Usually equals to #rect. Though in some cases, - * client rectangle my differ from #rect. Example uki.view.ScrollPane. - * - * @param {uki.view.Base} child - * @returns {uki.geometry.Rect} - */ - this.rectForChild = function(child) { - return this.rect(); - }; - - /** - * Updates dom to match #rect property. - * - * Layout is designed to minimize dom writes. If view is anchored to the right then - * style.right is used, style.left for left anchor, etc. If browser supports this - * both style.right and style.left are used. Otherwise style.width will be updated - * manually on each resize. - * - * @fires event:layout - * @see uki.dom.initNativeLayout - */ - this.layout = function() { - this._layoutDom(this._rect); - this._needsLayout = false; - this.trigger('layout', {rect: this._rect, source: this}); - this._firstLayout = false; - }; - - this.layoutIfNeeded = function() { - if (this._needsLayout && this.visible()) this.layout(); - }; - - - /** - * @function uki.view.Base#minSize - * @function uki.view.Base#maxSize - */ - uki.each(['min', 'max'], function(i, name) { - var attr = name + 'Size', - prop = '_' + attr; - this[attr] = function(s) { - if (s === undefined) return this[prop] || new Size(); - this[prop] = Size.create(s); - this.rect(this._parentRect); - this._dom.style[name + 'Width'] = this[prop].width ? this[prop].width + PX : ''; - this._dom.style[name + 'Height'] = this[prop].height ? this[prop].height + PX : ''; - return this; - }; - }, this); - - /** - * Resizes view when parent changes size according to anchors. - * Called from parent view. Usually after parent's #rect is called. - * - * @param {uki.geometry.Rect} oldSize - * @param {uki.geometry.Rect} newSize - */ - this.parentResized = function(oldSize, newSize) { - var newRect = this._parentRect.clone(), - dX = (newSize.width - oldSize.width) / - ((this._anchors & ANCHOR_LEFT ^ ANCHOR_LEFT ? 1 : 0) + // flexible left - (this._anchors & ANCHOR_WIDTH ? 1 : 0) + - (this._anchors & ANCHOR_RIGHT ^ ANCHOR_RIGHT ? 1 : 0)), // flexible right - dY = (newSize.height - oldSize.height) / - ((this._anchors & ANCHOR_TOP ^ ANCHOR_TOP ? 1 : 0) + // flexible top - (this._anchors & ANCHOR_HEIGHT ? 1 : 0) + - (this._anchors & ANCHOR_BOTTOM ^ ANCHOR_BOTTOM ? 1 : 0)); // flexible right - - if (this._anchors & ANCHOR_LEFT ^ ANCHOR_LEFT) newRect.x += dX; - if (this._anchors & ANCHOR_WIDTH) newRect.width += dX; - - if (this._anchors & ANCHOR_TOP ^ ANCHOR_TOP) newRect.y += dY; - if (this._anchors & ANCHOR_HEIGHT) newRect.height += dY; - this.rect(newRect); - }; - - /** - * Called when child changes it's size - */ - this.childResized = function(child) { - // do nothing, extend in subviews - }; - - /** - * Resizes view to its contents. Contents size is determined by view. - * View can be resized by width, height or both. This is specified through - * autosizeStr param. - * View will grow shrink according to its #anchors. - * - * @param {autosizeStr} autosize - * @returns {uki.view.Base} self - */ - this.resizeToContents = function(autosizeStr) { - var autosize = decodeAutosize(autosizeStr); - if (0 == autosize) return this; - - var oldRect = this.rect(), - newRect = this._calcRectOnContentResize(autosize); - // if (newRect.eq(oldRect)) return this; - // this.rect(newRect); - this._rect = this._parentRect = newRect; - this._needsLayout = true; - return this; - }; - - /** - * Calculates view's contents size. Redefined in subclasses. - * - * @param {number} autosize Bitmask - * @returns {uki.geometry.Rect} - */ - this.contentsSize = function(autosize) { - return this.rect(); - }; - - /** @private */ - this._normalizeRect = function(rect) { - if (this._minSize) { - rect = new Rect(rect.x, rect.y, MAX(this._minSize.width, rect.width), MAX(this._minSize.height, rect.height)); - } - if (this._maxSize) { - rect = new Rect(rect.x, rect.y, MIN(this._maxSize.width, rect.width), MIN(this._maxSize.height, rect.height)); - } - return rect; - }; - - - - /** @ignore */ - function decodeAutosize (autosizeStr) { - if (!autosizeStr) return 0; - var autosize = 0; - if (autosizeStr.indexOf('width' ) > -1) autosize = autosize | ANCHOR_WIDTH; - if (autosizeStr.indexOf('height') > -1) autosize = autosize | ANCHOR_HEIGHT; - return autosize; - } - - - /** @private */ - this._initBackgrounds = function() { - if (this.background()) this.background().attachTo(this); - }; - - /** @private */ - this._calcRectOnContentResize = function(autosize) { - var newSize = this.contentsSize( autosize ), - oldSize = this.rect(); - - if (newSize.eq(oldSize)) return oldSize; // nothing changed - - // calculate where to resize - var newRect = this.rect().clone(), - dX = newSize.width - oldSize.width, - dY = newSize.height - oldSize.height; - - if (autosize & ANCHOR_WIDTH) { - if (this._anchors & ANCHOR_LEFT ^ ANCHOR_LEFT && this._anchors & ANCHOR_RIGHT ^ ANCHOR_RIGHT) { - newRect.x -= dX/2; - } else if (this._anchors & ANCHOR_LEFT ^ ANCHOR_LEFT) { - newRect.x -= dX; - } - newRect.width += dX; - } - - if (autosize & ANCHOR_HEIGHT) { - if (this._anchors & ANCHOR_TOP ^ ANCHOR_TOP && this._anchors & ANCHOR_BOTTOM ^ ANCHOR_BOTTOM) { - newRect.y -= dY/2; - } else if (this._anchors & ANCHOR_TOP ^ ANCHOR_TOP) { - newRect.y -= dY; - } - newRect.height += dY; - } - - return newRect; - }; - - /** @function - @name uki.view.Base#width */ - /** @function - @name uki.view.Base#height */ - /** @function - @name uki.view.Base#minX */ - /** @function - @name uki.view.Base#maxX */ - /** @function - @name uki.view.Base#minY */ - /** @function - @name uki.view.Base#maxY */ - /** @function - @name uki.view.Base#left */ - /** @function - @name uki.view.Base#top */ - uki.each(['width', 'height', 'minX', 'maxX', 'minY', 'maxY', 'x', 'y', 'left', 'top'], function(index, attr) { - this[attr] = function(value) { - if (value === undefined) return uki.attr(this.rect(), attr); - uki.attr(this.rect(), attr, value); - return this; - }; - }, this); - - /* ---------------------------------- Dom --------------------------------*/ - /** - * Called through a second layout pass when _dom should be created - * @private - */ - this._createDom = function() { - this._dom = uki.createElement('div', this.defaultCss); - this._initClassName(); - }; - - this._initClassName = function() { - this._dom.className = this.typeName().replace(/\./g, '-'); - }; - - /** - * Called through a second layout pass when _dom is already created - * @private - */ - this._layoutDom = function(rect) { - var l = {}, s = uki.supportNativeLayout, relativeRect = this.parent().rectForChild(this); - if (s && this._anchors & ANCHOR_LEFT && this._anchors & ANCHOR_RIGHT) { - l.left = rect.x; - l.right = relativeRect.width - rect.x - rect.width; - } else { - l.width = rect.width; - l[this._styleH] = this._styleH == 'left' ? rect.x : relativeRect.width - rect.x - rect.width; - } - - if (s && this._anchors & ANCHOR_TOP && this._anchors & ANCHOR_BOTTOM) { - l.top = rect.y; - l.bottom = relativeRect.height - rect.y - rect.height; - } else { - l.height = rect.height; - l[this._styleV] = this._styleV == 'top' ? rect.y : relativeRect.height - rect.y - rect.height; - } - this._lastLayout = uki.dom.layout(this._dom.style, l, this._lastLayout); - if (this._firstLayout) this._initBackgrounds(); - return true; - }; - - /** @private */ - this._bindToDom = function(name) { - if ('resize layout'.indexOf(name) > -1) return true; - return uki.view.Observable._bindToDom.call(this, name); - }; - - /**#@-*/ -}); - - - -/** - * @class - * @augments uki.view.Base - * @name uki.view.Container - */ -uki.view.declare('uki.view.Container', uki.view.Base, function(Base) { - /**#@+ @memberOf uki.view.Container# */ - - this._inset = new Inset(); - - /** @private */ - this._setup = function() { - this._childViews = []; - Base._setup.call(this); - }; - - /** @ignore */ - function maxProp (c, prop) { - var val = 0, i, l; - for (i = c._childViews.length - 1; i >= 0; i--){ - if (!c._childViews[i].visible()) continue; - val = MAX(val, c._childViews[i].rect()[prop]()); - }; - return val; - } - - this.contentsWidth = function() { - return maxProp(this, 'maxX') + this.inset().right; - }; - - this.contentsHeight = function() { - return maxProp(this, 'maxY') + this.inset().bottom; - }; - - this.contentsSize = function() { - return new Size(this.contentsWidth(), this.contentsHeight()); - }; - - /** - * Sets or retrieves view child view. - * @param anything uki.build can parse - * - * Note: if setting on view with child views, all child view will be removed - */ - this.childViews = function(val) { - if (val === undefined) return this._childViews; - uki.each(this._childViews, function(i, child) { - this.removeChild(child); - }, this); - uki.each(uki.build(val), function(tmp, child) { - this.appendChild(child); - }, this); - return this; - }; - - /** - * Remove particular child - */ - this.removeChild = function(child) { - child.parent(null); - this.domForChild(child).removeChild(child.dom()); - var index = child._viewIndex, - i, l; - for (i=index+1, l = this._childViews.length; i < l; i++) { - this._childViews[i]._viewIndex--; - }; - this._childViews = uki.grep(this._childViews, function(elem) { return elem != child; }); - this._contentChanged(); - }; - - /** - * Adds a child. - */ - this.appendChild = function(child) { - child._viewIndex = this._childViews.length; - this._childViews.push(child); - child.parent(this); - this.domForChild(child).appendChild(child.dom()); - this._contentChanged(); - }; - - /** - * Insert child before target beforeChild - * @param {uki.view.Base} child Child to insert - * @param {uki.view.Base} beforeChild Existent child before which we should insert - */ - this.insertBefore = function(child, beforeChild) { - var i, l; - child._viewIndex = beforeChild._viewIndex; - for (i=beforeChild._viewIndex, l = this._childViews.length; i < l; i++) { - this._childViews[i]._viewIndex++; - }; - this._childViews.splice(beforeChild._viewIndex-1, 0, child); - child.parent(this); - this.domForChild(child).insertBefore(child.dom(), beforeChild.dom()); - this._contentChanged(); - }; - - /** - * Should return a dom node for a child. - * Child should append itself to this dom node - */ - this.domForChild = function(child) { - return this._dom; - }; - - this.inset = uki.newProp('_inset', function(v) { - this._inset = Inset.create(v); - }); - - /** @private */ - this._contentChanged = function() { - // called on every insertBefore, appendChild, removeChild - }; - - this._layoutDom = function(rect) { - Base._layoutDom.call(this, rect); - this._layoutChildViews(rect); - }; - - /** @private */ - this._layoutChildViews = function() { - for (var i=0, childViews = this.childViews(); i < childViews.length; i++) { - childViews[i].layoutIfNeeded(); - }; - }; - - /** - * @fires event:resize - */ - this.rect = function(newRect) { - if (newRect === undefined) return this._rect; - - newRect = Rect.create(newRect); - this._parentRect = newRect; - var oldRect = this._rect; - if (!this._resizeSelf(newRect)) return this; - this._needsLayout = true; - - if (oldRect.width != newRect.width || oldRect.height != newRect.height) this._resizeChildViews(oldRect); - this.trigger('resize', {oldRect: oldRect, newRect: this._rect, source: this}); - return this; - }; - - /** @private */ - this._resizeSelf = function(newRect) { - // if (newRect.eq(this._rect)) return false; - this._rect = this._normalizeRect(newRect); - return true; - }; - - /** - * Called to notify all interested parties: childViews and observers - * @private - */ - this._resizeChildViews = function(oldRect) { - for (var i=0, childViews = this.childViews(); i < childViews.length; i++) { - childViews[i].parentResized(oldRect, this._rect); - }; - }; - - /**#@-*/ -}); -/** - * Basic container view - * - * - * @author voloko - * @name uki.view.Box - * @class - * @extends uki.view.Container - */ -uki.view.declare('uki.view.Box', uki.view.Container, {}); - -/** - * Image - * - * @author voloko - * @name uki.view.Image - * @class - * @extends uki.view.Base - */ -uki.view.declare('uki.view.Image', uki.view.Base, function() { - this.typeName = function() { return 'uki.view.Image'; }; - - /** - * @function - * @name uki.view.Image#src - */ - uki.delegateProp(this, 'src', '_dom'); - - this._createDom = function() { - this._dom = uki.createElement('img', this.defaultCss); - this._initClassName(); - }; -}); - - - -/** - * Label View - * Contains any html - * - * @author voloko - * @name uki.view.Label - * @class - * @extends uki.view.Base - */ -uki.view.declare('uki.view.Label', uki.view.Base, function(Base) { - - this._setup = function() { - Base._setup.call(this); - uki.extend(this, { - _scrollable: false, - _textSelectable: false, - _inset: new Inset() - }); - this.defaultCss += uki.theme.style('label'); - }; - - this._style = function(name, value) { - if (value !== undefined && uki.inArray(name, uki.browser.textStyles) != -1) { - this._label.style[name] = value; - } - return Base._style.call(this, name, value); - }; - - this.adaptToContents = uki.newProp('_adaptToContents'); - - this.textSelectable = function(state) { - if (state !== undefined && !this._textSelectProp) { - this._label.unselectable = state ? '' : 'on'; - } - return Base.textSelectable.call(this, state); - }; - - /** - * Warning! this operation is expensive - */ - this.contentsSize = function(autosize) { - var clone = this._createLabelClone(autosize), inset = this.inset(), size; - - uki.dom.probe(clone, function() { - size = new Size(clone.offsetWidth + inset.width(), clone.offsetHeight + inset.height()); - }); - return size; - }; - - /** - * Read/write escaped html contents - * @function - * @name uki.view.Label#text - */ - this.text = function(text) { - return text === undefined ? this.html() : this.html(uki.escapeHTML(text)); - }; - - /** - * Read/write html contents - * @function - * @name uki.view.Label#html - */ - this.html = function(html) { - if (html === undefined) return this._label.innerHTML; - this._label.innerHTML = html; - return this; - }; - - /** - * Insets between text and view borders - * @function - * @name uki.view.Label#inset - */ - this.inset = uki.newProp('_inset', function(inset) { - this._inset = Inset.create(inset); - }); - - /** - * Whether label have inline scrollbars on not - * @function - * @name uki.view.Label#scrollable - */ - this.scrollable = uki.newProp('_scrollable', function(state) { - this._scrollable = state; - this._label.style.overflow = state ? 'auto' : 'hidden'; - }); - - /** - * Whether can have multiline lines or not - * @function - * @name uki.view.Label#multiline - */ - this.multiline = uki.newProp('_multiline', function(state) { - this._multiline = state; - this._label.style.whiteSpace = state ? '' : 'nowrap'; - }); - - this._createLabelClone = function(autosize) { - var clone = this._label.cloneNode(true), - inset = this.inset(), rect = this.rect(); - - if (autosize & ANCHOR_WIDTH) { - clone.style.width = clone.style.right = ''; - } else if (uki.supportNativeLayout) { - clone.style.right = ''; - clone.style.width = rect.width - inset.width() + 'px'; - } - if (autosize & ANCHOR_HEIGHT) { - clone.style.height = clone.style.bottom = ''; - } else if (uki.supportNativeLayout) { - clone.style.bottom = ''; - clone.style.height = rect.height - inset.height() + 'px'; - } - clone.style.paddingTop = 0; - clone.style.visibility = 'hidden'; - return clone; - }; - - this._createDom = function() { - Base._createDom.call(this); - this._label = uki.createElement('div', this.defaultCss + 'white-space:nowrap;'); // text-shadow:0 1px 0px rgba(255,255,255,0.8); - this._dom.appendChild(this._label); - this.textSelectable(this.textSelectable()); - }; - - this._layoutDom = function() { - var inset = this._inset, - l, - a = this._anchors, - watchField = '', watchValue; - - if (uki.supportNativeLayout) { - l = { - left: inset.left, - top: inset.top, - right: inset.right, - bottom: inset.bottom - }; - } else { - l = { - left: inset.left, - top: inset.top, - width: this._rect.width - inset.width(), - height: this._rect.height - inset.height() - }; - } - - if (!(a & ANCHOR_BOTTOM)) { - l.height = l.bottom = undefined; - watchField = 'offsetHeight'; - } else if (!(a & ANCHOR_TOP)) { - l.height = l.bottom = undefined; - watchField = 'offsetHeight'; - } else if (!(a & ANCHOR_RIGHT)) { - l.right = l.width = undefined; - watchField = 'offsetWidth'; - } else if (!(a & ANCHOR_LEFT)) { - l.left = l.width = undefined; - watchField = 'offsetWidth'; - } - - Base._layoutDom.apply(this, arguments); - - if (!this.multiline()) { - var fz = parseInt(this.style('fontSize'), 10) || 12; - this._label.style.lineHeight = (this._rect.height - inset.top - inset.bottom) + 'px'; - // this._label.style.paddingTop = MAX(0, this._rect.height/2 - fz/2) + 'px'; - } - this._lastLabelLayout = uki.dom.layout(this._label.style, l, this._lastLabelLayout); - - if (this.adaptToContents() && watchField) { - watchValue = this._label[watchField]; - if (watchValue != this._lastWatchValue && this.parent()) { - this.resizeToContents(watchField == 'offsetWidth' ? 'width' : 'height'); - this.parent().childResized(this); - } - this._lastWatchValue = watchValue; - } - }; - -}); - - -/** - * Button view - * - * - * @author voloko - * @name uki.view.Button - * @class - * @extends uki.view.Label - * @implements uki.view.Focusable - */ -uki.view.declare('uki.view.Button', uki.view.Label, uki.view.Focusable, function(Base, Focusable) { - /** @lends uki.view.Button.prototype */ - - this._backgroundPrefix = 'button-'; - - this._setup = function() { - Base._setup.call(this); - uki.extend(this, { - _inset: new Inset(0, 4) - }); - this.defaultCss += "cursor:default;-moz-user-select:none;-webkit-user-select:none;" + uki.theme.style('button'); - }; - - /** - * @function - * @name uki.view.Button#backgroundPrefix - */ - uki.addProps(this, ['backgroundPrefix']); - - /** - * @function - * @name uki.view.Button#"normal-background" - */ - /** - * @function - * @name uki.view.Button#"hover-background" - */ - /** - * @function - * @name uki.view.Button#"down-background" - */ - /** - * @function - * @name uki.view.Button#"focus-background" - */ - /** - * @function - * @name uki.view.Button#"disabled-background" - */ - uki.each(['normal', 'hover', 'down', 'focus', 'disabled'], function(i, name) { - var property = name + '-background'; - this[property] = function(bg) { - if (bg) this['_' + property] = bg; - return this['_' + property] = this['_' + property] || - uki.theme.background(this._backgroundPrefix + name, {height: this.rect().height, view: this}); - }; - }, this); - - this._createLabelClone = function(autosize) { - var clone = Base._createLabelClone.call(this, autosize); - // clone.style.fontWeight = this.style('fontWeight'); - return clone; - }; - - this._layoutDom = function(rect) { - Base._layoutDom.call(this, rect); - if (this._firstLayout) { - this['hover-background'](); - this['down-background'](); - - this._backgroundByName(this._backgroundName || 'normal'); - } - }; - - this._updateBg = function() { - var name = this._disabled ? 'disabled' : this._down ? 'down' : this._over ? 'hover' : 'normal'; - this._backgroundByName(name); - }; - - this._createDom = function() { - // dom - this._dom = uki.createElement('div', this.defaultCss); - this._initClassName(); - this._label = uki.createElement('div', this.defaultCss); // text-shadow:0 1px 0px rgba(255,255,255,0.8); - this._dom.appendChild(this._label); - - this._dom.appendChild(uki.createElement('div', 'left:0;top:0;width:100%;height:100%;position:absolute;background:url(' + uki.theme.imageSrc('x') + ');')); - - this.textSelectable(this.textSelectable()); - this._initFocusable(); - - uki.dom.bind(document, 'mouseup', uki.proxy(this._mouseup, this)); - this.bind('mousedown', this._mousedown); - this.bind('mouseenter', this._mouseenter); - this.bind('mouseleave', this._mouseleave); - this.bind('keyup', this._keyup); - this.bind('keydown', this._keydown); - }; - - this._mouseup = function(e) { - if (!this._down) return; - this._down = false; - this._updateBg(); - }; - - this._mousedown = function(e) { - this._down = true; - this._updateBg(); - }; - - this._mouseenter = function(e) { - this._over = true; - this._updateBg(); - }; - - this._mouseleave = function(e) { - this._over = false; - this._updateBg(); - }; - - this._focus = function(e) { - this['focus-background']().attachTo(this); - Focusable._focus.call(this, e); - }; - - this._keydown = function(e) { - if ((e.which == 32 || e.which == 13) && !this._down) this._mousedown(); - }; - - this._keyup = function(e) { - if ((e.which == 32 || e.which == 13) && this._down) { - this._mouseup(); - this.trigger('click', {domEvent: e, source: this}); - } - if (e.which == 27 && this._down) { - this._mouseup(); - } - }; - - this._blur = function(e) { - this['focus-background']().detach(); - Focusable._blur.call(this, e); - }; - - this._backgroundByName = function(name) { - var bg = this[name + '-background'](); - if (this._background == bg) return; - if (this._background) this._background.detach(); - bg.attachTo(this); - this._background = bg; - this._backgroundName = name; - }; - - this._bindToDom = function(name) { - return uki.view.Focusable._bindToDom.call(this, name) || uki.view.Label.prototype._bindToDom.call(this, name); - }; -}); -/** - * Checkbox - * - * @author voloko - * @name uki.view.Checkbox - * @class - * @extends uki.view.Button - */ -uki.view.declare('uki.view.Checkbox', uki.view.Button, function(Base) { - - this._backgroundPrefix = 'checkbox-'; - - /** - * @function - * @name uki.view.Button#"checked-normal-background" - */ - /** - * @function - * @name uki.view.Button#"checked-hover-background" - */ - /** - * @function - * @name uki.view.Button#"checked-disabled-background" - */ - uki.each(['checked-normal', 'checked-hover', 'checked-disabled'], function(i, name) { - var property = name + '-background'; - this[property] = function(bg) { - if (bg) this['_' + property] = bg; - return this['_' + property] = this['_' + property] || - uki.theme.background(this._backgroundPrefix + name, {height: this.rect().height, view: this}); - }; - }, this); - - this._setup = function() { - Base._setup.call(this); - this._focusable = false; - }; - - this._updateBg = function() { - var name = this._disabled ? 'disabled' : this._over ? 'hover' : 'normal'; - if (this._checked) name = 'checked-' + name; - this._backgroundByName(name); - }; - - /** - * @function - * @name uki.view.Button#value - */ - /** - * @function - * @name uki.view.Button#checked - */ - this.value = this.checked = uki.newProp('_checked', function(state) { - this._checked = !!state; - this._updateBg(); - }); - - this._mouseup = function(e) { - if (!this._down) return; - this._down = false; - if (!this._disabled) { - this.checked(!this.checked()) - this.trigger('change', {checked: this._checked, source: this}); - } - }; - -}); - - - -(function() { - /** - * Radio button - * - * @author voloko - * @name uki.view.Radio - * @class - * @extends uki.view.Checkbox - */ - var manager = uki.view.declare('uki.view.Radio', uki.view.Checkbox, function(base) { - - this._backgroundPrefix = 'radio-'; - - /** - * @function - * @param {String} group - * @name uki.view.Popup#hide - */ - this.group = uki.newProp('_group', function(g) { - manager.unregisterGroup(this); - this._group = g; - manager.registerGroup(this); - if (this.checked()) manager.clearGroup(this); - }); - - this.value = this.checked = uki.newProp('_checked', function(state) { - this._checked = !!state; - if (state) manager.clearGroup(this); - this._updateBg(); - }); - - this._mouseup = function() { - if (!this._down) return; - this._down = false; - if (!this._checked && !this._disabled) { - this.checked(!this._checked); - this.trigger('change', { checked: this._checked, source: this }); - } - } - }); - - - manager.groups = {}; - - manager.registerGroup = function(radio) { - var group = radio.group(); - if (!manager.groups[group]) { - manager.groups[group] = [radio]; - } else { - manager.groups[group].push(radio); - } - }; - - manager.unregisterGroup = function(radio) { - var group = radio.group(); - if (manager.groups[group]) manager.groups[group] = uki.grep(manager.groups[group], function(registered) { - return registered != radio; - }); - }; - - manager.clearGroup = function(radio) { - uki.each(manager.groups[radio.group()] || [], function(i, registered) { - if (registered == radio) return; - if (registered.checked()) { - registered.checked(false); - this.trigger('change', { checked: false, source: registered }); - } - }); - }; - -})(); -/** -* Editable Text Field -* -* @author voloko -* @name uki.view.TextField -* @class -* @extends uki.view.Base -* @implements uki.view.Focusable -*/ -uki.view.declare('uki.view.TextField', uki.view.Base, uki.view.Focusable, function(Base, Focusable) { - var emptyInputHeight = {}; - - function getEmptyInputHeight (css) { - if (!emptyInputHeight[css]) { - var node = uki.createElement('input', Base.defaultCss + "border:none;padding:0;border:0;margin:0;overflow:hidden;left:-999em;top:0;line-height:1;" + css); - uki.dom.probe( - node, - function(probe) { - emptyInputHeight[css] = probe.offsetHeight; - } - ); - } - return emptyInputHeight[css]; - } - - function nativePlaceholder (node) { - return typeof node.placeholder == 'string'; - } - - this._backgroundPrefix = ''; - this._tagName = 'input'; - this._type = 'text'; - - this._setup = function() { - Base._setup.apply(this, arguments); - uki.extend(this, { - _value: '', - _multiline: false, - _placeholder: '' - }); - this.defaultCss += "margin:0;border:none;outline:none;padding:0;left:2px;top:0;z-index:100;-moz-resize:none;resize:none;background: url(" + uki.theme.imageSrc('x') + ");" + uki.theme.style('input'); - }; - - this._updateBg = function() { - this._input.style.color = this._disabled ? '#999' : '#000'; - }; - - /** - * @function - * @name uki.view.TextField#name - */ - uki.delegateProp(this, 'name', '_input'); - - /** - * @function - * @name uki.view.TextField#value - */ - this.value = function(value) { - if (value === undefined) return this._input.value; - - this._input.value = value; - this._updatePlaceholderVis(); - return this; - }; - - /** - * Cross browser placeholder implementation - * @function - * @name uki.view.TextField#placeholder - */ - this.placeholder = uki.newProp('_placeholder', function(v) { - this._placeholder = v; - if (!this._multiline && nativePlaceholder(this._input)) { - this._input.placeholder = v; - } else { - if (!this._placeholderDom) { - this._placeholderDom = uki.createElement('div', this.defaultCss + 'z-input:103;color:#999;cursor:text;-moz-user-select:none;', v); - if (!this._multiline) this._placeholderDom.style.whiteSpace = 'nowrap'; - this._dom.appendChild(this._placeholderDom); - this._updatePlaceholderVis(); - uki.each(['fontSize', 'fontFamily', 'fontWeight'], function(i, name) { - this._placeholderDom.style[name] = this._input.style[name]; - }, this); - - uki.dom.bind(this._placeholderDom, 'mousedown', uki.proxy(function(e) { - this.focus(); - e.preventDefault(); - }, this)); - } else { - this._placeholderDom.innerHTML = v; - } - } - }); - - this._style = function(name, value) { - if (uki.inArray(name, uki.browser.textStyles) != -1) { - if (value === undefined) return this._input.style[name]; - this._input.style[name] = value; - if (this._placeholderDom) this._placeholderDom.style[name] = value; - } - return Base._style.call(this, name, value); - }; - - /** - * @function - * @name uki.view.TextField#backgroundPrefix - */ - uki.addProps(this, ['backgroundPrefix']); - - /** - * @function - * @name uki.view.TextField#defaultBackground - */ - this.defaultBackground = function() { - return uki.theme.background(this._backgroundPrefix + 'input'); - }; - - this._createDom = function() { - this._dom = uki.createElement('div', Base.defaultCss + ';cursor:text;overflow:visible;'); - this._initClassName(); - this._input = uki.createElement(this._tagName, this.defaultCss + (this._multiline ? '' : ';overflow:hidden;')); - - this._input.value = this._value; - if (this._type) this._input.type = this._type; - this._dom.appendChild(this._input); - - this._input.value = this.value(); - - this._initFocusable(this._input); - this.bind('mousedown', function(e) { - if (e.target == this._input) return; - this.focus(); - }); - }; - - this._layoutDom = function(rect) { - Base._layoutDom.apply(this, arguments); - uki.dom.layout(this._input.style, { - width: this._rect.width - 4 - }); - var margin; - if (this._multiline) { - this._input.style.height = this._rect.height - 4 + PX; - this._input.style.top = 2 + PX; - margin = '2px 0'; - } else { - var o = (this._rect.height - getEmptyInputHeight( 'font-size:' + this.style('fontSize') + ';font-family:' + this.style('fontFamily') )) / 2; - margin = CEIL(o) + 'px 0 ' + FLOOR(o) + 'px 0'; - this._input.style.padding = margin; - } - if (this._placeholderDom) this._placeholderDom.style.padding = margin; - }; - - this._updatePlaceholderVis = function() { - if (this._placeholderDom) this._placeholderDom.style.display = this.value() ? 'none' : 'block'; - }; - - this._focus = function(e) { - this._focusBackground = this._focusBackground || uki.theme.background(this._backgroundPrefix + 'input-focus'); - this._focusBackground.attachTo(this); - if (this._placeholderDom) this._placeholderDom.style.display = 'none'; - Focusable._focus.call(this, e); - }; - - this._blur = function(e) { - this._focusBackground.detach(); - this._updatePlaceholderVis(); - Focusable._blur.call(this, e); - }; - - this._bindToDom = function(name) { - return Focusable._bindToDom.call(this, name) || Base._bindToDom.call(this, name); - }; -}); - -/** -* Multiline Editable Text Field (textarea) -* -* @author voloko -* @name uki.view.MultilineTextField -* @class -* @extends uki.view.TextField -*/ -uki.view.declare('uki.view.MultilineTextField', uki.view.TextField, function(Base) { - this._tagName = 'textarea'; - this._type = ''; - - this._setup = function() { - Base._setup.call(this); - this._multiline = true; - }; -}); - -/** -* Password Field -* -* @author voloko -* @name uki.view.PasswordTextField -* @class -* @extends uki.view.TextField -*/ -uki.view.declare('uki.view.PasswordTextField', uki.view.TextField, function(Base) { - this._setup = function() { - Base._setup.call(this); - this._type = 'password'; - }; -}); - -uki.Collection.addAttrs(['placeholder']); - -(function() { - var scrollWidth, widthIncludesScrollBar; - - function initScrollWidth () { - if (!scrollWidth) { - uki.dom.probe( - uki.createElement( - 'div', - 'position:absolute;left:-99em;width:100px;height:100px;overflow:scroll;', - '
' - ), - function( probe ) { - scrollWidth = probe.offsetWidth - probe.clientWidth; - widthIncludesScrollBar = probe.firstChild.offsetWidth == 100; - } - ); - } - return scrollWidth; - } - - /** - * Scroll pane. - * Pane with scrollbars with content overflowing the borders. - * Works consistently across all supported browsers. - * - * @author voloko - * @name uki.view.ScrollPane - * @class - * @extends uki.view.Container - */ - uki.view.declare('uki.view.ScrollPane', uki.view.Container, function(Base) { - uki.extend(this, { - _scrollableY: true, - _scrollableX: false, - _scrollY: false, - _scrollX: false, - _sbY: false, - _sbX: false - }); - - this._setup = function() { - Base._setup.call(this); - - this._clientRect = this.rect().clone(); - this._rectForChild = this.rect().clone(); - }; - - /** - * @function - * @name uki.view.ScrollPane#scrollableY - */ - /** - * @function - * @name uki.view.ScrollPane#scrollableX - */ - /** - * @function - * @name uki.view.ScrollPane#scrollX - */ - /** - * @function - * @name uki.view.ScrollPane#scrollY - */ - uki.addProps(this, ['scrollableY', 'scrollableX', 'scrollX', 'scrollY']); - this.scrollV = this.scrollY; - this.scrollH = this.scrollX; - - this.scrollableV = this.scrollableY; - this.scrollableH = this.scrollableX; - - this.rectForChild = function() { return this._rectForChild; }; - this.clientRect = function() { return this._clientRect; }; - - /** - * @function - * @param {Number} dx - * @param {Number} dy - * @name uki.view.ScrollPane#scroll - */ - this.scroll = function(dx, dy) { - if (dx) this.scrollLeft(this.scrollLeft() + dx); - if (dy) this.scrollTop(this.scrollTop() + dy); - }; - - /** - * @function - * @name uki.view.ScrollPane#scrollTop - */ - /** - * @function - * @name uki.view.ScrollPane#scrollLeft - */ - uki.each(['scrollTop', 'scrollLeft'], function(i, name) { - this[name] = function(v) { - if (v == undefined) return this._dom[name]; - this._dom[name] = v; - this.trigger('scroll', { source: this }); - return this; - }; - }, this); - - /** - * @function - * @return {uki.geometry.Rect} - * @name uki.view.ScrollPane#visibleRect - */ - this.visibleRect = function() { - var tmpRect = this._clientRect.clone(); - tmpRect.x = this.rect().x + this.scrollLeft(); - tmpRect.y = this.rect().y + this.scrollTop(); - return tmpRect; - }; - - this.rect = function(newRect) { - if (newRect === undefined) return this._rect; - - newRect = Rect.create(newRect); - var oldRect = this._rect; - this._parentRect = newRect; - if (!this._resizeSelf(newRect)) return this; - this._updateClientRects(); - this._needsLayout = true; - this.trigger('resize', {oldRect: oldRect, newRect: this._rect, source: this}); - return this; - }; - - this._createDom = function() { - Base._createDom.call(this); - if (ua.indexOf('Gecko/') > -1) this._dom.tabIndex = '-1'; - }; - - this._recalcClientRects = function() { - initScrollWidth(); - - var cw = this.contentsWidth(), - ch = this.contentsHeight(), - sx = this._scrollableX ? cw > this._rect.width : false, - sy = this._scrollableY ? ch > this._rect.height : false; - - this._sbX = sx || this._scrollX; - this._sbY = sy || this._scrollY; - this._clientRect = new Rect( this._rect.width + (sy ? -1 : 0) * scrollWidth, - this._rect.height + (sx ? -1 : 0) * scrollWidth ); - this._rectForChild = new Rect( this._rect.width + ((sy && !widthIncludesScrollBar) ? -1 : 0) * scrollWidth, - this._rect.height + ((sx && !widthIncludesScrollBar) ? -1 : 0) * scrollWidth ); - }; - - this._updateClientRects = function() { - var oldClientRect = this._clientRect; - this._recalcClientRects(); - - if (oldClientRect.width != this._clientRect.width || oldClientRect.height != this._clientRect.height) { - this._resizeChildViews(oldClientRect); - } - }; - - this._resizeChildViews = function(oldClientRect) { - for (var i=0, childViews = this.childViews(); i < childViews.length; i++) { - childViews[i].parentResized(oldClientRect, this._clientRect); - }; - }; - - this._layoutChildViews = function() { - for (var i=0, childViews = this.childViews(); i < childViews.length; i++) { - if (childViews[i]._needsLayout && childViews[i].visible()) { - childViews[i].layout(); - } - }; - }; - - this._layoutDom = function(rect) { - this._updateClientRects(); - - if (this._layoutScrollX !== this._sbX) { - this._dom.style.overflowX = this._sbX ? 'scroll' : 'hidden'; - this._layoutScrollX = this._sbX; - } - - if (this._layoutScrollY !== this._sbY) { - this._dom.style.overflowY = this._sbY ? 'scroll' : 'hidden'; - this._layoutScrollY = this._sbY; - } - - Base._layoutDom.call(this, rect); - }; - - this.childResized = function() { - this._needsLayout = true; - uki.after(uki.proxy(this.layoutIfNeeded, this)); - }; - - this._contentChanged = this.childResized; - - }); - - uki.view.ScrollPane.initScrollWidth = initScrollWidth; -})(); - -uki.Collection.addAttrs(['scrollTop', 'scrollLeft']); -uki.fn.scroll = function(dx, dy) { - this.each(function() { - this.scroll(dx, dy); - }); -}; - -uki.view.list = {}; -/** - * List View - * Progressevly renders list data. Support selection and drag&drop. - * Renders rows with plain html. - * - * @author voloko - * @name uki.view.List - * @class - * @extends uki.view.Base - * @implements uki.view.Focusable - */ -uki.view.declare('uki.view.List', uki.view.Base, uki.view.Focusable, function(Base, Focusable) { - - this._throttle = 42; // do not try to render more often than every 42ms - this._visibleRectExt = 300; // extend visible rect by 300 px overflow - this._defaultBackground = 'theme(list)'; - - this._setup = function() { - Base._setup.call(this); - uki.extend(this, { - _rowHeight: 30, - _render: new uki.view.list.Render(), - _data: [], - _lastClickIndex: -1, - _selectedIndexes: [] - }); - }; - - /** - * @function - * @name uki.view.List#defaultBackground - */ - this.defaultBackground = function() { - return uki.theme.background('list', this._rowHeight); - }; - - /** - * @type uki.view.list.Render - * @function - * @name uki.view.List#render - */ - /** - * @function - * @name uki.view.List#packSize - */ - /** - * @function - * @name uki.view.List#visibleRectExt - */ - /** - * @function - * @name uki.view.List#throttle - */ - /** - * @function - * @name uki.view.List#lastClickIndex - */ - /** - * @function - * @name uki.view.List#multiselect - */ - uki.addProps(this, ['render', 'packSize', 'visibleRectExt', 'throttle', 'lastClickIndex', 'multiselect']); - - /** - * @function - * @name uki.view.List#rowHeight - */ - this.rowHeight = uki.newProp('_rowHeight', function(val) { - this._rowHeight = val; - this.minSize(new Size(this.minSize().width, this._rowHeight * this._data.length)); - if (this._background) this._background.detach(); - this._background = null; - if (this.background()) this.background().attachTo(this); - this._contentChanged(); - }); - - /** - * @example list.data(['row1', 'row2', ...]) - * @function - * @name uki.view.List#data - */ - this.data = function(d) { - if (d === undefined) return this._data; - this.clearSelection(); - this._data = d; - this._packs[0].itemFrom = this._packs[0].itemTo = this._packs[1].itemFrom = this._packs[1].itemTo = 0; - - this.minSize(new Size(this.minSize().width, this._rowHeight * this._data.length)); - this.trigger('selection', {source: this}); - this._contentChanged(); - return this; - }; - - /** - * Forces list content update - * @function - * @name uki.view.List#relayout - */ - this.relayout = function() { - this._packs[0].itemFrom = this._packs[0].itemTo = this._packs[1].itemFrom = this._packs[1].itemTo = 0; - this.layout(); - }; - - this.contentsSize = function() { - return new Size(this.rect().width, this._rowHeight * this._data.length); - }; - - /** - * used in search. should be fast - * @function - * @param {Number} position - * @param {String} data - * @name uki.view.List#addRow - */ - this.addRow = function(position, data) { - this._data.splice(position, 0, data); - var item = this._itemAt(position); - var container = doc.createElement('div'); - - container.innerHTML = this._rowTemplate.render({ - height: this._rowHeight, - text: this._render.render(this._data[position], this._rowRect(position), position) - }); - if (item) { - item.parentNode.insertBefore(container.firstChild, item); - } else { - this._dom.childNodes[0].appendChild(container.firstChild); - } - - if (position <= this._packs[0].itemTo) { - this._packs[0].itemTo++; - this._packs[1].itemFrom++; - this._packs[1].itemTo++; - this._packs[1].dom.style.top = this._packs[1].itemFrom*this._rowHeight + 'px'; - } else { - this._packs[1].itemTo++; - } - - // offset selection - var selectionPosition = uki.binarySearch(position, this.selectedIndexes()); - for (var i = selectionPosition; i < this._selectedIndexes.length; i++) { - this._selectedIndexes[i]++; - }; - - // needed for scrollbar - this.minSize(new Size(this.minSize().width, this._rowHeight * this._data.length)); - this._contentChanged(); - - return this; - }; - - /** - * @function - * @param {Number} position - * @name uki.view.List#removeRow - */ - this.removeRow = function(position) { - this._data.splice(position, 1); - this.data(this._data); - return this; - }; - - /** - * Forces one particular row to be redrawn - * @function - * @param {Number} position - * @name uki.view.List#removeRow - */ - this.redrawRow = function(position) { - var item = this._itemAt(position); - if (item) item.innerHTML = this._render.render(this._data[position], this._rowRect(position), position); - return this; - }; - - /** - * Read/write current selected index for selectable lists - * @function - * @param {Number} position - * @name uki.view.List#selectedIndex - */ - this.selectedIndex = function(position) { - if (position === undefined) return this._selectedIndexes.length ? this._selectedIndexes[0] : -1; - this.selectedIndexes([position]); - this._scrollToPosition(position); - return this; - }; - - /** - * Read/write all selected indexes for multiselectable lists - * @function - * @param {Array.} position - * @name uki.view.List#selectedIndex - */ - this.selectedIndexes = function(indexes) { - if (indexes === undefined) return this._selectedIndexes; - this.clearSelection(true); - this._selectedIndexes = indexes; - for (var i=0; i < this._selectedIndexes.length; i++) { - this._setSelected(this._selectedIndexes[i], true); - }; - this.trigger('selection', {source: this}); - return this; - }; - - /** - * Read contents of selected row - * @function - * @name uki.view.List#selectedRow - */ - this.selectedRow = function() { - return this._data[this.selectedIndex()]; - }; - - /** - * Read contents of all selected rows - * @function - * @name uki.view.List#selectedRows - */ - this.selectedRows = function() { - return uki.map(this.selectedIndexes(), function(index) { - return this._data[index]; - }, this) - }; - - /** - * @function - * @name uki.view.List#clearSelection - */ - this.clearSelection = function(skipClickIndex) { - for (var i=0; i < this._selectedIndexes.length; i++) { - this._setSelected(this._selectedIndexes[i], false); - }; - this._selectedIndexes = []; - if (!skipClickIndex) this._lastClickIndex = -1; - }; - - /** - * @function - * @param {Number} index - * @name uki.view.List#isSelected - */ - this.isSelected = function(index) { - var found = uki.binarySearch(index, this._selectedIndexes); - return this._selectedIndexes[found] == index; - }; - - this.layout = function() { - this._layoutDom(this._rect); - this._needsLayout = false; - // send visibleRect with layout - this.trigger('layout', { rect: this._rect, source: this, visibleRect: this._visibleRect }); - this._firstLayout = false; - }; - - function range (from, to) { - var result = new Array(to - from); - for (var idx = 0; from <= to; from++, idx++) { - result[idx] = from; - }; - return result; - } - - function removeRange (array, from, to) { - var p = uki.binarySearch(from, array), - initialP = p; - while (array[p] <= to) p++; - if (p > initialP) array.splice(initialP, p - initialP); - } - - this._rowRect = function(p) { - return new Rect(0, p*this._rowHeight, this.rect().width, this._rowHeight); - }; - - this._toggleSelection = function(p) { - var indexes = [].concat(this._selectedIndexes); - var addTo = uki.binarySearch(p, indexes); - if (indexes[addTo] == p) { - indexes.splice(addTo, 1); - } else { - indexes.splice(addTo, 0, p); - } - this.selectedIndexes(indexes); - }; - - var updatingScroll = false; - this._scrollableParentScroll = function() { - if (updatingScroll) return; - if (this._throttle) { - if (this._throttleStarted) return; - this._throttleStarted = true; - setTimeout(uki.proxy(function() { - this._throttleStarted = false; - this.layout(); - }, this), this._throttle); - } else { - this.layout(); - } - }; - - this._contentChanged = function() { - this._needsLayout = true; - uki.after(uki.proxy(this._relayoutParent, this)); - }; - - this._relayoutParent = function() { - this.parent().childResized(this); - if (!this._scrollableParent) return; - var c = this; - while ( c && c != this._scrollableParent) { - c._needsLayout = true; - c = c.parent(); - } - c.layout(); - }; - - - this.keyPressEvent = function() { - var useKeyPress = root.opera || (/mozilla/i.test( ua ) && !(/(compatible|webkit)/i).test( ua )); - return useKeyPress ? 'keypress' : 'keydown'; - }; - - this._bindSelectionEvents = function() { - this.bind('mousedown', this._mousedown); - this.bind('mouseup', this._mouseup); - this.bind(this.keyPressEvent(), this._keypress); - }; - - this._mouseup = function(e) { - if (!this._multiselect) return; - - var o = uki.dom.offset(this._dom), - y = e.pageY - o.y, - p = y / this._rowHeight << 0; - - if (this._selectionInProcess && this._lastClickIndex == p && this.isSelected(p)) this.selectedIndexes([p]); - this._selectionInProcess = false; - }; - - this._mousedown = function(e) { - var o = uki.dom.offset(this._dom), - y = e.pageY - o.y, - p = y / this._rowHeight << 0, - indexes = this._selectedIndexes; - - if (this._multiselect) { - this._selectionInProcess = false; - if (e.shiftKey && indexes.length > 0) { - if (this.isSelected(p)) { - indexes = [].concat(indexes); - removeRange(indexes, Math.min(p+1, this._lastClickIndex), Math.max(p-1, this._lastClickIndex)); - this.selectedIndexes(indexes); - } else { - this.selectedIndexes(range( - Math.min(p, indexes[0]), - Math.max(p, indexes[indexes.length - 1]) - )); - } - } else if (e.metaKey) { - this._toggleSelection(p); - } else { - if (!this.isSelected(p)) { - this.selectedIndexes([p]); - } else { - this._selectionInProcess = true; - } - } - } else { - this.selectedIndexes([p]); - } - this._lastClickIndex = p; - }; - - this._keypress = function(e) { - var indexes = this._selectedIndexes, - nextIndex = -1; - if (e.which == 38 || e.keyCode == 38) { // UP - nextIndex = Math.max(0, this._lastClickIndex - 1); - e.preventDefault(); - } else if (e.which == 40 || e.keyCode == 40) { // DOWN - nextIndex = Math.min(this._data.length-1, this._lastClickIndex + 1); - e.preventDefault(); - } else if (this._multiselect && (e.which == 97 || e.which == 65) && e.metaKey) { - e.preventDefault(); - this.selectedIndexes(range(0, this._data.length -1)); - } - if (nextIndex > -1 && nextIndex != this._lastClickIndex) { - if (e.shiftKey && this._multiselect) { - if (this.isSelected(nextIndex)) { - this._toggleSelection(this._lastClickIndex); - } else { - this._toggleSelection(nextIndex); - } - this._scrollToPosition(nextIndex); - } else { - this.selectedIndex(nextIndex); - } - this._lastClickIndex = nextIndex; - } - }; - - this._createDom = function() { - this._dom = uki.createElement('div', this.defaultCss + 'overflow:hidden'); - this._initClassName(); - - var packDom = uki.createElement('div', 'position:absolute;left:0;top:0px;width:100%;overflow:hidden'); - this._packs = [ - { - dom: packDom, - itemTo: 0, - itemFrom: 0 - }, - { - dom: packDom.cloneNode(false), - itemTo: 0, - itemFrom: 0 - } - ]; - this._dom.appendChild(this._packs[0].dom); - this._dom.appendChild(this._packs[1].dom); - - this._initFocusable(); - this._bindSelectionEvents(); - }; - - this._setSelected = function(position, state) { - var item = this._itemAt(position); - if (item) this._render.setSelected(item, this._data[position], state, this.hasFocus()); - }; - - this._scrollToPosition = function(position) { - if (!this._visibleRect) return; - var maxY, minY; - maxY = (position+1)*this._rowHeight; - minY = position*this._rowHeight; - updatingScroll = true; - if (maxY >= this._visibleRect.maxY()) { - this._scrollableParent.scroll(0, maxY - this._visibleRect.maxY()); - } else if (minY < this._visibleRect.y) { - this._scrollableParent.scroll(0, minY - this._visibleRect.y); - } - updatingScroll = false; - this.layout(); - }; - - this._itemAt = function(position) { - if (position < this._packs[1].itemTo && position >= this._packs[1].itemFrom) { - return this._packs[1].dom.childNodes[position - this._packs[1].itemFrom]; - } else if (position < this._packs[0].itemTo && position >= this._packs[0].itemFrom) { - return this._packs[0].dom.childNodes[position - this._packs[0].itemFrom]; - } - return null; - }; - - this._rowTemplate = new uki.theme.Template('
${text}
') - - this._renderPack = function(pack, itemFrom, itemTo) { - var html = [], position; - for (i=itemFrom; i < itemTo; i++) { - html[html.length] = this._rowTemplate.render({ - height: this._rowHeight, - text: this._render.render(this._data[i], this._rowRect(i), i) - }); - }; - pack.dom.innerHTML = html.join(''); - pack.itemFrom = itemFrom; - pack.itemTo = itemTo; - pack.dom.style.top = itemFrom*this._rowHeight + 'px'; - this._restorePackSelection(pack, itemFrom, itemTo); - }; - - // xxxxx | xxxxx | xxxxxxxx | xxx - // yyyyy | yyyyy | yyyy | yyyyyyy - this._restorePackSelection = function(pack) { - var indexes = this._selectedIndexes; - - if ( - (indexes[0] <= pack.itemFrom && indexes[indexes.length - 1] >= pack.itemFrom) || // left index - (indexes[0] <= pack.itemTo && indexes[indexes.length - 1] >= pack.itemTo) || // right index - (indexes[0] >= pack.itemFrom && indexes[indexes.length - 1] <= pack.itemTo) // within - ) { - var currentSelection = uki.binarySearch(pack.itemFrom, indexes); - currentSelection = Math.max(currentSelection, 0); - while(indexes[currentSelection] !== null && indexes[currentSelection] < pack.itemTo) { - var position = indexes[currentSelection] - pack.itemFrom; - this._render.setSelected(pack.dom.childNodes[position], this._data[position], true, this.hasFocus()); - currentSelection++; - } - } - }; - - this._swapPacks = function() { - var tmp = this._packs[0]; - this._packs[0] = this._packs[1]; - this._packs[1] = tmp; - }; - - this._layoutDom = function(rect) { - if (!this._scrollableParent) { - this._scrollableParent = uki.view.scrollableParent(this); - this._scrollableParent.bind('scroll', uki.proxy(this._scrollableParentScroll, this)); - } - - var totalHeight = this._rowHeight * this._data.length, - scrollableParent = this._scrollableParent; - - this._visibleRect = uki.view.visibleRect(this, scrollableParent); - if (this._focusTarget) this._focusTarget.style.top = this._visibleRect.y + 'px'; - var prefferedPackSize = CEIL((this._visibleRect.height + this._visibleRectExt*2) / this._rowHeight), - - minVisibleY = MAX(0, this._visibleRect.y - this._visibleRectExt), - maxVisibleY = MIN(totalHeight, this._visibleRect.maxY() + this._visibleRectExt), - minRenderedY = this._packs[0].itemFrom * this._rowHeight, - maxRenderedY = this._packs[1].itemTo * this._rowHeight, - - itemFrom, itemTo, startAt, updated = true; - - Base._layoutDom.call(this, rect); - if ( - maxVisibleY <= minRenderedY || minVisibleY >= maxRenderedY || // both packs below/above visible area - (maxVisibleY > maxRenderedY && this._packs[1].itemFrom * this._rowHeight > this._visibleRect.y && this._packs[1].itemTo > this._packs[1].itemFrom) || // need to render below, and pack 2 is not enough to cover - (minVisibleY < minRenderedY && this._packs[0].itemTo * this._rowHeight < this._visibleRect.maxY()) // need to render above, and pack 1 is not enough to cover the area - // || prefferedPackSize is not enough to cover the area above/below, can this actually happen? - ) { - // this happens a) on first render b) on scroll jumps c) on container resize - // render both packs, move them to be at the center of visible area - // startAt = minVisibleY + (maxVisibleY - minVisibleY - prefferedPackSize*this._rowHeight*2) / 2; - startAt = minVisibleY - this._visibleRectExt / 2; - itemFrom = MAX(0, Math.round(startAt / this._rowHeight)); - itemTo = MIN(this._data.length, itemFrom + prefferedPackSize); - - this._renderPack(this._packs[0], itemFrom, itemTo); - this._renderPack(this._packs[1], itemTo, itemTo); - // this._renderPack(this._packs[1], itemTo, MIN(this._data.length, itemTo + prefferedPackSize)); - } else if (maxVisibleY > maxRenderedY && this._packs[1].itemTo > this._packs[1].itemFrom) { // we need to render below current area - // this happens on normal scroll down - // re-render bottom, swap - itemFrom = this._packs[1].itemTo; - itemTo = MIN(this._data.length, this._packs[1].itemTo + prefferedPackSize); - - this._renderPack(this._packs[0], itemFrom, itemTo); - this._swapPacks(); - } else if (maxVisibleY > maxRenderedY) { // we need to render below current area - itemFrom = this._packs[0].itemTo; - itemTo = MIN(this._data.length, this._packs[1].itemTo + prefferedPackSize); - - this._renderPack(this._packs[1], itemFrom, itemTo); - } else if (minVisibleY < minRenderedY) { // we need to render above current area - // this happens on normal scroll up - // re-render top, swap - itemFrom = MAX(this._packs[0].itemFrom - prefferedPackSize, 0); - itemTo = this._packs[0].itemFrom; - - this._renderPack(this._packs[1], itemFrom, itemTo); - this._swapPacks(); - } else { - updated = false; - } - if (updated && /MSIE 6|7/.test(ua)) this.dom().className += ''; - }; - - this._bindToDom = function(name) { - return Focusable._bindToDom.call(this, name) || Base._bindToDom.call(this, name); - }; - - this._focus = function(e) { - Focusable._focus.call(this, e); - if (this._selectedIndexes.length == 0 && this._data.length > 0) { - this.selectedIndexes([0]); - } else { - this.selectedIndexes(this.selectedIndexes()); - } - }; - - this._blur = function(e) { - Focusable._blur.call(this, e); - this.selectedIndexes(this.selectedIndexes()); - }; - -}); - -/** @function -@name uki.Collection#data */ -/** @function -@name uki.Collection#selectedIndex */ -/** @function -@name uki.Collection#selectedIndexes */ -/** @function -@name uki.Collection#selectedRow */ -/** @function -@name uki.Collection#selectedRows */ -/** @function -@name uki.Collection#lastClickIndex */ -uki.Collection.addAttrs(['data', 'selectedIndex', 'selectedIndexes', 'selectedRow', 'selectedRows', 'lastClickIndex']); - -/** - * Scrollable List View - * Puts a list into a scroll pane - * - * @author voloko - * @name uki.view.ScrollableList - * @class - * @extends uki.view.ScrollPane - */ -uki.view.declare('uki.view.ScrollableList', uki.view.ScrollPane, function(Base) { - - this._createDom = function() { - Base._createDom.call(this); - this._list = uki({ view: 'List', rect: this.rect().clone().normalize(), anchors: 'left top right bottom' })[0]; - this.appendChild(this._list); - }; - - uki.each('data rowHeight render packSize visibleRectExt throttle focusable selectedIndex selectedIndexes selectedRow selectedRows multiselect draggable textSelectable'.split(' '), - function(i, name) { - uki.delegateProp(this, name, '_list'); - }, this); - -}); - - -/** - * Flyweight view rendering - * Used in lists, tables, grids - * @class - */ -uki.view.list.Render = uki.newClass({ - init: function() {}, - - /** - * Renders data to an html string - * @param Object data Data to render - * @return String html - */ - render: function(data, rect, i) { - return '
' + data + '
'; - }, - - setSelected: function(container, data, state, focus) { - container.style.backgroundColor = state && focus ? '#3875D7' : state ? '#CCC' : ''; - container.style.color = state && focus ? '#FFF' : '#000'; - } -}); - - - - -uki.view.table = {}; - -/** -* Table -* -* Uses uki.view.List to render data. Wraps it into scroll pane and ads a header -* @author voloko -* @name uki.view.Table -* @class -* @extends uki.view.Container -* -* @lends uki.view.List#rowHeight as rowHeight -* @lends uki.view.List#data as data -* @lends uki.view.List#packSize as packSize -* @lends uki.view.List#visibleRectExt as visibleRectExt -* @lends uki.view.List#render as render -* @lends uki.view.List#selectedIndex as selectedIndex -* @lends uki.view.List#selectedIndexes as selectedIndexes -* @lends uki.view.List#selectedRow as selectedRow -* @lends uki.view.List#selectedRows as selectedRows -* @lends uki.view.List#lastClickIndex as lastClickIndex -* @lends uki.view.List#textSelectable as textSelectable -* @lends uki.view.List#multiselect as multiselect -* @lends uki.view.List#redrawRow as redrawRow -* @lends uki.view.List#addRow as addRow -* @lends uki.view.List#removeRow as removeRow -* @lends uki.view.List#focusable as lastClickIndex -* @lends uki.view.List#focus as focus -* @lends uki.view.List#blur as blur -* @lends uki.view.List#hasFocus as hasFocus -* -*/ -uki.view.declare('uki.view.Table', uki.view.Container, function(Base) { - var propertiesToDelegate = 'rowHeight data packSize visibleRectExt render selectedIndex selectedIndexes selectedRows selectedRow focus blur hasFocus lastClickIndex focusable textSelectable multiselect'.split(' '); - - this._rowHeight = 17; - this._headerHeight = 17; - this._listImpl = 'uki.view.List'; - - uki.each(propertiesToDelegate, function(i, name) { uki.delegateProp(this, name, '_list'); }, this); - - this._setup = function() { - Base._setup.call(this); - this._columns = []; - this.defaultCss += 'overflow:hidden;'; - }; - - this._style = function(name, value) { - this._header.style(name, value); - return Base._style.call(this, name, value); - }; - - /** - * @function - * @return {uki.view.List} - * @name uki.view.Table#list - */ - this.list = function() { - return this._list; - }; - - /** - * @function - * @return {uki.view.table.Header} - * @name uki.view.Table#header - */ - this.header = function() { - return this._header; - }; - - /** - * @function - * @param {Array.} c - * @name uki.view.Table#columns - */ - this.columns = uki.newProp('_columns', function(c) { - for (var i = 0; i < this._columns.length; i++) { - this._columns[i].unbind(); - } - this._columns = uki.build(c); - this._totalWidth = 0; - for (i = 0; i < this._columns.length; i++) { - this._columns[i].position(i); - this._columns[i].bind('beforeResize', uki.proxy(function() { - this._updateTotalWidth(); - this._scrollPane.layout(); - }, this)); - }; - this._updateTotalWidth(); - this._header.columns(this._columns); - }); - - /** - * @function - * @param {Number} row - * @param {Number} col - * @name uki.view.Table#redrawCell - */ - this.redrawCell = function(row, col) { - var item = this._list._itemAt(row); - if (item) { - var cell, container = doc.createElement('div'); - container.innerHTML = this.columns()[col].render( - this.data()[row], - new Rect(0, row*this.rowHeight(), this.list().width(), this.rowHeight()), - row - ); - cell = container.firstChild; - item.replaceChild(cell, item.childNodes[col]); - } - return this; - }; - - uki.each(['redrawRow', 'addRow', 'removeRow'], function(i, name) { - this[name] = function() { - this.list()[name].apply(this.list(), arguments); - return this; - }; - }, this); - - /** - * @function - * @param {Number} col - * @name uki.view.Table#redrawColumn - */ - this.redrawColumn = function(col) { - var from = this._list._packs[0].itemFrom, - to = this._list._packs[1].itemTo; - for (var i=from; i < to; i++) { - this.redrawCell(i, col); - }; - return this; - }; - - this._updateTotalWidth = function() { - this._totalWidth = 0; - for (var i=0; i < this._columns.length; i++) { - this._columns[i].position(i); - this._totalWidth += this._columns[i].width(); - }; - this._list.minSize(new Size(this._totalWidth, this._list.minSize().height)); - // this._list.rect(new Rect(this._totalWidth, this._list.height())); - this._header.minSize(new Size(this._totalWidth, 0)); - }; - - this._createDom = function() { - Base._createDom.call(this); - this._initClassName(); - var scrollPaneRect = new Rect(0, this._headerHeight, this.rect().width, this.rect().height - this._headerHeight), - listRect = scrollPaneRect.clone().normalize(), - headerRect = new Rect(0, 0, this.rect().width, this._headerHeight), - listML = { view: this._listImpl, rect: listRect, anchors: 'left top bottom right', render: new uki.view.table.Render(this), className: 'table-list' }, - paneML = { view: 'ScrollPane', rect: scrollPaneRect, anchors: 'left top right bottom', scrollableH: true, childViews: [listML], className: 'table-scroll-pane'}, - headerML = { view: 'table.Header', rect: headerRect, anchors: 'top left right', className: 'table-header' }; - - uki.each(propertiesToDelegate, function(i, name) { - if (this['_' + name] !== undefined) listML[name] = this['_' + name]; - }, this); - this._scrollPane = uki.build(paneML)[0]; - this._list = this._scrollPane.childViews()[0]; - this._header = uki.build(headerML)[0]; - this._scrollPane.resizeToContents(); - this.appendChild(this._header); - this.appendChild(this._scrollPane); - - this._scrollPane.bind('scroll', uki.proxy(function() { - // this is kinda wrong but faster than calling rect() + layout() - this._header.dom().style.left = -this._scrollPane.scrollLeft() + 'px'; - }, this)); - - }; -}); - -uki.Collection.addAttrs(['columns']); - - -/** - * @class - * @extends uki.view.list.Render - */ -uki.view.table.Render = uki.newClass(uki.view.list.Render, new function() { - this.init = function(table) { - this._table = table; - }; - - this.render = function(row, rect, i) { - var table = this._table, - columns = table.columns(); - return uki.map(columns, function(val, j) { - return columns[j].render(row, rect, i); - }).join(''); - }; -}); -/** - * @class - * @extends uki.view.Observable - */ -uki.view.table.Column = uki.newClass(uki.view.Observable, new function() { - this._width = 100; - this._offset = 0; - this._position = 0; - this._minWidth = 0; - this._maxWidth = 0; - this._css = 'float:left;white-space:nowrap;text-overflow:ellipsis;'; - this._inset = new Inset(3, 5); - this._templatePrefix = 'table-'; - - this.init = function() {}; - - uki.addProps(this, ['position', 'css', 'formatter', 'label', 'resizable', 'maxWidth', 'minWidth', 'maxWidth', 'key', 'sort']); - - this.template = function() { - // cache - return this._template || (this._template = uki.theme.template(this._templatePrefix + 'cell')); - }; - - this.headerTemplate = function() { - var suffix = ''; - if (this.sort() == 'ASC') suffix = '-asc'; - if (this.sort() == 'DESC') suffix = '-desc'; - return uki.theme.template(this._templatePrefix + 'header-cell' + suffix); - }; - - this.sortData = function(data) { - var _this = this; - return data.sort(function(a, b) { - return _this._key ? - _this.compare(uki.attr(a, _this._key), uki.attr(b, _this._key)) : - _this.compare(a[_this._position], b[_this._position]); - }); - - }; - - this.compare = function(a, b) { - return (a >= b ? 1 : a == b ? 0 : -1) * (this._sort == 'DESC' ? -1 : 1); - }; - - /** - * @fires event:beforeResize - * @fires event:resize - */ - this.width = uki.newProp('_width', function(w) { - var e = { - oldWidth: this._width, - source: this - }; - this._width = this._normailizeWidth(w); - e.newWidth = this._width; - this.trigger('beforeResize', e); - if (this._stylesheet && e.newWidth != e.oldWidth) { - var rules = this._stylesheet.styleSheet ? this._stylesheet.styleSheet.rules : this._stylesheet.sheet.cssRules; - rules[0].style.width = this._clientWidth() + PX; - } - this.trigger('resize', e); - }); - - this._bindToDom = uki.F; - - this._normailizeWidth = function(w) { - if (this._maxWidth) w = MIN(this._maxWidth, w); - if (this._minWidth) w = MAX(this._minWidth, w); - return w; - }; - - this.inset = uki.newProp('_inset', function(i) { - this._inset = Inset.create(i); - }); - - this.render = function(row, rect, i) { - this._prerenderedTemplate || this._prerenderTemplate(rect); - var value = this._key ? uki.attr(row, this._key) : row[this._position]; - this._prerenderedTemplate[1] = this._formatter ? this._formatter(value, row, i) : value; - return this._prerenderedTemplate.join(''); - }; - - this.appendResizer = function(dom, height) { - var resizer = uki.theme.dom('resizer', height); - dom.appendChild(resizer); - return resizer; - }; - - this.renderHeader = function(height) { - this._className || this._initStylesheet(); - var x = this.headerTemplate().render({ - data: '
' + this.label() + '
', - style: '*overflow-y:hidden;' + this._cellStyle(true, height), - className: this._className - }); - return x; - }; - - this._prerenderTemplate = function(rect) { - this._className || this._initStylesheet(); - this._prerenderedTemplate = this.template().render({ - data: '\u0001\u0001', - style: 'overflow:hidden;' + this._cellStyle(false, rect.height), - className: this._className - }).split('\u0001'); - }; - - this._cellPadding = function(skipVertical) { - var inset = this._inset; - return ['padding:', (skipVertical ? '0' : inset.top), 'px ', inset.right, 'px ', (skipVertical ? '0' : inset.bottom), 'px ', inset.left, 'px;'].join(''); - }; - - this._cellHeight = function(skipVertical, height) { - return 'height:' + (height - (uki.dom.offset.boxModel && !skipVertical ? this._inset.height() : 0)) + 'px;'; - }; - - this._cellStyle = function(skipVertical, height) { - return this._css + this._cellPadding(skipVertical) + ';' + this._cellHeight(skipVertical, height); - }; - - this._clientWidth = function() { - return this._width - (uki.dom.offset.boxModel ? this._inset.width() + 1 : 0); - }; - - this._initStylesheet = function() { - if (!this._className) { - uki.dom.offset.initializeBoxModel(); - this._className = 'uki-table-column-' + (uki.guid++); - var css = '.' + this._className + ' {width:' + this._clientWidth() + 'px;}'; - this._stylesheet = uki.dom.createStylesheet(css); - } - }; -}); - -uki.view.table.NumberColumn = uki.newClass(uki.view.table.Column, new function() { - var Base = uki.view.table.Column.prototype; - - this._css = Base._css + 'text-align:right;'; - - this.compare = function(a, b) { - a*=1; - b*=1; - return (a >= b ? 1 : a == b ? 0 : -1) * (this._sort == 'DESC' ? -1 : 1); - }; -}); - -uki.view.table.CustomColumn = uki.view.table.Column; - - -/** - * @class - * @extends uki.view.Label - */ -uki.view.declare('uki.view.table.Header', uki.view.Label, function(Base) { - this._defaultBackground = 'theme(table-header)'; - - this._setup = function() { - Base._setup.call(this); - this._multiline = true; - this._resizers = []; - }; - - this.columns = uki.newProp('_columns', function(v) { - this._columns = v; - this.html(this._createColumns()); - this._createResizers(); - }); - - this._createDom = function() { - Base._createDom.call(this); - this.bind('click', this._click); - }; - - this._click = function(e) { - if (this._dragging) return; - - var target = e.target; - if (target == this.dom() || target == this._label) return; - while (target.parentNode != this._label) target = target.parentNode; - var i = uki.inArray(target, this._label.childNodes); - if (i > -1) { - this.trigger('columnClick', { source: this, columnIndex: i, column: this._columns[i] }); - } - }; - - this.redrawColumn = function(col) { - if (this._resizers[col]) uki.dom.unbind(this._resizers[col]); - var container = doc.createElement('div'); - container.innerHTML = this._columns[col].renderHeader(this.rect().height); - this._label.replaceChild(container.firstChild, this._label.childNodes[col]); - if (this._columns[col].resizable()) this._createResizers(col); - }; - - this._createColumns = function() { - var html = []; - for(var i = 0, offset = 0, columns = this._columns, l = columns.length; i < l; i++) { - html[html.length] = columns[i].renderHeader(this.rect().height); - } - return html.join(''); - }; - - this._createResizer = function(i) { - var column = this._columns[i]; - if (column.resizable()) { - var resizer = column.appendResizer(this._label.childNodes[i], this.rect().height); - this._bindResizerDrag(resizer, i); - this._resizers[i] = resizer; - } - }; - - this._createResizers = function() { - uki.each(this._columns, this._createResizer, this); - }; - - this._bindResizerDrag = function(resizer, columnIndex) { - var _this = this; - - uki.dom.bind(resizer, 'draggesture', function(e) { - _this._dragging = true; - var headerOffset = uki.dom.offset(_this.dom()), - offsetWithinHeader = e.pageX - headerOffset.x, - columnOffset = 0, i, column = _this._columns[columnIndex]; - for (i=0; i < columnIndex; i++) { - columnOffset += _this._columns[i].width(); - }; - column.width(offsetWithinHeader - columnOffset); - }); - - uki.dom.bind(resizer, 'draggestureend', function() { - setTimeout(function() { - _this._dragging = false; - }, 1); - }); - }; -}); - -/** -* Horizontal Slider. -* -* @author voloko -* @name uki.view.Slider -* @class -* @extends uki.view.Base -* @implements uki.view.Focusable -*/ -uki.view.declare('uki.view.Slider', uki.view.Container, uki.view.Focusable, function(Base, Focusable) { - - this._handleSize = new Size(10,18); - - this._setup = function() { - Base._setup.call(this); - uki.extend(this, { - _min: 0, - _max: 1, - _value: 0, - _values: null, - _keyStep: 0.01 - }); - }; - - /** - * @function - * @name uki.view.Slider#min - */ - /** - * @function - * @name uki.view.Slider#max - */ - /** - * @function - * @name uki.view.Slider#values - */ - /** - * @function - * @name uki.view.Slider#keyStep - */ - uki.addProps(this, ['min', 'max', 'values', 'keyStep']); - - this.values = uki.newProp('_values', function(val) { - this._values = val; - this._min = val[0]; - this._max = val[val.length - 1]; - }); - - /** - * @function - * @fires event:change - * @name uki.view.Slider#value - */ - this.value = uki.newProp('_value', function(val) { - this._value = MAX(this._min, MIN(this._max, val)); - this._position = this._val2pos(this._value); - this._moveHandle(); - }); - - this._pos2val = function(pos, cacheIndex) { - if (this._values) { - var index = Math.round(1.0 * pos / (this._rect.width - this._handleSize.width) * (this._values.length - 1)); - if (cacheIndex) this._cachedIndex = index; - return this._values[index]; - } - return pos / (this._rect.width - this._handleSize.width) * (this._max - this._min) + this._min; - }; - - this._val2pos = function(val) { - if (this._values) { - var index = this._cachedIndex !== undefined ? this._cachedIndex : uki.binarySearch(val, this._values); - return index / (this._values.length - 1) * (this._rect.width - this._handleSize.width); - } - return (val - this._min) / (this._max - this._min) * (this._rect.width - this._handleSize.width); - }; - - this._createDom = function() { - this._dom = uki.createElement('div', this.defaultCss + 'height:18px;-moz-user-select:none;-webkit-user-select:none;overflow:visible;'); - this._initClassName(); - this._handle = uki({ - view: 'SliderHandle', - rect: new Rect(0, (this._rect.height-this._handleSize.height)/2, this._handleSize.width, this._handleSize.height), - anchors: 'left top' - })[0]; - this.appendChild(this._handle); - - uki.theme.background('slider-bar').attachTo(this); - uki.each(['draggesturestart', 'draggesture', 'draggestureend'], function(i, name) { - this._handle.bind(name, uki.proxy(this['_' + name], this)); - }, this); - - this.bind(uki.view.List.prototype.keyPressEvent(), this._keypress); - this.bind('click', this._click); - - this._initFocusable(); - }; - - this._focus = function(e) { - this._handle._focus(); - Focusable._focus.call(this, e); - }; - - this._blur = function(e) { - this._handle._blur(); - Focusable._blur.call(this, e); - }; - - this._click = function(e) { - var x = e.pageX - uki.dom.offset(this._dom).x - this._handleSize.width/2; - this.value(this._pos2val(x, true)); - this._cachedIndex = undefined; - this.trigger('change', {source: this, value: this._value}); - }; - - this._keypress = function(e) { - if (e.which == 39 || e.keyCode == 39) { - this.value(this.value() + this._keyStep * (this._max - this._min)); - } else if (e.which == 37 || e.keyCode == 37) { - this.value(this.value() - this._keyStep * (this._max - this._min)); - } - }; - - this._moveHandle = function() { - var rect = this._handle.rect().clone(); - rect.x = this._position; - rect.y = (this._rect.height - this._handleSize.height) / 2; - this._handle.rect(rect).layout(); - }; - - this._draggesturestart = function(e) { - this._dragging = true; - this._initialPosition = this._handle.rect().clone(); - return true; - }; - - /** - * @fires event:change - */ - this._draggesture = function(e) { - var position = MAX(0, MIN(this._rect.width - this._handleSize.width, this._initialPosition.x + e.dragOffset.x)); - this.value(this._pos2val(position, true)); - this._cachedIndex = undefined; - }; - - this._draggestureend = function(e) { - this._dragging = false; - this._initialPosition = null; - this.value(this._pos2val(this._position, true)); - this._cachedIndex = undefined; - this.trigger('change', {source: this, value: this._value}); - }; - - this._layoutDom = function(rect) { - Base._layoutDom.call(this, rect); - this._position = this._val2pos(this._value); - this._moveHandle(); - return true; - }; - - this._bindToDom = function(name) { - if (name == 'change') return true; - return uki.view.Focusable._bindToDom.call(this, name) || Base._bindToDom.call(this, name); - }; - -}); - -uki.view.declare('uki.view.SliderHandle', uki.view.Button, { _backgroundPrefix: 'slider-handle-', _focusable: false }); - -/** -* Horizontal Split Pane -* -* @author voloko -* @name uki.view.HSplitPane -* @class -* @extends uki.view.Container -*/ -uki.view.declare('uki.view.HSplitPane', uki.view.Container, function(Base) { - this._throttle = 0; // do not try to render more often than every Xms - - this._setup = function() { - Base._setup.call(this); - this._originalRect = this._rect; - uki.extend(this, { - _vertical: false, - _handlePosition: 200, - _autogrowLeft: false, - _autogrowRight: true, - _handleWidth: 7, - _leftMin: 100, - _rightMin: 100, - - _panes: [] - }); - }; - - /** - * @function - * @name uki.view.HSplitPane#leftMin - */ - /** - * @function - * @name uki.view.HSplitPane#rightMin - */ - /** - * @function - * @name uki.view.HSplitPane#autogrowLeft - */ - /** - * @function - * @name uki.view.HSplitPane#autogrowRight - */ - /** - * @function - * @name uki.view.HSplitPane#throttle - */ - uki.addProps(this, ['leftMin', 'rightMin', 'autogrowLeft', 'autogrowRight', 'throttle']); - this.topMin = this.leftMin; - this.bottomMin = this.rightMin; - - /** - * @function - * @fires event:handleMove - * @name uki.view.HSplitPane#handlePosition - */ - this.handlePosition = uki.newProp('_handlePosition', function(val) { - this._handlePosition = this._normalizePosition(val); - this.trigger('handleMove', {source: this, handlePosition: this._handlePosition, dragValue: val }); - this._resizeChildViews(); - }); - - /** - * @function - * @name uki.view.HSplitPane#handleWidth - */ - this.handleWidth = uki.newProp('_handleWidth', function(val) { - if (this._handleWidth != val) { - this._handleWidth = val; - var handle = this._createHandle(); - this._dom.insertBefore(handle, this._handle); - this._removeHandle(); - this._handle = handle; - this._resizeChildViews(); - } - }); - - - this._normalizePosition = function(val) { - var prop = this._vertical ? 'height' : 'width'; - return MAX( - this._leftMin, - MIN( - this._rect[prop] - this._rightMin - this._handleWidth, - MAX(0, MIN(this._rect ? this._rect[prop] : 1000, val * 1)) - )); - }; - - - this._removeHandle = function() { - this._dom.removeChild(this._handle); - }; - - this._createHandle = function() { - var handle; - if (this._vertical) { - handle = uki.theme.dom('splitPane-vertical', {handleWidth: this._handleWidth}); - handle.style.top = this._handlePosition + PX; - } else { - handle = uki.theme.dom('splitPane-horizontal', {handleWidth: this._handleWidth}); - handle.style.left = this._handlePosition + PX; - } - - uki.each(['draggesturestart', 'draggesture', 'draggestureend'], function(i, name) { - uki.dom.bind(handle, name, uki.proxy(this['_' + name], this)); - }, this); - - return handle; - }; - - this._createDom = function() { - this._dom = uki.createElement('div', this.defaultCss); - this._initClassName(); - for (var i=0, paneML; i < 2; i++) { - paneML = { view: 'Container' }; - paneML.anchors = i == 1 ? 'left top bottom right' : - this._vertical ? 'left top right' : - 'left top bottom'; - paneML.rect = i == 0 ? this._leftRect() : this._rightRect(); - this._panes[i] = uki.build(paneML)[0]; - this.appendChild(this._panes[i]); - }; - this._dom.appendChild(this._handle = this._createHandle()); - }; - - this._normalizeRect = function(rect) { - rect = Base._normalizeRect.call(this, rect); - var newRect = rect.clone(); - if (this._vertical) { - newRect.height = MAX(newRect.height, this._leftMin + this._rightMin); // force min width - } else { - newRect.width = MAX(newRect.width, this._leftMin + this._rightMin); // force min width - } - return newRect; - }; - - this._resizeSelf = function(newRect) { - var oldRect = this._rect, - dx, prop = this._vertical ? 'height' : 'width'; - if (!Base._resizeSelf.call(this, newRect)) return false; - if (this._autogrowLeft) { - dx = newRect[prop] - oldRect[prop]; - this._handlePosition = this._normalizePosition(this._handlePosition + (this._autogrowRight ? dx / 2 : dx)); - } - if (this._vertical) { - if (newRect.height - this._handlePosition < this._rightMin) { - this._handlePosition = MAX(this._leftMin, newRect.height - this._rightMin); - } - } else { - if (newRect.width - this._handlePosition < this._rightMin) { - this._handlePosition = MAX(this._leftMin, newRect.width - this._rightMin); - } - } - return true; - }; - - this._draggesturestart = function(e) { - var offset = uki.dom.offset(this.dom()); - this._posWithinHandle = (e[this._vertical ? 'pageY' : 'pageX'] - offset[this._vertical ? 'y' : 'x']) - this._handlePosition; - return true; - }; - - this._draggesture = function(e) { - this._updatePositionOnDrag(e); - }; - - this._draggestureend = function(e, offset) { - this._updatePositionOnDrag(e); - }; - - this._updatePositionOnDrag = function(e) { - var offset = uki.dom.offset(this.dom()); - this.handlePosition(e[this._vertical ? 'pageY' : 'pageX'] - offset[this._vertical ? 'y' : 'x'] - this._posWithinHandle); - if (this._throttle) { - this._throttleHandler = this._throttleHandler || uki.proxy(function() { - this.layout(); - this._trottling = false; - }, this); - if (this._trottling) return; - this._trottling = true; - setTimeout(this._throttleHandler, this._throttle); - } else { - this.layout(); - } - }; - - - /** - * @function - * @name uki.view.HSplitPane#topPane - */ - /** - * @function - * @name uki.view.HSplitPane#leftPane - */ - this.topPane = this.leftPane = function(pane) { - return this._paneAt(0, pane); - }; - - /** - * @function - * @name uki.view.HSplitPane#bottomPane - */ - /** - * @function - * @name uki.view.HSplitPane#rightPane - */ - this.bottomPane = this.rightPane = function(pane) { - return this._paneAt(1, pane); - }; - - /** - * @function - * @name uki.view.HSplitPane#topChildViews - */ - /** - * @function - * @name uki.view.HSplitPane#leftChildViews - */ - this.topChildViews = this.leftChildViews = function(views) { - return this._childViewsAt(0, views); - }; - - /** - * @function - * @name uki.view.HSplitPane#rightChildViews - */ - /** - * @function - * @name uki.view.HSplitPane#bottomChildViews - */ - this.bottomChildViews = this.rightChildViews = function(views) { - return this._childViewsAt(1, views); - }; - - this._childViewsAt = function(i, views) { - if (views === undefined) return this._panes[i].childViews(); - this._panes[i].childViews(views); - return this; - }; - - this._paneAt = function(i, pane) { - if (pane === undefined) return this._panes[i]; - uki.build.copyAttrs(this._panes[i], pane); - return this; - }; - - this._leftRect = function() { - if (this._vertical) { - return new Rect(this._rect.width, this._handlePosition); - } else { - return new Rect(this._handlePosition, this._rect.height); - } - }; - - this._rightRect = function() { - if (this._vertical) { - return new Rect( - 0, this._handlePosition + this._handleWidth, - this._rect.width, this._rect.height - this._handleWidth - this._handlePosition - ); - } else { - return new Rect( - this._handlePosition + this._handleWidth, 0, - this._rect.width - this._handleWidth - this._handlePosition, this._rect.height - ); - } - }; - - this._resizeChildViews = function() { - this._panes[0].rect(this._leftRect()); - this._panes[1].rect(this._rightRect()); - }; - - this._layoutDom = function(rect) { - Base._layoutDom.call(this, rect); - this._handle.style[this._vertical ? 'top' : 'left'] = this._handlePosition + 'px'; - }; - - this._bindToDom = function(name) { - if (name == 'handleMove') return true; - return Base._bindToDom.call(this, name); - }; - -}); - -/** -* Vertical Split Pane -* -* @author voloko -* @name uki.view.VSplitPane -* @class -* @extends uki.view.HSplitPane -*/ -uki.view.declare('uki.view.VSplitPane', uki.view.HSplitPane, function(Base) { - this._setup = function() { - Base._setup.call(this); - this._vertical = true; - }; -}); - - -uki.Collection.addAttrs(['handlePosition']); - - -/** - * Popup - * - * @author voloko - * @name uki.view.Popup - * @class - * @extends uki.view.Container - */ -uki.view.declare('uki.view.Popup', uki.view.Container, function(Base) { - - this._setup = function() { - Base._setup.call(this); - uki.extend(this, { - _offset: 2, - _relativeTo: null, - _horizontal: false, - _flipOnResize: true, - _defaultBackground: 'theme(popup-normal)' - }); - }; - - this._createDom = function() { - Base._createDom.call(this); - this.hideOnClick(true); - }; - - /** - * @function - * @name uki.view.Popup#offset - */ - /** - * @function - * @name uki.view.Popup#relativeTo - */ - /** - * @function - * @name uki.view.Popup#horizontal - */ - /** - * @function - * @name uki.view.Popup#flipOnResize - */ - uki.addProps(this, ['offset', 'relativeTo', 'horizontal', 'flipOnResize']); - - /** - * @function - * @name uki.view.Popup#hideOnClick - */ - this.hideOnClick = function(state) { - if (state === undefined) return this._clickHandler; - if (state != !!this._clickHandler) { - if (state) { - this._clickHandler = this._clickHandler || uki.proxy(function(e) { - if (uki.dom.contains(this._relativeTo.dom(), e.target)) return; - if (uki.dom.contains(this.dom(), e.target)) return; - this.hide(); - }, this); - uki.dom.bind(doc.body, 'mousedown', this._clickHandler); - uki.dom.bind(root, 'resize', this._clickHandler); - } else { - uki.dom.unbind(doc.body, 'mousedown', this._clickHandler); - uki.dom.unbind(root, 'resize', this._clickHandler); - this._clickHandler = false; - } - } - return this; - }; - - /** - * @function - * @name uki.view.Popup#toggle - */ - this.toggle = function() { - if (this.parent() && this.visible()) { - this.hide(); - } else { - this.show(); - } - }; - - /** - * @function - * @name uki.view.Popup#show - */ - this.show = function() { - this.visible(true); - if (!this.parent()) { - new uki.Attachment( root, this ); - } else { - this.rect(this._recalculateRect()); - this.layout(this._rect); - } - this.trigger('toggle', { source: this }); - }; - - /** - * @function - * @name uki.view.Popup#hide - */ - this.hide = function() { - this.visible(false); - this.trigger('toggle', { source: this }); - }; - - this.parentResized = function() { - this.rect(this._recalculateRect()); - }; - - this._resizeSelf = function(newRect) { - this._rect = this._normalizeRect(newRect); - return true; - }; - - this._layoutDom = function(rect) { - return Base._layoutDom.call(this, rect); - }; - - this._recalculateRect = function() { - if (!this.visible()) return this._rect; - var relativeOffset = uki.dom.offset(this._relativeTo.dom()), - relativeRect = this._relativeTo.rect(), - rect = this.rect().clone(), - attachment = uki.view.top(this), - attachmentRect = attachment.rect(), - attachmentOffset = uki.dom.offset(attachment.dom()), - position = new Point(), - hOffset = this._horizontal ? this._offset : 0, - vOffset = this._horizontal ? 0 : this._offset; - - relativeOffset.offset(-attachmentOffset.x, -attachmentOffset.y); - - if (this._anchors & ANCHOR_RIGHT) { - position.x = relativeOffset.x + relativeRect.width - (this._horizontal ? 0 : rect.width) + hOffset; - } else if (this._anchors & ANCHOR_LEFT) { - position.x = relativeOffset.x - (this._horizontal ? rect.width : 0) - hOffset; - } else { - position.x = relativeOffset.x + ((relativeRect.width - rect.width) >> 1) - hOffset; - } - - if (this._anchors & ANCHOR_BOTTOM) { - position.y = relativeOffset.y + (this._horizontal ? relativeRect.height : 0) - rect.height - vOffset; - } else if (this._anchors & ANCHOR_TOP) { - position.y = relativeOffset.y + (this._horizontal ? 0 : relativeRect.height) + vOffset; - } else { - position.y = relativeOffset.y + ((relativeRect.height - rect.height) >> 1) + vOffset; - } - - return new Rect(position.x, position.y, rect.width, rect.height); - }; -}); - - -uki.each(['show', 'hide', 'toggle'], function(i, name) { - uki.fn[name] = function() { - this.each(function() { this[name](); }); - }; -}); -/** - * Vertical Flow - * Arranges child views verticaly, one after another - * - * @author voloko - * @name uki.view.VFlow - * @class - * @extends uki.view.Container - */ -uki.view.declare('uki.view.VFlow', uki.view.Container, function(Base) { - this.contentsSize = function() { - var value = uki.reduce(0, this._childViews, function(sum, e) { - return sum + (e.visible() ? e.rect().height : 0); - } ); - return new Size( this.contentsWidth(), value ); - }; - - this.hidePartlyVisible = uki.newProp('_hidePartlyVisible'); - - this.resizeToContents = function(autosizeStr) { - this._resizeChildViews(this._rect); - return Base.resizeToContents.call(this, autosizeStr); - } - - this.layout = function() { - return Base.layout.call(this); - }; - - // resize in layout - this._resizeChildViews = function(oldRect) { - var offset = 0, rect, view; - for (var i=0, childViews = this.childViews(); i < childViews.length; i++) { - view = childViews[i]; - view.parentResized(oldRect, this._rect); - view.rect().y = offset; - // view.rect(new Rect(view._rect.x, offset, view._rect.width, view._rect.height)); - if (this._hidePartlyVisible) { - view.visible(view._rect.height + offset <= this._rect.height); - } - if (view.visible()) offset += view._rect.height; - }; - }; - - this.childResized = function() { - this._needsLayout = true; - uki.after(uki.proxy(this._afterChildResized, this)); - }; - - this._contentChanged = this.childResized; - - this._afterChildResized = function() { - this.resizeToContents('height'); - this.parent().childResized(this); - this.layoutIfNeeded(); - }; - -}); - -/** - * Horizontla Flow - * Arranges child views horizontally - * - * @author voloko - * @name uki.view.HFlow - * @class - * @extends uki.view.VFlow - */ -uki.view.declare('uki.view.HFlow', uki.view.VFlow, function(Base) { - this.contentsSize = function() { - var value = uki.reduce(0, this._childViews, function(sum, e) { - return sum + (e.visible() ? e.rect().width : 0); - } ); - return new Size( value, this.contentsHeight() ); - }; - - this._resizeChildViews = function(oldRect) { - var offset = 0, rect, view; - for (var i=0, childViews = this.childViews(); i < childViews.length; i++) { - view = childViews[i]; - view.parentResized(oldRect, this._rect); - view.rect().x = offset; - // view.rect(new Rect(offset, view._rect.y, view._rect.width, view._rect.height)); - if (this._hidePartlyVisible) { - view.visible(view._rect.width + offset <= this._rect.width); - } - if (view.visible()) offset += view._rect.width; - }; - }; - - this._afterChildResized = function() { - this.resizeToContents('width'); - this.parent().childResized(this); - this.layoutIfNeeded(); - }; -}); - - - - -uki.view.toolbar = {}; - -/** -* Toolbar -* -* @author voloko -* @name uki.view.Toolbar -* @class -* @extends uki.view.Container -*/ -uki.view.declare('uki.view.Toolbar', uki.view.Container, function(Base) { - - this.typeName = function() { return 'uki.view.Toolbar'; }; - - this._moreWidth = 30; - - this._setup = function() { - Base._setup.call(this); - this._buttons = []; - this._widths = []; - }; - - /** - * @function - * @name uki.view.Toolbar#buttons - */ - this.buttons = uki.newProp('_buttons', function(b) { - this._buttons = b; - var buttons = uki.build(uki.map(this._buttons, this._createButton, this)).resizeToContents('width'); - this._flow.childViews(buttons); - this._totalWidth = uki.reduce(0, this._flow.childViews(), function(s, v) { return s + v.rect().width; }); - }); - - /** - * @function - * @name uki.view.Toolbar#moreWidth - */ - uki.moreWidth = uki.newProp('_moreWidth', function(v) { - this._moreWidth = v; - this._updateMoreVisible(); - }); - - this._createDom = function() { - Base._createDom.call(this); - - var rect = this.rect(), - flowRect = rect.clone().normalize(), - moreRect = new Rect(rect.width - this._moreWidth, 0, this._moreWidth, rect.height), - flowML = { view: 'HFlow', rect: flowRect, anchors: 'left top right', className: 'toolbar-flow', hidePartlyVisible: true }, - moreML = { view: 'Button', rect: moreRect, anchors: 'right top', className: 'toolbar-button', visible: false, backgroundPrefix: 'toolbar-more-', text: '>>', focusable: false }, - popupML = { view: 'Popup', rect: '0 0', anchors: 'right top', className: 'toolbar-popup', background: 'theme(toolbar-popup)', - childViews: { view: 'VFlow', rect: '0 5 0 0', anchors: 'right top left bottom' } - }; - - this._flow = uki.build(flowML)[0]; - this._more = uki.build(moreML)[0]; - this.appendChild(this._flow); - this.appendChild(this._more); - popupML.relativeTo = this._more; - this._popup = uki.build(popupML)[0]; - - this._more.bind('click', uki.proxy(this._showMissingButtons, this)); - }; - - this._showMissingButtons = function() { - var maxWith = this._flow.rect().width, - currentWidth = 0, - missing = []; - for (var i=0, childViews = this._flow.childViews(), l = childViews.length; i < l; i++) { - currentWidth += childViews[i].rect().width; - if (currentWidth > maxWith) missing.push(i); - }; - var newButtons = uki.map(missing, function(i) { - var descr = { html: childViews[i].html(), backgroundPrefix: 'toolbar-popup-button-' }; - uki.each(['fontSize', 'fontWeight', 'color', 'textAlign', 'inset'], function(j, name) { - descr[name] = uki.attr(childViews[i], name); - }); - return this._createButton(descr); - }, this); - uki('VFlow', this._popup).childViews(newButtons).resizeToContents('width height'); - this._popup.resizeToContents('width height').height(this._popup.height() + 5).toggle(); - }; - - this._updateMoreVisible = function() { - var rect = this._rect; - if (this._more.visible() != rect.width < this._totalWidth) { - this._more.visible(rect.width < this._totalWidth); - var flowRect = this._flow.rect(); - flowRect.width += (rect.width < this._totalWidth ? -1 : 1)*this._moreWidth; - this._flow.rect(flowRect); - } - }; - - this.rect = function(rect) { - var result = Base.rect.call(this, rect); - if (rect) this._updateMoreVisible(); - return result; - }; - - this._createButton = function(descr) { - var rect = this.rect().clone().normalize(); - rect.width = 100; - return uki.extend({ - view: 'Button', rect: rect, focusable: false, align: 'left', - anchors: 'left top', backgroundPrefix: 'toolbar-button-', autosizeToContents: 'width', focusable: false - }, descr); - }; -}); - -}()); -(function() { - var defaultCss = 'position:absolute;z-index:100;-moz-user-focus:none;font-family:Arial,Helvetica,sans-serif;', - reflex = '
'; - - uki.theme.airport = uki.extend({}, uki.theme.Base, { - imagePath: 'http://static.ukijs.org/pkg/0.3.8/uki-theme/airport/i/', - - backgrounds: { - // basic button - 'button-normal': function() { - return new uki.background.LinearGradient({ - startColor: '#FDFEFF', - stops: [ - { pos: 0.15, color: '#F5F7FD' }, - { pos: 0.8, color: '#C9CACF' } - ], - endColor: '#C7CBD2', - innerHTML: reflex, - css: 'border:1px solid #666;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,0.5);' - }); - }, - - 'button-hover': function() { - return new uki.background.LinearGradient({ - startColor: '#FFFFFF', - stops: [ - { pos: 0.7, color: '#D7DAE4' } - ], - endColor: '#D9DEE6', - innerHTML: reflex, - css: 'border:1px solid #666;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,0.5);' - }); - }, - - 'button-down': function() { - return new uki.background.LinearGradient({ - startColor: '#9C9DA1', - stops: [ - { pos: 0.6, color: '#C5C7CD' } - ], - endColor: '#CCCFD6', - css: 'border:1px solid #666;border-radius:3px;box-shadow:inset 0 1px 3px rgba(0,0,0,0.5);' - }); - }, - - 'button-focus': function() { - if (uki.browser.cssBoxShadow() == 'unsupported') { - return new uki.background.CssBox( - 'background:#7594D2;' + (uki.browser.cssFilter() && uki.image.needAlphaFix ? 'filter:Alpha(opacity=70);' : 'opacity:0.7;'), - { inset: '-2 -2', zIndex: -2 } - ); - } - return new uki.background.Css({ - // WebkitTransition: '-webkit-box-shadow 0.2s linear', - boxShadow: '0 0 6px #0244D4', - borderRadius: '3px' - }); - }, - - 'button-disabled': function() { - return new uki.background.Multi( - uki.theme.background('button-normal'), - new uki.background.Css({ color: '#999' }) - ); - }, - - - // checkbox - 'checkbox-normal': function() { - return checkboxBg(18); - }, - - 'checkbox-hover': function() { - return checkboxBg(54); - }, - - 'checkbox-disabled': function() { - return checkboxBg(90); - }, - - 'checkbox-checked-normal': function() { - return checkboxBg(0); - }, - - 'checkbox-checked-hover': function() { - return checkboxBg(36); - }, - - 'checkbox-checked-disabled': function() { - return checkboxBg(72); - }, - - 'checkbox-focus': function() { - if (uki.image.needAlphaFix) { - return new uki.background.CssBox('', - { innerHTML: '
', zIndex: -2 } - ); - } - return new uki.background.CssBox('', - { innerHTML: '
', zIndex: -2 } - ); - }, - - - // radio button - 'radio-normal': function() { - return radioBg(18); - }, - - 'radio-hover': function() { - return radioBg(54); - }, - - 'radio-disabled': function() { - return radioBg(90); - }, - - 'radio-checked-normal': function() { - return radioBg(0); - }, - - 'radio-checked-hover': function() { - return radioBg(36); - }, - - 'radio-checked-disabled': function() { - return radioBg(72); - }, - - 'radio-focus': function() { - if (uki.image.needAlphaFix) return uki.theme.airport.background('checkbox-focus'); - var src = uki.theme.imageSrc('radio-focus'); - return new uki.background.CssBox('', - { innerHTML: '
', zIndex: -2 } - ); - }, - - - - // toolbar button - 'toolbar-button-normal': function() { - return new uki.background.Css('#CCC'); - }, - - 'toolbar-button-hover': function() { - return new uki.background.Css('#E0E0E0'); - }, - - 'toolbar-button-down': function() { - return new uki.background.Css('#AAA'); - }, - - 'toolbar-button-focus': function() { - return new uki.background.Css('#CCC'); - }, - - 'toolbar-popup-button-normal': function() { - return new uki.background.Css({ textAlign: 'left' }); - }, - - 'toolbar-popup-button-down': function() { - return new uki.background.Css({ background: '#AAA', textAlign: 'left' }); - }, - - 'toolbar-popup-button-hover': function() { - return new uki.background.Css({ background: '#4086FF', color: '#FFF', textAlign: 'left', textShadow: 'none' }); - }, - - - // panel - 'popup-normal': function() { - return new uki.background.CssBox('background:#ECEDEE;border-radius:5px;border:1px solid #CCC;box-shadow:0 3px 8px rgba(0,0,0,0.6)'); - }, - - 'panel': function() { - return new uki.background.LinearGradient({ - startColor: '#DEDEDF', - stops: [ - { pos: 0.2, color: '#D4D4D5' }, - { pos: 0.9, color: '#989899' } - ], - endColor: '#989899', - css: 'box-shadow:0 1px 0 rgba(0,0,0,0.5);' - }); - }, - - // text field - 'input': function() { - return new uki.background.CssBox( - 'background:white;border: 1px solid #999;border-top-color:#777;box-shadow:0 1px 0 rgba(255, 255, 255, 0.4), inset 0 1px 2px rgba(0,0,0,0.2);' - ); - }, - - 'input-focus': function() { - if (uki.browser.cssBoxShadow() == 'unsupported') { - return new uki.background.CssBox( - 'background:#7594D2;' + (uki.browser.cssFilter() && uki.image.needAlphaFix ? 'filter:Alpha(opacity=70);' : 'opacity:0.7;'), - { inset: '-2 -2', zIndex: -2 } - ); - } - return new uki.background.Css({ - // WebkitTransition: '-webkit-box-shadow 0.2s linear', - boxShadow: '0 0 6px #0244D4' - }); - }, - - - - // slider - 'slider-handle-normal': function() { - return new uki.background.LinearGradient({ - startColor: '#FFFFFF', - endColor: '#B1CEEA', - innerHTML: sliderPin(), - css: 'border:1px solid #8393A6;border-bottom-color:#687482;box-shadow:0 0 2px rgba(0,0,0,0.5);' - }); - }, - - 'slider-handle-hover': function() { - return new uki.background.LinearGradient({ - startColor: '#DFF6FF', - endColor: '#8AC5F3', - innerHTML: sliderPin(), - css: 'border:1px solid #8393A6;border-bottom-color:#687482;box-shadow:0 0 2px rgba(0,0,0,0.5);' - }); - }, - - 'slider-handle-focus': function() { - if (uki.browser.cssBoxShadow() == 'unsupported') { - return new uki.background.CssBox( - 'background:#7594D2;' + (uki.browser.cssFilter() && uki.image.needAlphaFix ? 'filter:Alpha(opacity=70);' : 'opacity:0.7;'), - { inset: '-2 -2', zIndex: -2 } - ); - } - return new uki.background.CssBox( - 'box-shadow: 0 0 6px #0244D4;', - { zIndex: 2, inset: '1' } - ); - }, - - 'slider-bar': function() { - uki.dom.offset.initializeBoxModel(); - return new uki.background.CssBox( - 'overflow:visible;', - { - inset: uki.dom.offset.boxModel ? '0 2 0 0' : '0 0', - innerHTML: '
' - } - ); - }, - - // list - list: function(rowHeight) { - return new uki.background.Rows(rowHeight, '#EDF3FE'); - }, - - // table - 'table-header': function() { - return new uki.background.LinearGradient({ - startColor: '#FFFFFF', - stops: [ - { pos: 0.8, color: '#e0e0e0' } - ], - endColor: '#EEEEEE', - css: 'border-bottom:1px solid #CCC;' - }); - } - }, - - images: { - checkbox: function() { - var prefix = "checkbox/normal"; - return uki.image(u(prefix + ".png"), "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAABsCAYAAABn5uLmAAAF1UlEQVRYw+2Y3VMTVxjGve9N/4T+CU4vetErpxfauzp1puNFZ3Ckah1jibWOGqhFhYpY8AvBIoygiErwIxAI+UCQhhgkEQwgIQKiIXwJBEKABIJP913dlJNddE8602mrO/ObIee8z8Oe3cnL87JuXZLXJ+vXf/zp519kyjYM7nHwsOtgDrakaLDhy6+3xU30jucgXr2CKsorq7H3yGno8sqwZZtmc9zoWpMP0eUVVdxrcWDHT1k4VVaP/KsWMMe63PAY4UhM5Okzf/znRDp7fEjV/oLjRdUorm5GidHNGhUb2hCcX0azw41NX22Fy+MVP6/GPx7Ed2kZyMi/gtMVFjz2+UE6xqigqgUvQ1GcLa7A9n2Z2K45hGcjU+KahFaXhf1ZhcgrN6Hufoe4RjrGiM46EoxgYCSIvNI70B49jx1pOvj8k+J6ztlL2H04FydLa1F4wyquEbJnlFNSg+eTiyLtvX5kF+mxJ/0UUn84jIo7ZqTsTcexwirhburFfamWdIzRcaGof3whjtXZi8xzlUg7cga7DmQjI68cuaU1uNPoZupIxxj9LDzA3pEwQ2W9A1nCnWULbyjn0l0U3TDLakjHGB08UQyPf07GhesNwnMxIPuiHu39k7J90jFG+46eg3soJMPRN4ETRTdxu6lTcZ90jNEeXS6cAzPckI4x2rn/GIieQFg1kkb27d+m0YGXde/Z1eruBi8yk8ZWF4iVlVeqkTSMkanJgdjKCjekYxt/wz0sx2LckI4xqjKYsLS8zA3pGKMKvSEpI9IxRiVXbyK6tMQN6RijotIriESj3JCOMTpTeAkLkSg3pGOMTuYXYH4xwg3p2J594jeEFxa5IR1jlHE0G3PzC9yQjjE6oDuCUHieG9IxRmn7D4HgefWSRvbF3a3Rgpf/aSP8ZzKk2uutGTImhEw1NNudb8+QS0IfJob8gfjPifT09SN135sMeeu+coYMR1dgb3uETZu3iqGTPq9mbGoWO7R/ZciegWHlDDknpNaC0mtihkzdewijkzPimsSP6dnxDGm2d76uV8qQs4sxjE7P4fTl1xlylzYdgZcz4nrehdJ4hrxYZRPXCMUMORVeEukZCIjBijLkTq0OeqM1niHzhQxJ+1KtYoacEOKuhL2jTzFDmloeMXWKGXJkJsJw2+pkMmSJ3iqrUcyQL6YWZRRXWcQM+atwVF8gKNtXzJDPJxdk9A1P41RxFawPuhT3FTPk4MswN2tmyEBwUTUfMuTfuHg7JCEz4Z2yCUnDGPFM2ash3ZpTNg+kU5yyeVlzyuZlzSmbl7dO2Ty8c8pWi6opWw2qp+x3oXrKfhcfpuz/2rVx48aPUlK+/Ua2MRwYAA93DXpkHsvQazTfb4ibDA4+AREVZjA19PV5UVNbDZutDpmZ6Z/Fjbx9j1WbjI2NCgZmPHnigdOZ0EY8Xe2riiNrmszNhdDQUIfOThf6+73o6HSyRi5Xq1g4MTGKiopyzMxOKxqZTEY8fNiK3t4uLCyEQTrGyOFoFgs7OlyoN9XCaKyRmdhsFvxhb0J3dydGR4fFNdIxRk1N5rjA43GjudmGurpa4fOiuNbW5oDVZhL3vN7ueC3pGCOzxRjfnBWO5XI5hTswCXd2Fz5fr/CGbgtrD9DV9Ujcl2pJxxjVGm+9ecivGRsfFu7CjsZGM0wNRuEILcKx2+H3DzJ1pGOMqm9dFzbCDPRW2oWH6XI5xDukZ5NYQzrGqLLyivAWQjLoKC73AzxstyMUmpLtk44xKisrQTg8LSM4MyEecWioX3GfdOxf2uILwm+c5IZ0jNH5gjMgIpGwaiSN7Nufl58LXt63DDk8/AK8yEwGBp6CiAn/yVOLpGGMvN4eLhMJ0rEd0tORlBHpEjpkW1JGpEvokPakjEiX0CFtSRmRjjGyWExJGZGOMTIaDUkZkY7tkNX6pIxIl9AhryVlRLqEDnk5KSPSJXTI35MyIh07ixScB8FjImlkX9z8/Dzw8u/uZ38Cqx5HdHgrjesAAAAASUVORK5CYII=", u(prefix + ".gif")); - }, - 'checkbox-focus': function() { - return uki.image(u("checkbox/focus.png"), "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABdklEQVRIie2Wv0rDUBSHUxRFRHQRFxWRioTeZHEXVxHqYgaRNrmrj+Ai+AAdi6trH0AQh6K05uYpfBQ934m0EnHQcIuDB+5y7/l9J+dPchMEU2sER8P5VjJY2ExeljY6D8v77dHKbvK4+t3iHD/80aFXzhdLBnPN4/tFBE37vN7qjrbDzO2ZTh6GnbExXRdXl+5zLn74o1O9cOB9xjfY3MmGa8Y+bSGO0vGhSYuT2Lqz2BbnUZpfVBf7nOOn/gQWPRwNMslE0iIyh1HqDiLrTuPMXZqsuI5s3hNQX/Zuq6vcz3v44Y8OPRx4H+UKAmpHevrkCi+ubu5e33660KGHo2WmJ5g2SGpImjzJb+DTIJKJcODB1QBMgTZUakm6dQKghwMPrgbQ+ss00DBqWidA2TNpvPC0DxjzzMiVU1H0a5VI9HDgwZ0EKEdTxk+mo14GMmHCgfcf4I8F8DpF3t8D72+y92+R96+p9/vA/402gzt5Bn8VHu0d2HhIetPffvAAAAAASUVORK5CYII="); - }, - radio: function() { - var prefix = "radio/normal"; - return uki.image(u(prefix + ".png"), "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAABsCAYAAABn5uLmAAAGiklEQVRYw+2X/08TdxjH/RP6Z+2XJWeyzMTMjGkkEkmsog4VzSGiA0FUQAPIUHEqMC0i3Rgt66Sj8q0wkG9tgV4RAflij7b0C198du8Ozn6uPe66uGSJXvLO5fk8r+cNP/TeeT579vxXj8nmNTxzvuVbnEtCy8ASyZJqnKOvadLg8HKNDp/Y61khf2id3r8nWahxjj44VZN66xjX2OmmRTFMsY0tVaEPDnySSZnJZrhjdoqzyyEKRTc1BQ485hijyiY739btIv/ahm6BxxxjdO2BRXDPvqOlQExWR1c/fbnvO/riq2/jb9SJffCYY4x+uNNCc/4oowNHTtOpK9WUX9EQf6NWMphjjPIrHpNvOcLImF9O5Q1/UFVzd/yNWslgjjE6V1JHk2/DjPJK66j8sY0qJBO8USsZzDFGOQWVQtfIaxqfC8my9E7Q1dpnVFJnjr9RJ/bBY44xyj57lS+//5yGXwd1CzzmGKMMI2/IzLkotvdPkVMIaAoceMwl/Si/yTrNZZ7gydztpu4pUVXogwOv+pl8fSib23fomMhfryPTn+Nkd/tlocY5+uA0P1yOyzBw+zP5vfsPC3v3Z9IHHRZwjv6eT/yx2QYN9r5XfJdzRJBECRJwjr6mibWzn7N29Yujbi+tBtdoa+u9LNQ4Rx+cqskvVgdnsfeQPxCkza0tVaEPDnxy4JtMhua2DnHFv0obm5uaAgcec2zom8x8t3OI1jc2dAs85hijB03NwuLySlpG4DHHGN2pb6DY+nrawhxjdLv2PkVjsbSFOcbo+q0aCkdjaQtzjFFRaYXgm52jtUhUt8Bjjg3/wqv802etFApHdAs85hgjI88bzuUXilOCj4JrYU2BA4+5pB9lzpk87vzFQvJMeykQWlMV+uDAq34m2TmnuWM534t36x+RyzMlfV8hWahxjj44zQ83I8NoOJJt5LOOGoWsbCPJkmqco/+pJyR2RFPfPN/sXMDOSDtCjfM0dkhB7PMskxiKUeKDGufoa+yQLq7RPknLgShtSsunmtAHBz7FDjlo+LHtL/GttGiuS/msJXDgMccYVZle8lZpMQjFtnQLPOYYo4rGTsG3uEpBaWPdkb1nQNodD27vkAfjdWIfPObYZbS+nVYjm4wOZCl2SKlWMphLWkZXpM0+Ual2SCWTtIwW3GqkRWnlTdT50rvMDolayWCOMcorvS+8ml6gOTEqyzHkoZLtHRJv1Il98JhjjE4XVvF1TzpoZiWiW+Axp0jIMsPx/Jti/8SstD+HNQUOPOaSfpRZZ4q4E/k3qGdMoOmlkKrQBwde9TPJzOE5bKs3655Q1/A0uReCslDjHH1wuhIyI/ssn3H0rCC9SdY/9eeE/NgJ2SsloV9KRPaWHaPedBJyUYxo3LIj2gmZzi1bNSHb+ybTumWDT5mQnjd+5hatJfApE1J5g9ajlAmpvEHrUcqEVN6g9ShlQjrG3jC3aC2BT5mQVY3WtG7Z4FUT0jog6Lplg9s1IY/z1+nXvqldb9nog9OVkEXVTdTy0sPcslHj/HNCfsTH6x00eL3jvFeYEASfi3aEOn7u1XHLdrkGOZd7SJyfn6FwBLfsLVmocY4+OFWTweEebnRsgNbWQoyBUuiDA59kYrPZDL19nWIoFNjVZEfgwGOOMXrxwsK7XKO6THYEHnOMkcXSKqyuikl/1e0ZoQnXUPyt/G/BY44xet76NOkvjow6aWi4VxZqJYM5xqjp54dJUE+PPUlKBnOM0U8P70qNTUYOxwuy2ztkoVYymGOMamurhaWleakZlbW8PE+/236jdos5/kad2AePOcaosvIGb7W20fp6WLfAY44x4qXbcum1YnH2jZei0YCmwIHnU92yL18u4K6VFdPMzCSFw6Kq0AcHXvUzycs7w124cE5sanpE09MTFAyuyEKNc/TBaX64RqPRkJt7kpck5Oaeog9CfZJH/3NCfqSEdG8nZESRkJHthHRrJeTwcD83Pj6oKyHBgU+ZkP1Oh5SQQZ0JGSTwSQnZ1WXjPZ6JtBISPOYYo85OixAIrKZlBB5zyqhNy2RHmGOMWs2mf2WEOcboqakhKf30CHOM0aPH9cLKuwUmAbUEHnOM0b17NbzdbksrIcFjjjEqKyszVFffln7RPl0JCQ485pJ+lOXlZVxNzW2anZ3eNSHRBwde9TMpKStC3IpmczP5fB4mIVHjHH1wmh8uAv1KUQFfVHxJKCoupA+6JOA8ZeD/L5+/ASNtA71vTxEVAAAAAElFTkSuQmCC", u(prefix + ".gif")); - }, - 'radio-focus': function() { - return uki.image(u("radio/focus.png"), "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABcElEQVRIx92VP0oEMRTGt9ADeAERq21E8ACLNp7AUrRbWdzdDDa6IBhnM5YqaCPCiiewyPzBA1gK1oIsHsNCNL9owBl1HYWM6MBjSPK+7+W99yWp1X7jm5dyrLUVTwTyYqotdb0dJjOdUM86Y8w86/jhX5q82TwZF1JPrkd6rtNPF40tiTBb7qps1Rlj5lnHD39wpchbMp4WKmmIKF0x/+0gSg8DlZ0KlZ05Y8w8669+DXAjgzjy7m68IPrJmoiS/Y29S907vr7fGdw+hOfDJ2eMmWcdP/zBfRqEGpKm3TnkKj3aPLi6kYO7x7fERWMdP/xfcAZveN71hEbZWpKu2RGgUcRFs0HIxODhgS8XADXQMGpK2l/t/KNMbLkMHh74cgGQHKqgcdT2O+TOwIGHB758AKNrpIc6ig0ta+Cs2gwPfLkAHB6rbyPBn5A7Aw8PfP8sgPceeFeR93Pg/SR7v4u836aVvAeVvGiVvMl/7nsGaBHOn+3vxvEAAAAASUVORK5CYII="); - } - }, - - imageSrcs: { - x: function() { - return [u("x.gif"), "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII="]; - }, - 'splitPane-horizontal': function() { - return [u("splitPane/horizontal.gif"), "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAICAYAAAA870V8AAAAFUlEQVQIW2MoLy//zwAEYJq6HGQAAJuVIXm0sEPnAAAAAElFTkSuQmCC"]; - }, - 'splitPane-vertical': function() { - return [u("splitPane/vertical.gif"), "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAADCAYAAABfwxXFAAAAE0lEQVQIHWMsLy//z0AOYMSnEwAIngTLoazFLgAAAABJRU5ErkJggg=="]; - } - }, - - templates: { - 'table-header-cell': function() { - return new uki.theme.Template( - '
${data}
'); - }, - - 'table-cell': function() { - return new uki.theme.Template( - '
${data}
'); - }, - - 'table-header-cell-asc': function() { - return new uki.theme.Template( - '
${data}
'); - }, - - 'table-header-cell-desc': function() { - return new uki.theme.Template( - '
${data}
'); - } - }, - - doms: { - 'resizer': function(height) { - var template = new uki.theme.Template('position:absolute;width:5px;top:0;right:-3px;height:${height}px;cursor:col-resize;cursor:ew-resize;z-index:101;background:url(' + uki.theme.imageSrc('x') + ')'), - node = uki.createElement('div', template.render({height:height})); - - if (!node.style.cursor || window.opera) node.style.cursor = 'e-resize'; - return node; - }, - 'splitPane-vertical': function(params) { - var commonVerticalStyle = 'cursor:row-resize;cursor:ns-resize;z-index:200;overflow:hidden;', - handle = params.handleWidth == 1 ? - uki.createElement('div', - defaultCss + 'width:100%;height:5px;margin-top:-2px;' + - commonVerticalStyle + 'background: url(' + uki.theme.imageSrc('x') + ')', - '
') : - uki.createElement('div', - defaultCss + 'width:100%;height:' + (params.handleWidth - 2) + 'px;' + - 'border: 1px solid #CCC;border-width: 1px 0;' + commonVerticalStyle + - 'background: url(' + uki.theme.imageSrc('splitPane-vertical') + ') 50% 50% no-repeat;'); - if (!handle.style.cursor || window.opera) handle.style.cursor = 'n-resize'; - return handle; - }, - - 'splitPane-horizontal': function(params) { - var commonHorizontalStyle = 'cursor:col-resize;cursor:ew-resize;z-index:200;overflow:hidden;', - handle = params.handleWidth == 1 ? - uki.createElement('div', - defaultCss + 'height:100%;width:5px;margin-left:-2px;' + - commonHorizontalStyle + 'background: url(' + uki.theme.imageSrc('x') + ')', - '
') : - uki.createElement('div', - defaultCss + 'height:100%;width:' + (params.handleWidth - 2) + 'px;' + - 'border: 1px solid #CCC;border-width: 0 1px;' + commonHorizontalStyle + - 'background: url(' + uki.theme.imageSrc('splitPane-horizontal') + ') 50% 50% no-repeat;'); - if (!handle.style.cursor || window.opera) handle.style.cursor = 'e-resize'; - return handle; - - } - }, - styles: { - base: function() { - return 'font-family:Arial,Helvetica,sans-serif;'; - }, - 'label': function() { - return 'font-size:12px;'; - }, - 'button': function() { - return 'color:#333;text-align:center;font-weight:bold;text-shadow:0 1px 0 rgba(255,255,255,0.6);'; - }, - 'input': function() { - return 'font-size:12px;'; - } - } - }); - - function u(url) { - return uki.theme.airport.imagePath + url; - } - - function checkboxBg (offset) { - var src = uki.theme.imageSrc('checkbox'); - return new uki.background.CssBox('', - { innerHTML: '
' } - ); - } - - function radioBg (offset) { - var src = uki.theme.imageSrc('radio'); - return new uki.background.CssBox('', - { innerHTML: '
' } - ); - } - - function sliderPin () { - return '
'; - } - - uki.theme.airport.backgrounds['slider-handle-down'] = uki.theme.airport.backgrounds['slider-handle-hover']; - uki.theme.airport.backgrounds['toolbar-popup'] = uki.theme.airport.backgrounds['popup-normal']; - uki.theme.airport.backgrounds['toolbar-popup-button-disabled'] = uki.theme.airport.backgrounds['toolbar-popup-button-normal']; - - uki.theme.register(uki.theme.airport); -})(); diff --git a/app/assets/stylesheets/admin.css b/app/assets/stylesheets/admin.css deleted file mode 100644 index 28c0a9c..0000000 --- a/app/assets/stylesheets/admin.css +++ /dev/null @@ -1,54 +0,0 @@ -table.user-table span.user-login { - font-size: 110%; - line-height: 90%; - font-weight: bold; - letter-spacing: 1pt; -} - - -table.user-table span.user-name { - font-size: 90%; -} - -table.user-table span.user-email { - color: #555; - font-size: 90%; -} - -.fieldWithErrors { - background-color: #A40000; - display: table; - padding: 2px; -} - -#errorExplanation { - border: 2px solid #A40000; - padding: 5px; - margin-bottom: 20px; - background-color: #f0f0f0; -} - -#errorExplanation h2 { - text-align: left; - font-weight: bold; - padding: 5px 5px 5px 15px; - font-size: 12px; - margin: -7px; - background-color: #A40000; - color: #fff; -} - -#errorExplanation p { - color: #333; - margin-bottom: 0; - padding: 5px; -} - -#errorExplanation ul { - margin-bottom: 0; -} - -#errorExplanation ul li { - font-size: 12px; - list-style: square; -} \ No newline at end of file diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css deleted file mode 100644 index fc3f853..0000000 --- a/app/assets/stylesheets/application.css +++ /dev/null @@ -1,10 +0,0 @@ -/* - * This is a manifest file that'll automatically include all the stylesheets available in this directory - * and any sub-directories. You're free to add application-wide styles to this file and they'll appear at - * the top of the compiled file, but it's generally better to create a new file per style scope. - *= require_self - *= require screen - *= require admin - *= require modalbox - *= require cve -*/ \ No newline at end of file diff --git a/app/assets/stylesheets/cve.css b/app/assets/stylesheets/cve.css deleted file mode 100644 index bebb317..0000000 --- a/app/assets/stylesheets/cve.css +++ /dev/null @@ -1,23 +0,0 @@ -.cvename { - font-weight: bold; -} - -.cve-new { - color: #A40000; -} - -.cve-assigned { - color: #4E9A06; -} - -.cve-nfu { - color: #204A87; -} - -.cve-later { - color: #5C3566; -} - -.cve-invalid { - color: #CCC; -} \ No newline at end of file diff --git a/app/assets/stylesheets/login.css b/app/assets/stylesheets/login.css deleted file mode 100644 index cdcec08..0000000 --- a/app/assets/stylesheets/login.css +++ /dev/null @@ -1,91 +0,0 @@ -#login-form { - width: 489px; - height: 295px; - background: url(/assets/login-bg.png); - margin: auto; - color: white; -} - -#login-form div { - padding-top: 60px; - padding-left: 40px; - padding-right: 40px; - padding-bottom: 20px; - text-align: left; -} - -#login-form h1 { - font-size: 120%; - margin-top: 0; - padding-top: 0; -} - -#login-form label { - font-size: 90%; - letter-spacing: 1px; - text-transform: lowercase; -} - -#login-form p { - margin-top: .2em; - margin-bottom: .2em; -} - -#login-form input#login, #login-form input#password { - font-size: 180%; - border: 1px solid #4C3E61; - background-color: #D3CFE5; - width: 100%; -} - -#login-form input#submit { - font-size: 130%; -} - -body { - background-color: #D3CFE5; - font-family: Lucida Grande, Verdana, Arial, Helvetica, sans-serif; - font-size: 95%; -} - -small.error { - color: #A40000; -} - -p.submit { - text-align: right; -} - -/* Centerization fix */ -body, html { - height: 99%; -} - -#outer { - height: 100%; - overflow: visible; - width: 100%; -} - -#outer[id] { - display: table; - position: static; -} - -#middle { - position: absolute; - top: 50%; - text-align: center; -} - -#middle[id] { - display: table-cell; - vertical-align: middle; - position: static; - text-align: center; -} - -#inner { - position: relative; - top: -50%; -} \ No newline at end of file diff --git a/app/assets/stylesheets/modalbox.css b/app/assets/stylesheets/modalbox.css deleted file mode 100644 index 0a2cbf4..0000000 --- a/app/assets/stylesheets/modalbox.css +++ /dev/null @@ -1,122 +0,0 @@ -/* - modalbox.css - - Modalbox project - - Created by Andrew Okonetchnikov. - Copyright 2006-2010 okonet.ru. All rights reserved. - - Licensed under MIT license. -*/ - -#MB_overlay { - position: absolute; - margin: auto; - top: 0; left: 0; - width: 100%; height: 100%; - z-index: 9999; - border: 0; - background-color: #000!important; -} -#MB_overlay[id] { position: fixed; } - -#MB_windowwrapper { - position:absolute; - top:0; - width:100%; -} - -#MB_window { - position:relative; - margin-left:auto; - margin-right:auto; - top:0; - left:0; - border: 0 solid; - text-align: left; - z-index: 10000; -} -#MB_window[id] { position: relative; } - -#MB_frame { - position: relative; - background-color: #EFEFEF; - height: 100%; -} - -#MB_header { - margin: 0; - padding: 0; -} - -#MB_content { - position: relative; - padding: 6px .75em; - overflow: auto; -} - -#MB_caption { - font: bold 100% "Lucida Grande", Arial, sans-serif; - text-shadow: #FFF 0 1px 0; - padding: .5em 2em .5em .75em; - margin: 0; - text-align: left; -} - -#MB_close { - display: block; - position: absolute; - right: 5px; top: 4px; - padding: 2px 3px; - font-weight: bold; - text-decoration: none; - font-size: 13px; -} -#MB_close:hover { - background: transparent; -} - -#MB_loading { - padding: 1.5em; - text-indent: -10000px; - background: transparent url(../assets/spinner.gif) 50% 0 no-repeat; -} - -/* Color scheme */ -#MB_window { - background-color: #EFEFEF; - color: #000; - - -webkit-box-shadow: 0 0 64px #000; - -moz-box-shadow: #000 0 0 64px; - box-shadow: 0 0 64px #000; -} - #MB_frame { - padding-bottom: 4px; - - -webkit-border-bottom-left-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-bottomright: 4px; - - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; - } - - #MB_content { border-top: 1px solid #F9F9F9; } - - #MB_header { - background-color: #DDD; - border-bottom: 1px solid #CCC; - } - #MB_caption { color: #000 } - #MB_close { color: #777 } - #MB_close:hover { color: #000 } - - -/* Alert message */ -.MB_alert { - margin: 10px 0; - text-align: center; -} diff --git a/app/assets/stylesheets/screen.css.erb b/app/assets/stylesheets/screen.css.erb deleted file mode 100644 index fe4add9..0000000 --- a/app/assets/stylesheets/screen.css.erb +++ /dev/null @@ -1,662 +0,0 @@ -body { - border-left: 6px solid #5B4A73; - height: 100% !important; - margin: 0; - padding: 0; - font-family: Verdana, Arial, Helvetica, sans-serif; - font-size: .85em; - color: #333; -} - -html { - margin: 0; - padding: 0; - background: url(<%= asset_path 'line.png' %>) repeat-y; - background-repeat: repeat-y; -} - -a img { - border: none !important; -} - -a, a:visited { - color: #4C3E61; -} - -a:hover { - color: #609317; -} - -/* Menu */ -#top-menu { - background-color: #4C3E61; - font-size: 10px; - position: relative; - padding: 0; - height: 21px; - margin-left: -7px; - padding-left: 7px; -} - -#top-menu li, #top-menu #loggedas { - color: #ddd; - line-height: 21px; - margin-right: 4px; -} - -#top-menu li { - float: left; - list-style-type: none; - margin: 0; - padding: 0; - white-space: nowrap; -} - -#top-menu li a { - color: #999; - font-weight: normal; - padding:4px 5px; -} - -#top-menu li a:hover { - color: #fff; - text-decoration: none; -} - -#top-menu ul { - margin: 0; - padding: 0; -} - -#top-menu a { - color: #fff; - margin-right: 8px; - font-weight: bold; -} - -#top-menu #loggedas { - float: right; - margin-right: 0.5em; - color: #fff; -} - -#menu li a { - background-color: #5B4A73; - font-weight: normal; - padding:4px 8px 6px; - opacity: 0.6; -} - -div#menu li { - float:left; - list-style-type:none; - margin: 0px 2px 0px 0px; - padding: 0px 0px 0px 0px; - white-space:nowrap; -} - -div#menu li a { - display: block; - color: #fff; - text-decoration: none; - font-weight: bold; - margin: 0; - padding: 4px 10px 4px 10px; -} - -#menu li a:hover { - background: #5B4A73; - color: #fff; - opacity: 1; -} - -#menu li a.selected, -body#new #menu li a.new, -body#requests #menu li a.requests, -body#drafts #menu li a.drafts, -body#archive #menu li a.archive, -body#secunia #menu li a.secunia, -body#cve #menu li a.cve { - background: #fff; - color: #555; - opacity: 1; -} - -div#menu { - height: 42px; - background: #4C3E61 url(<%= asset_path 'menubg.png' %>) repeat-x; - position: relative; - bborder-bottom: 3px solid #4C3E61; -} - -div#menu img.logo { - float: right; - border: 0 !important; -} - -div#menu ul { - position: absolute; - bottom: 0; - margin: 0; - padding: 0; - padding-left: 1em; - margin-right: 260px; - list-style: none; -} - -div#menu #search { - position: absolute; - right: 200px; - font-size: 80%; - margin-top: 17px; - color: white; -} - -div#menu #search input { - font-size: 80%; -} - -/* Infobar */ -div#infobar { - background-color: #D3CFE5; - color: #4C3E61; - font-size: 95%; - padding: 0.2em; - padding-left: 1.5em; - border-bottom: 1px solid #8875B0; -} - -div#infobar span { - padding-right: 3em; -} - -/* Flash notice stuff */ -div#flash.notice { - padding: 0.2em; - font-size: 95%; - padding-left: 1.5em; - background-color: #729FCF; - border-bottom: 1px solid #1F3F7E; - color: #1F3F7E; -} - -div#flash.error { - padding: 0.2em; - font-size: 95%; - padding-left: 1.5em; - margin: 0; - background-color: #A40000; - border: none; - border-bottom: 1px solid #A40000; - color: white; -} - -/* Sidebar */ -div#right { - float: right; - width: 252px; - /*dbackground: #FCAF3E url(img/orangebg.png) repeat-y;*/ - cursor: default; -} - -br.clear { - clear: both; -} - -/* Content */ -div#content { - padding: 1em; - border-right: 1px solid #B2AAC2; - padding-bottom: 40px; -} - -div#content h1 { - margin-top: -.3em; - margin-left: -.2em; - margin-bottom: .3em; - color: #4C3E61; - font-size: 15pt; -} - -h2 { - color: #3E3550; - font-size: 13pt; -} - -.red { - color: #A40000; -} - -.spelling-error { - border-bottom: 1px red dotted; -} - -/* Floating */ -img.left, div.left, span.left { - float: left; -} - -.oneemright { - margin-right: 1em; -} - -.oneembottom { - margin-bottom: 1em; -} - -div#footer { - border-left: 6px solid #5B4A73; - - color: #4C3E61; - border-top: 3px solid #5B4A73; - background-color: #D3CFE5; - - position: fixed; - bottom: 0; - height: 1.5em; - - font-size: 85%; - margin-top: .3em; - margin-left: -6px; - width: 100%; - padding: 0.4em; -} - -div#footer a { - color: #4C3E61; -} - -div#footer span { - padding-right: 1.5em; -} - -span.hspacer { - padding-right: 3em; -} - -/** Tables **/ -table { - border-spacing: 0; - width: 100%; -} - -tr { - border-spacing: .3em; -} - -.odd { - background-color: #D3CFE5; -} - -.odd-bright { - background-color: #DEDBEF; -} - -tr.invalid, tr.invalid td { - background-color: #a40000 !important; - color: white; -} - -td { - margin: 0; - border: none; - padding: .2em; -} - -table#bugtable, table.list { - font-size: 80%; -} - -table#bugtable td, table.list td { - border-bottom: 1px solid #8875B0; - background-color: #DEDBEF; -} - -table.code-preserve-ws code { - white-space: pre-wrap; - display: block; - margin-bottom: .5em; -} - -/** boxes **/ -div.box, div.legend { - padding: .4em; - background-color: #D3CFE5; - border-bottom: 1px solid #8875B0; - margin-bottom: 0.5em; -} - -div.error { - border: 1px solid #A40000; - padding: .5em; - margin: .5em; - color: #A40000; - background-color: white; -} - -div.error .actions { - border-top: 1px solid #A40000; - padding: .25em; - margin-top: .5em; - text-align: right; - padding-bottom: 0; -} - -div.error .actions form.button-to div { - display: inline; -} - -div.legend { - margin-top: 1em; -} - -div.legend img { - vertical-align: middle; -} - -div.legend h3 { - margin: 0; -} - -div.legend span.column { - float: left; - display: inline-block; - width: 19%; - margin-right: 0.9%; - border-right: 1px solid #8875B0; -} - -div.legend span.last { - margin-right: 0 !important; - border-right: none !important; -} - -div.box h2 { - color: #3E3550; - font-size: 120%; - margin: 0; -} - -div.box h2.boxtitle img { - /*vertical-align: middle;*/ -} - -div.box span.toolbar { - float: right; - margin-right: 5px; - margin-top: 2px; -} - -div.box p { - margin: 0; -} - -div.box .box-actions { - margin-top: 1em; - padding: .25em; - border-top: 1px solid #8875B0; - text-align: right; -} - -.pmargin p { - margin-bottom: .5em !important; -} - -.w40em { - width: 40em; -} - -.w100p { - width: 100%; -} - -/** comment list **/ -ul#commentslist { - list-style-type: none; - padding: 0; - margin-bottom: 0; -} - -li.comment { - border-bottom: 1px solid #8875B0; - padding: .25em; -} - -.comment-header { - float: left; - text-align: center; -} - -.comment-toolbox { - float: right; -} - -.comment-text { - margin-left: 1.5em; -} - -.comment-text p { - margin-bottom: .5em !important; -} - -.comment-author { - font-size: smaller; - clear: both; - text-align: right; - padding-bottom: .3em; -} - -.comment-number { - float: left; - color: gray; -} - -#addcommentsubmit { - margin-right: 0; -} - -/** popups **/ -div.popup { - background-color: #8875B0; - opacity: .9; - padding: .2em; -} - -/** leftright **/ -div#right { - width: 40%; - position: fixed; - top: 100px; - right: 10px; -} - -div#left { - width: 55%; -} - -span.left { - float: left; -} - -table.padcells td { - padding: 0.3em; - padding-left: 0.5em; - padding-right: 0.5em; -} - -table.swap .odd { - background-color: #E6E5EE; -} - -table.centercells th { - text-align: center; -} - -tr.addbug { - background-color: #D2DEBF; -} - -tr.delbug { - background-color: #AD9095; -} - -div.progress { - display: none; - position: absolute; - top: 10%; - left: 45%; -} - -/** Buttons **/ -div.buttons { - padding: 0.5em; - background-color: #D3CFE5; - border-bottom: 1px solid #8875B0; - margin-bottom: 0.5em; -} - -a.button, input.button { - border-top: 1px solid #8875B0; - border-left: 1px solid #8875B0; - border-right: 1px solid #5B4A73; - border-bottom: 1px solid #5B4A73; - padding: .2em; - background: #4C3E61 url(<%= asset_path 'menubg.png' %>) repeat-x; - font-size: 90%; - color: white; - text-decoration: none; - margin: .4em; - margin-right: .5em; -} - -a.button:hover { - color: #2B1C4A; -} - -a.button:active { - border-right: 1px solid #8875B0; - border-bottom: 1px solid #8875B0; - border-top: 1px solid #5B4A73; - border-left: 1px solid #5B4A73; -} - -a.button img { - vertical-align: top; -} - -/** Form controls **/ -form p, form ul#commentslist { - padding: .5em; - margin-bottom: .3em; - margin-top: .3em; -} - -form.l label { - width: 15em; - float: left; -} - -form.popupform p { - padding: 0; - margin: 0; - margin-bottom: .3em; -} - -input.text { - border: 1px solid #4C3E61; - /*background-color: #D3CFE5;*/ -} - -textarea.nice, input.nice { - border: 1px solid #4C3E61; - width: 100%; -} - -.largetext { - font-size: 150%; -} - -.hugetext { - font-size: 180%; -} - -.floatright { - float: right; -} - -.greytext { - color: #555753; -} - -.smalltext { - font-size: 80%; -} - -form.button_to { - display: inline-block; -} - -/** diff **/ -.diff_in, .diff_out { - padding: 0.1em; -} - -.diff_in { - background-color: #A54F5D; -} - -.diff_out { - background-color: #7E9557; -} - -.docked-right { - position: fixed; - top: 40px; - right: 1em; - bottom: 40px; - width: inherit; - margin-left: 1em; -} - -/** tables **/ -table.glsamaker-table { -} - -table.glsamaker-table p { - margin-bottom: .5em; - margin-top: .5em; -} - -table.glsamaker-table th { - border-bottom: 2px solid #4C3E61; - border-right: 1px dotted #4C3E61; - padding: .5em; -} - -table.glsamaker-table th.left { - border-right: 1px solid #4C3E61; - border-bottom: 1px solid #4C3E61; - text-align: left; -} - -table.glsamaker-table tr.restricted, table.glsamaker-table tr.restricted a, .legend .red { - color: #a40000 !important; -} - -table.glsamaker-table td { - padding: .5em; - padding-top: .4em; - padding-bottom: .4em; - border-right: 1px dotted #4C3E61; - border-bottom: 1px solid #4C3E61; -} - -/** search **/ -span.match { - color: #4C3E61; - font-weight: bold; -} - -.nowrap { - white-space: nowrap; -} \ No newline at end of file diff --git a/app/controllers/admin/index_controller.rb b/app/controllers/admin/index_controller.rb deleted file mode 100644 index ac48bfb..0000000 --- a/app/controllers/admin/index_controller.rb +++ /dev/null @@ -1,6 +0,0 @@ -class Admin::IndexController < ApplicationController - before_filter :admin_access_required - - def index - end -end diff --git a/app/controllers/admin/templates_controller.rb b/app/controllers/admin/templates_controller.rb deleted file mode 100644 index 1e5de16..0000000 --- a/app/controllers/admin/templates_controller.rb +++ /dev/null @@ -1,85 +0,0 @@ -class Admin::TemplatesController < ApplicationController - before_filter :admin_access_required - - # GET /admin/templates - # GET /admin/templates.json - def index - @templates = Template.all - - respond_to do |format| - format.html # index.html.erb - format.json { render :json => @templates } - end - end - - # GET /admin/templates/1 - # GET /admin/templates/1.json - def show - @template = Template.find(params[:id]) - - respond_to do |format| - format.html # show.html.erb - format.json { render :json => @template } - end - end - - # GET /admin/templates/new - # GET /admin/templates/new.json - def new - @template = Template.new - - respond_to do |format| - format.html # new.html.erb - format.json { render :json => @template } - end - end - - # GET /admin/templates/1/edit - def edit - @template = Template.find(params[:id]) - end - - # POST /admin/templates - # POST /admin/templates.json - def create - @template = Template.new(params[:template].permit(:name, :text, :target, :enabled)) - - respond_to do |format| - if @template.save - format.html { redirect_to admin_template_path(@template), :notice => 'Template was successfully created.' } - format.json { render :json => @template, :status => :created, :location => @template } - else - format.html { render :action => "new" } - format.json { render :json => @template.errors, :status => :unprocessable_entity } - end - end - end - - # PUT /admin/templates/1 - # PUT /admin/templates/1.json - def update - @template = Template.find(params[:id]) - - respond_to do |format| - if @template.update_attributes(params[:template].permit(:name, :text, :target, :enabled)) - format.html { redirect_to admin_template_path(@template), :notice => 'Template was successfully updated.' } - format.json { head :ok } - else - format.html { render :action => "edit" } - format.json { render :json => @template.errors, :status => :unprocessable_entity } - end - end - end - - # DELETE /admin/templates/1 - # DELETE /admin/templates/1.json - def destroy - @template = Template.find(params[:id]) - @template.destroy - - respond_to do |format| - format.html { redirect_to admin_templates_url } - format.json { head :ok } - end - end -end diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb deleted file mode 100644 index d43628d..0000000 --- a/app/controllers/admin/users_controller.rb +++ /dev/null @@ -1,71 +0,0 @@ -class Admin::UsersController < ApplicationController - before_filter :admin_access_required - - def index - @users = User.where('id > 0') - end - - def show - @user = User.find(params[:id]) - - if @user.id == 0 - flash[:error] = "That's the system account." - redirect_to(admin_users_path) - return - end - end - - def create - @user = User.new(params[:user].permit([:login, :name, :email, :access, :disabled, :jefe])) - - if @user.save - redirect_to(admin_user_path(@user), :notice => 'User was successfully created.') - else - render :action => "new" - end - end - - def new - @user = User.new - end - - def edit - @user = User.find(params[:id]) - - if @user.id == 0 - flash[:error] = "That's the system account." - redirect_to(admin_users_path) - return - end - end - - def update - @user = User.find(params[:id]) - - if @user.id == 0 - flash[:error] = "That's the system account." - redirect_to(admin_users_path) - return - end - - if @user.update_attributes(params[:user].permit([:login, :name, :email, :access, :disabled, :jefe])) - redirect_to(admin_user_path(@user), :notice => 'User was successfully updated.') - else - render :action => "edit" - end - end - - def destroy - @user = User.find(params[:id]) - - if @user.id == 0 - flash[:error] = "That's the system account." - redirect_to(admin_users_path) - return - end - - @user.destroy - flash[:notice] = "User was successfully deleted." - redirect_to(admin_users_path) - end -end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb deleted file mode 100644 index e839aeb..0000000 --- a/app/controllers/application_controller.rb +++ /dev/null @@ -1,32 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2009-2011 Alex Legler -# Copyright (C) 2009 Pierre-Yves Rofes -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -# Filters added to this controller apply to all controllers in the application. -# Likewise, all the methods added will be available for all controllers. - -class ApplicationController < ActionController::Base - helper :all # include all helpers, all the time - protect_from_forgery # See ActionController::RequestForgeryProtection for details - - include Authentication - include Authorization - include ApplicationHelper - - before_filter :login_required - - protected - def log_error(error) - caller[0] =~ /`([^']*)'/ and where = $1 - logger.error "[#{where}] #{error.class}: #{error.message}" - logger.info error.backtrace.join("\n") - #ExceptionNotifier::Notifier.exception_notification(request.env, error).deliver - end -end diff --git a/app/controllers/bug_controller.rb b/app/controllers/bug_controller.rb deleted file mode 100644 index 83672bb..0000000 --- a/app/controllers/bug_controller.rb +++ /dev/null @@ -1,39 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2009-2011 Alex Legler -# Copyright (C) 2009 Pierre-Yves Rofes -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -class BugController < ApplicationController - def bug - begin - @bug = Glsamaker::Bugs::Bug.load_from_id(params[:id].to_i) - rescue SocketError => e - log_error e - @bug = "down" - rescue ArgumentError => e - log_error e - @bug = nil - end - - render :layout => false - end - - def history - begin - @bug = Glsamaker::Bugs::Bug.load_from_id(params[:id].to_i) - rescue SocketError => e - @bug = "down" - rescue ArgumentError => e - @bug = nil - end - - render :layout => false - end - -end diff --git a/app/controllers/bugs_controller.rb b/app/controllers/bugs_controller.rb deleted file mode 100644 index 5e5c6d9..0000000 --- a/app/controllers/bugs_controller.rb +++ /dev/null @@ -1,59 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2011 Alex Legler -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -# BugsController handles bugs attached to GLSAs -class BugsController < ApplicationController - layout false - - def new - begin - @glsa = Glsa.find(Integer(params[:glsa_id])) - @bug = Bug.new - rescue Exception - @glsa = nil - end - end - - def create - @glsa = Glsa.find(params[:glsa_id].to_i) - return unless check_object_access!(@glsa) - - unless @glsa.nil? - @added_bugs = [] - Bugzilla::Bug.str2bugIDs(params[:addbugs]).map do |bugid| - begin - @added_bugs << Glsamaker::Bugs::Bug.load_from_id(bugid) - rescue Exception => e - # Silently ignore invalid bugs - end - end - - begin - @bugs_text = render_to_string :partial => '/glsa/edit_bug_row', :collection => @added_bugs, :as => :bug - rescue Exception => e - @error = "Error: #{e.message}" - log_error e - end - else - @error = "Cannot find GLSA" - end - - respond_to do |format| - format.html { render :status => 500 } - format.js - end - end - - def destroy - end - - def show - end -end diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb deleted file mode 100644 index aa56e6a..0000000 --- a/app/controllers/comments_controller.rb +++ /dev/null @@ -1,76 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2011 Alex Legler -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -# CommentController handles comments made for GLSAs -class CommentsController < ApplicationController - layout false - - def new - begin - @glsa = Glsa.find(Integer(params[:glsa_id])) - @comment = Comment.new - rescue Exception => e - @glsa = nil - end - end - - def create - @glsa = Glsa.find(params[:glsa_id].to_i) - - unless @glsa.nil? - comment_data = params[:newcomment].permit([:text, :rating]) - comment = nil - - if comment_data['text'].strip != '' - comment = @glsa.comments.build(comment_data) - comment.user = current_user - - if comment.save - Glsamaker::Mail.comment_notification(@glsa, comment, current_user) - - if @glsa.is_approved? and @glsa.approvals.count == @glsa.rejections.count + 2 - Glsamaker::Mail.approval_notification(@glsa) - end - else - @error = comment.errors - render - return - end - else - @error = "Error: Comment text is empty." - render - return - end - - begin - @comment_number = @glsa.comments.count - @css_class = @comment_number.odd? ? 'odd-bright' : '' - @comment_text = render_to_string :partial => "/glsa/comment", :object => comment - rescue Exception => e - log_error e - @error = "Error: #{e.message}" - end - else - @error = "Error: Cannot find GLSA" - end - - respond_to do |format| - format.html { render :status => 500 } - format.js - end - end - - def show - end - - def destroy - end - -end diff --git a/app/controllers/cve_controller.rb b/app/controllers/cve_controller.rb deleted file mode 100644 index 203dfad..0000000 --- a/app/controllers/cve_controller.rb +++ /dev/null @@ -1,323 +0,0 @@ -class CveController < ApplicationController - include ApplicationHelper - include CveHelper - - before_filter :check_access, :except => [:info, :general_info, :references, :packages, :comments, :changes] - - def index - @pageID = 'cve' - end - - def list - @pageID = 'cve' - - condition = view_mask_to_condition(params[:view_map].to_i) - @cves = Cve.where(condition).limit(1000).order('cve_id DESC') - - respond_to do |format| - format.html - format.json { - x = @cves.map {|cve| [cve.id, cve.colorize(:cve_id), CGI.escapeHTML(cve.summary), cve.state]} - render :text => x.to_json } - end - end - - def bug_package - cve_nums = params[:cves].split(',').map{|cve| Integer(cve)} - logger.debug { "File new Bug; CVElist: " + cve_nums.inspect } - - cves = cve_nums.map {|c| Cve.find(c) } - cpes = cves.map {|c| c.cpes.map{|cpe| cpe.product } }.flatten.uniq - - package_hints = cves.map{|c| c.package_hints }.flatten.uniq.sort - logger.debug { "CPE Products: " + cpes.inspect } - logger.debug { "Package hints: " + package_hints.inspect } - - logger.debug { {:package_hints => package_hints}.to_json } - render :json => {:package_hints => package_hints}.to_json - rescue Exception => e - log_error e - render :text => e.message, :status => 500 - end - - def bug_preview - cve_nums = params[:cves].split(',').map{|cve| Integer(cve)} - logger.debug { "File new Bug (preview); CVElist: " + cve_nums.inspect } - - @cve_ids = cve_nums.map {|c| Cve.find(c).cve_id } - @cve_txt = Cve.concat(cve_nums) - @package = params[:package] - @maintainers = Glsamaker::Portage.get_maintainers(params[:package]) - render :layout => false - rescue Exception => e - log_error e - render :text => e.message, :status => 500 - end - - def bug - cve_nums = params[:cves].split(',').map{|cve| Integer(cve)} - logger.debug { "File new Bug (final); CVElist: " + cve_nums.inspect } - - cves = cve_nums.map {|c| Cve.find(c) } - - data = { - :product => 'Gentoo Security', - :component => params[:bug_type] == 'true' ? 'Vulnerabilities' : 'Kernel', - :summary => params[:bug_title], - :assignee => 'security@gentoo.org' - } - - cc = [] - if params[:cc_maint] == 'true' - cc += Glsamaker::Portage.get_maintainers(params[:package]) - end - - cc += params[:cc_custom].split(',') - data[:cc] = cc.compact.delete_if {|i| i == ''} - - comment = "" - if params[:add_cves] == 'true' - comment += Cve.concat(cve_nums) - end - - if params[:add_comment] == 'true' - comment += "\n" if params[:add_cves] - comment += params[:comment] - end - data[:comment] = comment - - whiteboard = "" - if params[:bug_type] == 'true' # If the bug is not a kernel issue - whiteboard += "%s %s" % [params[:wb_1], params[:wb_2]] - whiteboard += " %s" % params[:wb_ext] unless params[:wb_ext] == "" - else - whiteboard = params[:wb_ext] - end - - data[:severity] = whiteboard_to_severity(whiteboard) - data[:version] = 'unspecified' - data[:status] = 'IN_PROGRESS' - - bugnr = -1 - begin - bugnr = Bugzilla.file_bug(data) - Bugzilla.update_bug(bugnr, {:whiteboard => whiteboard}) - rescue Exception => e - log_error e - raise "Filing the bug failed. Check if the accounts in CC actually exist." - end - - logger.info "Filed bug #{bugnr} on behalf of user #{current_user.login}." - - cves.each {|cve| cve.assign(bugnr, current_user, :file) } - - render :text => 'ok' - rescue Exception => e - log_error e - render :text => e.message, :status => 500 - end - - def assign_preview - bug_id = Integer(params[:bug]) - cves = params[:cves].split(',').map{|cve| Integer(cve)} - logger.debug { "Assign Bug: #{bug_id} CVElist: " + cves.inspect } - - cve_ids = cves.map {|c| Cve.find(c).cve_id } - logger.debug { cve_ids.inspect } - - @cve_txt = Cve.concat(cves) - @bug = Glsamaker::Bugs::Bug.load_from_id(bug_id) - @summary = cveify_bug_title(@bug.summary, cve_ids) - - render :layout => false - rescue Exception => e - log_error e - render :text => e.message, :status => 500 - end - - def assign - bug_id = Integer(params[:bug]) - cves = params[:cves].split(',').map{|cve| Integer(cve)} - logger.debug { "Assign Bug: #{bug_id} CVElist: " + cves.inspect } - - if params[:comment] or params[:summary] - bug = Glsamaker::Bugs::Bug.load_from_id(bug_id) - cve_ids = cves.map {|c| Cve.find(c).cve_id } - changes = {} - - changes[:comment] = Cve.concat(cves) if params[:comment] == 'true' - changes[:summary] = cveify_bug_title(bug.summary, cve_ids) if params[:summary] == 'true' - Bugzilla.update_bug(bug_id, changes) - end - - cves.each {|cve_id| Cve.find(cve_id).assign(bug_id, current_user, :assign) } - - render :text => "ok" - rescue Exception => e - log_error e - render :text => e.message, :status => 500 - end - - def new - @cve = Cve.create(cve_id: params[:cve_id], summary: params[:summary], state: 'NEW') - render :text => "ok" - rescue Exception => e - log_error e - respond_to do |format| - format.html { flash.now[:error] = 'Filing the CVE failed. Is this a duplicate?' } - format.js { - raise 'Filing the CVE failed. Is this a dupliate?' - render :text => e.message, :status => 500 - } - end - end - - def nfu - @cves = params[:cves].split(',').map{|cve| Integer(cve)} - logger.debug { "NFU CVElist: " + @cves.inspect + " Reason: " + params[:reason] } - - @cves.each do |cve_id| - Cve.find(cve_id).nfu(current_user, params[:reason]) - end - - render :text => "ok" - rescue Exception => e - log_error e - render :text => e.message, :status => 500 - end - - def note - @cves = params[:cves].split(',').map{|cve| Integer(cve)} - logger.debug { "Note CVElist: " + @cves.inspect + " Note: " + params[:note] } - - @cves.each do |cve_id| - Cve.find(cve_id).add_comment(current_user, params[:note]) - end - - render :text => "ok" - rescue Exception => e - log_error e - render :text => e.message, :status => 500 - end - - def invalid - @cves = params[:cves].split(',').map{|cve| Integer(cve)} - logger.debug { "Invalid CVElist: " + @cves.inspect + " Reason: " + params[:reason] } - - @cves.each do |cve_id| - Cve.find(cve_id).invalidate(current_user, params[:reason]) - end - - render :text => "ok" - rescue Exception => e - log_error e - render :text => e.message, :status => 500 - end - - def later - @cves = params[:cves].split(',').map{|cve| Integer(cve)} - logger.debug { "LATER CVElist: " + @cves.inspect + " Reason: " + params[:reason] } - - @cves.each do |cve_id| - Cve.find(cve_id).later(current_user, params[:reason]) - end - - render :text => "ok" - rescue Exception => e - log_error e - render :text => e.message, :status => 500 - end - - # Popup methods - def info - @cve = Cve.where(cve_id: params[:id]).first - fail ActionController::RoutingError, 'Not Found' unless @cve - - respond_to do |wants| - wants.html {} - wants.json {} - end - end - - def general_info - @cve = Cve.where(:cve_id => params[:cve_id]).first - - render :layout => false - rescue Exception => e - log_error e - render :text => e.message, :status => 500 - end - - def references - @cve = Cve.where(:cve_id => params[:cve_id]).first - raise "Cannot find CVE" if @cve == nil - - render :layout => false - rescue Exception => e - log_error e - render :text => e.message, :status => 500 - end - - def packages - @cve = Cve.where(:cve_id => params[:cve_id]).first - raise "Cannot find CVE" if @cve == nil - - @package_hints = @cve.package_hints - - logger.debug @package_hints.inspect - - render :layout => false - rescue Exception => e - log_error e - render :text => e.message, :status => 500 - end - - def comments - @cve = Cve.where(:cve_id => params[:cve_id]).first - raise "Cannot find CVE" if @cve == nil - - render :layout => false - rescue Exception => e - log_error e - render :text => e.message, :status => 500 - end - - def changes - @cve = Cve.where(:cve_id => params[:cve_id]).first - raise "Cannot find CVE" if @cve == nil - - render :layout => false - rescue Exception => e - log_error e - render :text => e.message, :status => 500 - end - - def actions - @cve = Cve.where(:cve_id => params[:cve_id]).first - raise "Cannot find CVE" if @cve == nil - - render :layout => false - rescue Exception => e - log_error e - render :text => e.message, :status => 500 - end - - def mark_new - @cve = Cve.where(:cve_id => params[:cve_id]).first - - @cve.mark_new(current_user) - render :text => "ok" - rescue Exception => e - log_error e - render :text => e.message, :status => 500 - end - - protected - def check_access - if current_user.access < 2 - deny_access "User has no access to the CVEtool" - return false - end - end - -end diff --git a/app/controllers/glsa_controller.rb b/app/controllers/glsa_controller.rb deleted file mode 100644 index 84012b6..0000000 --- a/app/controllers/glsa_controller.rb +++ /dev/null @@ -1,562 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2010-11 Alex Legler -# Copyright (C) 2009 Pierre-Yves Rofes -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -# GLSA controller -class GlsaController < ApplicationController - def requests - @pageID = "requests" - @pageTitle = "GLSA requests" - @glsas = Glsa.where(:status => 'request').order('updated_at DESC') - end - - def drafts - @pageID = "drafts" - @pageTitle = "GLSA drafts" - @glsas = Glsa.where(:status => 'draft').order('updated_at DESC') - end - - def archive - @pageID = "archive" - @pageTitle = "GLSA archive" - - respond_to do |format| - format.html { - @month = (params[:month] || Date.today.month).to_i - @year = (params[:year] || Date.today.year).to_i - - month_start = Date.new(@year, @month, 1) - if @month == 12 - month_end = DateTime.new(@year + 1, 1, 1, 23, 59, 59) -1 - else - month_end = DateTime.new(@year, @month + 1, 1, 23, 59, 59) - 1 - end - - @glsas = Glsa.where(:status => 'release', :first_released_at => month_start..month_end).order('updated_at DESC') - } - format.js { - @month = params[:view]['month(2i)'].to_i - @year = params[:view]['month(1i)'].to_i - - month_start = Date.new(@year, @month, 1) - month_end = nil - - if @month == 12 - month_end = DateTime.new(@year + 1, 1, 1, 23, 59, 59) -1 - else - month_end = DateTime.new(@year, @month + 1, 1, 23, 59, 59) - 1 - end - - @glsas = Glsa.where(:status => 'release', :first_released_at => month_start..month_end).order('updated_at DESC') - @table = render_to_string :partial => "glsa_row", :collection => @glsas, :as => :glsa, :locals => { :view => :drafts } - } - end - end - - def new - @pageID = "new" - @pageTitle = "New GLSA" - - # TODO: Straight-to-draft editing - render :action => "new-request" - return - - if params[:what] == "request" - render :action => "new-request" - elsif params[:what] == "draft" - render :action => "new-draft" - else - render - end - end - - def create - if params[:what] == "request" - begin - glsa = Glsa.new_request(params[:title], params[:bugs], params[:comment], params[:access], (params[:import_references].to_i == 1), current_user) - - Glsamaker::Mail.request_notification(glsa, current_user) - - flash[:notice] = "Successfully created GLSA #{glsa.glsa_id}" - redirect_to :action => "requests" - rescue Exception => e - log_error e - flash.now[:error] = e.message - render :action => "new-request" - end - end - end - - def show - @glsa = Glsa.find(params[:id]) - return unless check_object_access!(@glsa) - @rev = params[:rev_id].nil? ? @glsa.last_revision : @glsa.revisions.find_by_revid(params[:rev_id]) - @pageTitle = "GLSA #{@glsa.glsa_id} (#{@rev.title})" - - if @rev == nil - flash[:error] = "Invalid revision ID" - redirect_to :action => "show" - return - end - - respond_to do |wants| - wants.html { render } - wants.xml { } - wants.txt { render } - end - end - - def download - @glsa = Glsa.find(params[:id]) - return unless check_object_access!(@glsa) - @rev = params[:rev_id].nil? ? @glsa.last_revision : @glsa.revisions.find_by_revid(params[:rev_id]) - - if @rev == nil - flash[:error] = "Invalid revision ID" - redirect_to :action => "show" - return - end - - text = nil - respond_to do |wants| - wants.xml do - text = render_to_string(:action => :show, :format => 'xml') - send_data(text, :filename => "glsa-#{@glsa.glsa_id}.#{params[:format]}") - end - - wants.txt do - text = render_to_string(:template => 'glsa/_email_headers.txt.erb', :format => 'txt') - text += render_to_string(:action => :show, :format => 'txt') - render :text => text - end - - wants.html do - render :text => "Cannot download HTML format. Pick .xml or .txt" - return - end - end - end - - def edit - @glsa = Glsa.find(params[:id]) - return unless check_object_access!(@glsa) - @rev = @glsa.last_revision - @pageTitle = "Edit GLSA #{@glsa.glsa_id}" - - set_up_editing - end - - def update - @glsa = Glsa.find(params[:id]) - return unless check_object_access!(@glsa) - @rev = @glsa.last_revision - - if @glsa.nil? - flash[:error] = "Unknown GLSA ID" - redirect_to :action => "index" - return - end - - # GLSA object - # The first editor is submitter, we assume he edits the description during that - if @glsa.submitter.nil? and params[:glsa][:description].strip != "" - @glsa.submitter = current_user - @glsa.status = "draft" if @glsa.status == "request" - end - - @glsa.restricted = (params[:glsa][:restricted] == "confidential") - - # Force update - @glsa.touch - - revision = Revision.new - revision.revid = @glsa.next_revid - revision.glsa = @glsa - revision.user = current_user - revision.title = params[:glsa][:title] - revision.synopsis = params[:glsa][:synopsis] - revision.access = params[:glsa][:access] - revision.severity = params[:glsa][:severity] - revision.product = params[:glsa][:product] - revision.description = params[:glsa][:description] - revision.background = params[:glsa][:background] - revision.impact = params[:glsa][:impact] - revision.workaround = params[:glsa][:workaround] - revision.resolution = params[:glsa][:resolution] - - unless revision.save - flash[:error] = "Errors occurred while saving the Revision object: #{revision.errors.full_messages.join ', '}" - set_up_editing - render :action => "edit" - return - end - - unless @glsa.save - flash[:error] = "Errors occurred while saving the GLSA object" - set_up_editing - render :action => "edit" - return - end - - # Bugs - bugzilla_warning = false - - if params[:glsa][:bugs] - bugs = params[:glsa][:bugs].map {|bug| bug.to_i } - - bugs.uniq.sort.each do |bug| - begin - b = Glsamaker::Bugs::Bug.load_from_id(bug) - - revision.bugs.create!( - :bug_id => bug, - :title => b.summary, - :whiteboard => b.status_whiteboard, - :arches => b.arch_cc.join(', ') - ) - rescue ActiveRecord::RecordInvalid => e - flash[:error] = "Errors occurred while saving a bug: #{e.record.errors.full_messages.join ', '}" - set_up_editing - render :action => "edit" - return - rescue Exception => e - log_error e - # In case of bugzilla errors, just keep the bug # - revision.bugs.create( - :bug_id => bug - ) - bugzilla_warning = true - end - end - end - - logger.debug "Packages: " + params[:glsa][:package].inspect - - # Packages - packages = params[:glsa][:package] || [] - packages.each do |package| - logger.debug package.inspect - next if package[:atom].strip == '' - - begin - revision.packages.create!(package.permit([:atom, :comp, :version, :arch, :automatic, :my_type, :slot])) - rescue ActiveRecord::RecordInvalid => e - flash[:error] = "Errors occurred while saving a package: #{e.record.errors.full_messages.join ', '}" - set_up_editing - render :action => "edit" - return - end - end - - # References - unless params[:glsa][:reference].nil? - refs = params[:glsa][:reference].sort { |a, b| a[:title] <=> b[:title] } - refs.each do |reference| - logger.debug reference.inspect - next if reference[:title].strip == '' - - # Special handling: Add CVE URL automatically - if reference[:title].strip =~ /^CVE-\d{4}-\d{4}/ and reference[:url].strip == '' - reference[:url] = "https://nvd.nist.gov/vuln/detail/#{reference[:title].strip}" - end - - begin - revision.references.create(reference.permit([:title, :url])) - rescue ActiveRecord::RecordInvalid => e - flash[:error] = "Errors occurred while saving a reference: #{e.record.errors.full_messages.join ', '}" - set_up_editing - render :action => "edit" - return - end - end - end - - # Comments - @glsa.comments.each do |comment| - comment.read = params["commentread-#{comment.id}"] == "true" - comment.save - end - - # Sending emails - Glsamaker::Mail.edit_notification(@glsa, rev_diff(@glsa, @glsa.revisions[-2], revision), current_user) - - flash[:notice] = "Saving was successful. #{'NOTE: Bugzilla integration is not available, only plain bug numbers.' if bugzilla_warning}" - redirect_to :action => 'show', :id => @glsa - - end - - def prepare_release - @glsa = Glsa.find(params[:id]) - return unless check_object_access!(@glsa) - @pageTitle = "Releasing GLSA #{@glsa.glsa_id}" - - if current_user.access < 2 - deny_access "Tried to prepare release" - return - end - - if @glsa.status == 'request' - flash[:error] = 'You cannot release a request. Draft the advisory first.' - redirect_to :action => "show", :id => @glsa - return - end - - if @glsa.restricted - flash[:error] = 'You cannot release a confidential draft. Make it public first.' - redirect_to :action => "show", :id => @glsa - return - end - - @rev = @glsa.last_revision - - @comments_override = (current_user.is_el_jefe? and params[:override_approvals].to_i == 1) || false - end - - def release - @glsa = Glsa.find(params[:id]) - return unless check_object_access!(@glsa) - @pageTitle = "Releasing GLSA #{@glsa.glsa_id}" - - if current_user.access < 2 - deny_access "Tried to release" - return - end - - if @glsa.status == 'request' - flash[:error] = 'You cannot release a request. Draft the advisory first.' - redirect_to :action => "show", :id => @glsa - return - end - - if @glsa.restricted - flash[:error] = 'You cannot release a confidential draft. Make it public first.' - redirect_to :action => "show", :id => @glsa - return - end - - @rev = @glsa.last_revision - begin - if current_user.is_el_jefe? - @glsa.release! - else - @glsa.release - end - - @glsa.invalidate_last_revision_cache - - if params[:email] == '1' - with_format('txt') do - Glsamaker::Mail.send_text( - render_to_string({:template => 'glsa/show.txt.erb', :layout => false}).html_safe, - "[ GLSA #{@glsa.glsa_id} ] #{@rev.title}", - current_user, - false - ) - end - end - rescue GLSAReleaseError => e - flash[:error] = "Internal error: #{e.message}. Cannot release advisory." - redirect_to :action => "show", :id => @glsa - return - end - - # ugly hack, but necessary to switch back to html - @real_format = 'html' - render(:formats => [:html], :layout => 'application') - end - - def finalize_release - @glsa = Glsa.find(params[:id]) - @pageTitle = "Released GLSA #{@glsa.glsa_id}" - - if params[:close_bugs] == '1' - message = "GLSA #{@glsa.glsa_id}" - with_format(:txt) do - message = render_to_string :partial => 'close_msg' - end - - @glsa.close_bugs(message) - end - - # ugly hack, but necessary to switch back to html - @real_format = 'html' - render(:formats => [:html], :layout => 'application') - end - - def diff - @glsa = Glsa.find(params[:id]) - return unless check_object_access!(@glsa) - @pageTitle = "Comparing GLSA #{@glsa.glsa_id}" - - rev_old = @glsa.revisions.find_by_revid(params[:old]) - rev_new = @glsa.revisions.find_by_revid(params[:new]) - - @diff = with_format(:xml) { rev_diff(@glsa, rev_old, rev_new) } - end - - def update_cache - @glsa = Glsa.find(params[:id]) - return unless check_object_access!(@glsa) - @rev = @glsa.last_revision - - @rev.update_cached_bug_metadata - - flash[:notice] = "Successfully updated all caches." - if params[:redirect] - redirect_to params[:redirect] - else - redirect_to :action => 'show', :id => @glsa unless params[:no_redirect] - end - rescue Exception => e - log_error e - flash[:notice] = "Could not update caches: #{e.message}" - if params[:redirect] - redirect_to params[:redirect] - else - redirect_to :action => 'show', :id => @glsa unless params[:no_redirect] - end - end - - def destroy - if !current_user.is_el_jefe? - deny_access "Cannot delete draft as non-admin user" - end - - @glsa = Glsa.find(Integer(params[:id])) - @glsa.destroy - flash[:notice] = "GLSA successfully deleted." - redirect_to :controller => :index - end - - def import_references - begin - if params[:go].to_s == '1' - glsa = Glsa.find(Integer(params[:id])) - return unless check_object_access!(glsa) - refs = [] - - params[:import][:cve].each do |cve_id| - cve = Cve.find_by_cve_id cve_id - refs << {:title => cve.cve_id, :url => cve.url} - end - - refs = refs.sort { |a, b| a[:title] <=> b[:title] } - - glsa.add_references refs - - flash[:notice] = "Imported #{refs.count} references." - redirect_to :action => "show", :id => glsa.id - return - else - @glsa = Glsa.find(Integer(params[:id])) - return unless check_object_access!(@glsa) - @cves = @glsa.related_cves - end - rescue Exception => e - render :text => "Error: #{e.message}", :status => 500 - log_error e - return - end - - render :layout => false - end - - protected - def set_up_editing - # Packages - @rev.vulnerable_packages.build(:comp => "<", :slot => "*", :arch => "*") if @rev.vulnerable_packages.length == 0 - @rev.unaffected_packages.build(:comp => ">=", :slot => "*", :arch => "*") if @rev.unaffected_packages.length == 0 - - # References - if params.has_key? :glsa and params[:glsa].has_key? :reference - @references = [] - params[:glsa][:reference].each do |reference| - @references << Reference.new(reference) - end - elsif @rev.references.length == 0 - @references = [Reference.new] - else - @references = @rev.references - end - - # Bugs - if params.has_key? :glsa and params[:glsa].has_key? :bugs - @bugs = [] - params[:glsa][:bugs].each do |bug| - @bugs << Bug.new(:bug_id => bug) - end - else - @bugs = @rev.bugs - end - - # Packages - if params.has_key? :glsa and params[:glsa].has_key? :package - @unaffected_packages = [] - @vulnerable_packages = [] - params[:glsa][:package].each do |package| - if package[:my_type] == 'vulnerable' - @vulnerable_packages << Package.new(package) - elsif package[:my_type] == 'unaffected' - @unaffected_packages << Package.new(package) - end - end - else - @unaffected_packages = @rev.unaffected_packages - @vulnerable_packages = @rev.vulnerable_packages - end - - @templates = {} - GLSAMAKER_TEMPLATE_TARGETS.each do |target| - @templates[target] = Template.where(:target => target).all - end - end - - - def rev_diff(glsa, rev_old, rev_new, format = :unified, context_lines = 3) - @glsa = glsa - old_text = "" - - unless rev_old.nil? - @rev = rev_old - old_text = Glsamaker::XML.indent( - render_to_string( - :template => 'glsa/_glsa.xml.builder', - :locals => {:glsa => @glsa, :rev => @rev}, - :layout => 'none' - ), - {:indent => 2, :maxcols => 80} - ) - end - - new_text = "" - - unless rev_new.nil? - @rev = rev_new - new_text = Glsamaker::XML.indent( - render_to_string( - :template => 'glsa/_glsa.xml.builder', - :locals => {:glsa => @glsa, :rev => @rev}, - :layout => 'none' - ), - {:indent => 2, :maxcols => 80} - ) - end - - diff = "" - begin - diff = Glsamaker::Diff.diff(old_text, new_text, format, context_lines) - rescue Exception => e - diff = "Error in diff provider. Cannot provide diff." - log_error e - end - - diff - end -end diff --git a/app/controllers/index_controller.rb b/app/controllers/index_controller.rb deleted file mode 100644 index 2420092..0000000 --- a/app/controllers/index_controller.rb +++ /dev/null @@ -1,65 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2009-2011 Alex Legler -# Copyright (C) 2009 Pierre-Yves Rofes -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -# Index controller -class IndexController < ApplicationController - skip_before_filter :login_required, :only => [:error] - - def index - @my_drafts = Glsa.where(:status => 'draft', :submitter => current_user.id).order("updated_at DESC").limit(10) - @pageTitle = "Welcome" - end - - def error - if params[:type] == "user" - render :template => 'index/error-user', :layout => 'notice' - elsif params[:type] == "disabled" - render :template => 'index/error-disabled', :layout => 'notice' - elsif params[:type] == "access" - render :template => 'index/error-access', :layout => 'notice' - else - render :template => 'index/error-system', :layout => 'notice' - end - end - - def about - @pageTitle = "About GLSAMaker 2" - end - - def profile - @user = current_user - @prefs = @user.preferences - end - - def update - @user = current_user - @prefs = @user.preferences - - preferences = {:own_ready => false, :own_comment => false, :edit => false, :new_req => false, :not_me => false} - - unless params[:preferences] == nil - %w[own_ready own_comment edit new_req not_me].each do |notification| - preferences[notification.to_sym] = params[:preferences][notification] == '1' - end - end - - @user.preferences[:mail] ||= {} - @user.preferences[:mail] = preferences - if @user.save - flash[:notice] = "Successfully updated your profile" - redirect_to :action => "index" - else - flash[:error] = "Could not update your profile" - render :action => "profile" - end - end - -end diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb deleted file mode 100644 index 55c6594..0000000 --- a/app/controllers/search_controller.rb +++ /dev/null @@ -1,37 +0,0 @@ -class SearchController < ApplicationController - def index - end - - def results - search = ThinkingSphinx.search(params[:q], :max_matches => 1000, :per_page => 1000) - search.context[:panes] << ThinkingSphinx::Panes::ExcerptsPane - - @results = {} - search.each do |result| - klass = result.class.to_s - @results[klass] = [] unless @results.include? klass - @results[klass] << result - end - - if @results.include? 'Revision' - @results['Glsa'] = [] unless @results['Glsa'] - - @results['Revision'].each do |rev| - @results['Glsa'] << rev.glsa - end - - @results['Glsa'].uniq! - end - - # Filter search results - if @results.include? 'Glsa' - @results['Glsa'].delete_if do |result| - not check_object_access(result) - end - end - rescue Riddle::ConnectionError => e - @error = true - rescue Riddle::ResponseError => e - @error = true - end -end diff --git a/app/controllers/tools_controller.rb b/app/controllers/tools_controller.rb deleted file mode 100644 index b1ead08..0000000 --- a/app/controllers/tools_controller.rb +++ /dev/null @@ -1,86 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2009-2011 Alex Legler -# Copyright (C) 2009 Pierre-Yves Rofes -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -# Tools controller -class ToolsController < ApplicationController - layout false - - # Provides information for the 'file new request' page - def bugs_ajax_info - if params[:bugs] == nil - render :text => "No bug given", :status => 500 - return - end - - bug_ids = Bugzilla::Bug.str2bugIDs(params[:bugs]) - - @bugs = [] - bug_ids.each do |bug_id| - begin - @bugs << Bugzilla::Bug.load_from_id(bug_id.to_i) - rescue Exception => e - @bugs << "Ignoring #{bug_id} #{e.message}" - end - end - - buginfo = render_to_string :template => 'tools/ajaxbugs', :layout => false - - # Generating a description - @bugs.delete_if {|i| i.is_a? String} - suggestion = nil - - if @bugs.length == 1 - @text = @bugs[0].summary - suggestion = render_to_string :template => 'tools/ajaxdescr', :layout => false - else - @atoms = [] - @bugs.each do |bug| - matchdata = /([\w-]+)\/([\w-]+)(-([\w.]+))?/.match(bug.summary) - - unless matchdata.nil? - category = matchdata[1] - package = matchdata[2].gsub(/-+?$/, '') - - @atoms << "#{category}/#{package}" - end - end - - @atoms.uniq! - - if @atoms.length > 0 - @text = @atoms.join(', ') + ": Multiple vulnerabilities" - suggestion = render_to_string :template => 'tools/ajaxdescr', :layout => false - end - end - - suggestion ||= "(no suggestion available)" - - render :json => {"buginfo" => buginfo, "title" => suggestion} - end - - def background - render :layout => false - end - - def template - @target = params[:template][:target] - - if GLSAMAKER_TEMPLATE_TARGETS.include? @target - begin - @template = Template.find(params[:template][:id]) - rescue ActiveRecord::RecordNotFound - @error = "Cannot find template" - end - else - @error = "Invalid target" - end - end -end diff --git a/app/helpers/admin/index_helper.rb b/app/helpers/admin/index_helper.rb deleted file mode 100644 index 64c6fee..0000000 --- a/app/helpers/admin/index_helper.rb +++ /dev/null @@ -1,2 +0,0 @@ -module Admin::IndexHelper -end diff --git a/app/helpers/admin/templates_helper.rb b/app/helpers/admin/templates_helper.rb deleted file mode 100644 index 6f30e51..0000000 --- a/app/helpers/admin/templates_helper.rb +++ /dev/null @@ -1,6 +0,0 @@ -module Admin::TemplatesHelper - # Generates a list of targets - def target_list - GLSAMAKER_TEMPLATE_TARGETS.map{|x| [x.titleize, x]} - end -end diff --git a/app/helpers/admin/users_helper.rb b/app/helpers/admin/users_helper.rb deleted file mode 100644 index 142839f..0000000 --- a/app/helpers/admin/users_helper.rb +++ /dev/null @@ -1,18 +0,0 @@ -module Admin::UsersHelper - def access_string(lvl) - case lvl - when 0 - "Contributor" - when 1 - "Padawan" - when 2 - "Full member" - when 3 - "Confidential member" - end - end - - def access_list - [0, 1, 2, 3].map{|x| [access_string(x), x]} - end -end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb deleted file mode 100644 index 68194e7..0000000 --- a/app/helpers/application_helper.rb +++ /dev/null @@ -1,168 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2009-11 Alex Legler -# Copyright (C) 2006-07 Jean-Philippe Lang -# Copyright (C) 2008 Robert Buchholz and Tobias Heinlein -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -# Methods added to this helper will be available to all templates in the application. -module ApplicationHelper - # Same as Rails' simple_format helper without using paragraphs - def simple_format_without_paragraph(text) - text.to_s. - gsub(/\r\n?/, "\n"). # \r\n and \r -> \n - gsub(/\n\n+/, "

"). # 2+ newline -> 2 br - gsub(/([^\n]\n)(?=[^\n])/, '\1
') # 1 newline -> br - end - - # shamelessly stolen from the old cvetools.py - # Extracts all CVEs from a string into an array - def get_bug_cves(str) - cve_group_all = /[ (]*CVE-(\d{4})([-,(){}|, \d]+)/ - cve_group_split = /(\d{4})(?:\D|$)/ - - bug_cves = [] - - str.scan(cve_group_all).each do |m| - m[1].scan(cve_group_split).each do |n| - bug_cves << "CVE-%s-%s" % [m[0], n[0]] - end - end - - bug_cves - end - - # Groups an array of CVE names into groups - def bugs_unify_cvenames(cves) - cve_r = /CVE-(\d{4})-(\d+)/ - - years = {} - cves.uniq.each do |cve| - cve_r =~ cve - years[$1] ||= [] - years[$1] << $2 - end - - title = "" - years.keys.sort.each do |year| - title += "CVE-%s" % year - if years[year].size == 1 - title += "-%s," % years[year].first - else - title += "-{%s}," % years[year].sort.join(',') - end - end - - title[0, title.length - 1] - end - - # Updates a bug string with the cve_ids - def cveify_bug_title(summary, cve_ids) - cve_str = bugs_unify_cvenames(get_bug_cves(summary) + cve_ids) - summary = summary.gsub(/[ (]*CVE-(\d{4})([-,(){}|, \d]+)/, '') - summary.gsub!(/\(?CVEs? requested\)?/, '') - "#{summary} (#{cve_str})" - end - - # Returns the appropriate severity setting for a given whiteboard string - def whiteboard_to_severity(wb) - return 'normal' if wb.length < 2 - - ev = wb[0..1] - case ev - when 'A0', 'B0' - 'blocker' - when 'A1', 'C0' - 'critical' - when 'A2', 'B1', 'C1' - 'major' - when 'A3', 'B2', 'C2' - 'normal' - when 'A4', 'B3', 'B4', 'C3' - 'minor' - when 'C4', '~0', '~1', '~2', '~3', '~4' - 'trivial' - else - 'normal' - end - end - - # Simplistic helper for rendering an error message. - # Shows a little icon before the message - def error_msg(msg) - content = image_tag('icons/error.png') - content << " " << msg - content - end - - # Checks a string for spelling mistakes - def spelling(str) - Glsamaker::Spelling.check_string(str, ''.html_safe, ''.html_safe) - rescue - Rails.logger.error "Spell checking not available" - str - end - - # Renders a title bar for our boxes - def box_title(title, options = {}) - content = "".html_safe - - if options.has_key? :toolbar - span_content = "".html_safe - - options[:toolbar].each do |toolbar_item| - if toolbar_item == :sep - span_content << image_tag('separator.png') - else - if toolbar_item[:uri].start_with? 'javascript:' - span_content << link_to_function( - image_tag(toolbar_item[:icon]), - toolbar_item[:uri].gsub(/^javascript:/, ''), - :title => toolbar_item[:title] - ) << ' ' - else - span_content << link_to(image_tag(toolbar_item[:icon]), toolbar_item[:uri]) << ' ' - end - end - end - - content << content_tag("span", span_content, :class => 'toolbar') - end - - if options.has_key? :icon - content << image_tag(options[:icon]) << " " - end - - title2 = title - if options.has_key? :escape and options[:escape] == false - title2 = title2.html_safe - end - - if options.has_key? :label - content << content_tag('label', title2, :for => options[:label]) - else - content << title2 - end - - content_tag("h2", content, :class => "boxtitle") - end - - def last_import_start - Rails.cache.fetch(::CVE_CACHE_LAST_IMPORT) - end - - def with_format(format, &block) - old_formats = formats - begin - self.formats = [format] - return block.call - ensure - self.formats = old_formats - end - end -end diff --git a/app/helpers/bug_helper.rb b/app/helpers/bug_helper.rb deleted file mode 100644 index afe37be..0000000 --- a/app/helpers/bug_helper.rb +++ /dev/null @@ -1,8 +0,0 @@ -module BugHelper - - - # Creates links around common phrases like Bug 12345 or Comment 234 - def linkify_comment(text) - text.gsub(/bug (\d+)/i, link_to_function('bug \1', 'buginfo(\1);')) - end -end diff --git a/app/helpers/bugs_helper.rb b/app/helpers/bugs_helper.rb deleted file mode 100644 index 8d70fcb..0000000 --- a/app/helpers/bugs_helper.rb +++ /dev/null @@ -1,2 +0,0 @@ -module BugsHelper -end diff --git a/app/helpers/comments_helper.rb b/app/helpers/comments_helper.rb deleted file mode 100644 index 0ec9ca5..0000000 --- a/app/helpers/comments_helper.rb +++ /dev/null @@ -1,2 +0,0 @@ -module CommentsHelper -end diff --git a/app/helpers/cve_helper.rb b/app/helpers/cve_helper.rb deleted file mode 100644 index 174603f..0000000 --- a/app/helpers/cve_helper.rb +++ /dev/null @@ -1,14 +0,0 @@ -module CveHelper - # Converts a bit mask to a condition usable by AR - def view_mask_to_condition(mask) - conditions = [] - - conditions << 'state = "NEW"' if mask & 1 == 1 - conditions << 'state = "ASSIGNED"' if mask & 2 == 2 - conditions << 'state = "LATER"' if mask & 4 == 4 - conditions << 'state = "NFU"' if mask & 8 == 8 - conditions << 'state = "INVALID"' if mask & 16 == 16 - - conditions.join(' OR ') - end -end diff --git a/app/helpers/glsa_helper.rb b/app/helpers/glsa_helper.rb deleted file mode 100644 index 7770227..0000000 --- a/app/helpers/glsa_helper.rb +++ /dev/null @@ -1,200 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2009-2011 Alex Legler -# Copyright (C) 2009 Pierre-Yves Rofes -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -# GLSA Helper -module GlsaHelper - - def glsa_content(g, field) - (params[:glsa][field.to_sym] if params[:glsa]) || g[field] - end - - def lastrev_content(g, field) - (params[:glsa][field.to_sym] if params[:glsa]) || g.last_revision[field] - end - - def add_vulnerable_package_link(name) - link_to_function( - name, - "Element.insert('packages_table_vulnerable', { bottom: '#{escape_javascript(render(:partial => '/glsa/package', :object => Package.new(:comp => "<", :slot => "*", :arch => "*", :my_type => "vulnerable")))}' })", - :title => 'Add package') - end - - def add_unaffected_package_link(name) - link_to_function( - name, - "Element.insert('packages_table_unaffected', { bottom: '#{escape_javascript(render(:partial => '/glsa/package', :object => Package.new(:comp => ">=", :slot => "*", :arch => "*", :my_type => "unaffected")))}' })", - :title => 'Add package') - end - - def add_reference_link(name) - link_to_function name, :title => "Add reference" do |page| - page.insert_html :bottom, :references_table, :partial => 'reference', :object => Reference.new - end - end - - def status_icon(status) - if status == "request" - image_tag "icons/request.png", :title => "This item is a request." - elsif status == "draft" - image_tag "icons/draft.png", :title => "This item is a draft." - elsif status == "release" - image_tag "icons/sent.png", :title => "This item is a sent GLSA." - else - "?" - end - end - - def bugready_icon(status) - if status - image_tag "icons/bug.png", :title => "This item is bug ready." - else - image_tag "icons/bug-grey.png", :title => "This item is NOT bug ready." - end - end - - def approval_icon(status) - if status == :approved - image_tag "icons/status-green.png", :title => "This item is approved for sending." - elsif status == :commented - image_tag "icons/status-red.png", :title => "This item has received comments." - elsif status == :comments_pending - image_tag "icons/status-yellow.png", :title => "This item has received comments." - else - image_tag "icons/status-grey.png", :title => "This item has no comments." - end - end - - def workflow_icon(status) - if status == :commented - image_tag "icons/commented.png", :title => "You have commented on this item." - elsif status == :approved - image_tag "icons/approved.png", :title => "You have approved this item." - elsif status == :own - image_tag "icons/user.png", :title => "This is your own draft." - elsif status == :todo - image_tag "icons/not-approved.png", :title => "Please comment and/or approve." - end - end - - def restricted_icon(status) - if status - image_tag "icons/confidential.png", :title => "This item is CONFIDENTIAL." - else - image_tag "icons/public.png", :title => "This item is public." - end - end - - def check_icon(status) - if status - image_tag "icons/ok.png", :title => "All checks passed" - else - image_tag "icons/error.png", :title => "Error. Cannot continue." - end - end - - def is_approval_icon(status) - if status - image_tag 'icons/approval.png', :title => 'This item is an approval' - else - image_tag 'icons/rejection.png', :title => 'This item is a rejection' - end - end - - def prefixed_item(prefix, text) - tf = Text::Format.new() - tf.first_indent = tf.body_indent = prefix.length + 1 - - str = tf.format(text) - str[0, prefix.length] = prefix - str.chomp - end - - def adv_wrap(text, shorten_args = false) - text.gsub!(/\r?\n/, "\n") - - text.gsub!(/<\/?(b|i)>/, '') - - text.gsub!(/^\*\s+(.*)$/) do |s| - '* ' + word_wrap($1, :line_width => 69).gsub("\n","\n ") - end - - text.gsub!(/(?:
    \s*(.*?)<\/ul>(?:\s*\n)?)/m) do |s| - $1.gsub(/
  • (.*?)<\/li>\s*/) do |t| - ('* ' + word_wrap($1, :line_width => 69)).gsub("\n", "\n ") + "\n\n" - end - end - - # TODO: ordered lists? never used... - - text.gsub!(/(?:
      \s*(.*?)<\/ol>(?:\s*\n)?)/m) do |s| - nom = 0 - $1.gsub(/
    1. (.*?)<\/li>\s*/) do |t| - ("#{nom += 1}. " + word_wrap($1, :line_with => 68)).gsub("\n", "\n ") + "\n\n" - end - end - - text.gsub!(/(?:\s*(.*?)<\/code>(?:\s*\n)?)/m) do |s| - (' ' + word_wrap(shorten_args ? shorten_args($1) : $1, :line_width => 69)).gsub("\n", "\n ") + "\n\n" - end - - word_wrap(text.chomp, :line_width => 71) - end - - def template_popups - render :partial => 'template_popups', :locals => {:templates => @templates} - end - - def xml_format(str) - content = Kramdown::Document.new(str || "").to_xml - - content.gsub! "

      ", "" - content.gsub! "

      ", "" - content.gsub! "‘", "'" - content.gsub! "’", "'" - content.gsub! "“", '"' - content.gsub! "”", '"' - - content - end - - def html_format(str) - content = Kramdown::Document.new(str || "").to_xml - - content.gsub! "

      ", "" - content.gsub! "

      ", "" - - content - end - - def field_content(str) - sanitize(html_format(spelling(str)), :tags => %w[p ul li code span]) - end - -private - def shorten_args(text) - text.gsub!(/# (.*)/) do |s| - r = $1 - r_fallback = r.dup - - logger.debug r.inspect - logger.debug r.length - - r.gsub!(/ --verbose /m, " -v ") if r.length > 67 - r.gsub!(/ --ask /m, " -a ") if r.length > 67 - r.gsub!(/ --oneshot /m, " -1 ") if r.length > 67 - r.gsub!(/ -a -1 -v /m, " -1av ") if r.length > 67 - - r = r_fallback.gsub(/ --verbose /, " --verbose \\\n ") if r.length > 67 - - "# " + r - end - end -end diff --git a/app/helpers/index_helper.rb b/app/helpers/index_helper.rb deleted file mode 100644 index ea82a6a..0000000 --- a/app/helpers/index_helper.rb +++ /dev/null @@ -1,14 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2009-2011 Alex Legler -# Copyright (C) 2009 Pierre-Yves Rofes -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -# Index Helper -module IndexHelper -end diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb deleted file mode 100644 index b3ce20a..0000000 --- a/app/helpers/search_helper.rb +++ /dev/null @@ -1,2 +0,0 @@ -module SearchHelper -end diff --git a/app/helpers/tools_helper.rb b/app/helpers/tools_helper.rb deleted file mode 100644 index 5fa4f26..0000000 --- a/app/helpers/tools_helper.rb +++ /dev/null @@ -1,14 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2009-2011 Alex Legler -# Copyright (C) 2009 Pierre-Yves Rofes -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -# Tools helper -module ToolsHelper -end diff --git a/app/indices/indices.rb b/app/indices/indices.rb deleted file mode 100644 index 04be101..0000000 --- a/app/indices/indices.rb +++ /dev/null @@ -1,34 +0,0 @@ -ThinkingSphinx::Index.define :bug, :with => :active_record do - indexes whiteboard - - has revision_id -end - -ThinkingSphinx::Index.define :cve_comment, :with => :active_record do - indexes comment - has user_id, cve_id -end - -ThinkingSphinx::Index.define :cve, :with => :active_record do - indexes cve_id, :sortable => true - indexes state, :sortable => true - indexes summary - - has published_at, last_changed_at -end - -ThinkingSphinx::Index.define :glsa, :with => :active_record do - indexes glsa_id, :sortable => true -end - -ThinkingSphinx::Index.define :revision, :with => :active_record do - indexes title - indexes synopsis - indexes description - indexes impact - indexes workaround - indexes resolution - indexes is_release - - has glsa_id, revid, release_revision -end diff --git a/app/mailers/.gitkeep b/app/mailers/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/app/mailers/glsa_mailer.rb b/app/mailers/glsa_mailer.rb deleted file mode 100644 index 1f6b54a..0000000 --- a/app/mailers/glsa_mailer.rb +++ /dev/null @@ -1,45 +0,0 @@ -class GlsaMailer < ActionMailer::Base - default :from => GLSAMAKER_FROM_EMAIL, - :content_type => 'text/plain' - - def new_request(recipient, glsa, requestor) - @requestor = requestor - @glsa = glsa - - mail(:to => recipient.email, - :subject => "[GLSAMaker] New request: #{glsa.last_revision.title}") - end - - def edit(recipient, glsa, diff, editor) - @editor = editor - @diff = diff - @glsa = glsa - - mail(:to => recipient.email, - :subject => "[GLSAMaker] Draft edit: #{glsa.last_revision.title}") - end - - def comment(recipient, glsa, comment, commentator) - @commentator = commentator - @comment = comment - @glsa = glsa - - mail(:to => recipient.email, - :subject => "[GLSAMaker] Draft commented: #{glsa.last_revision.title}") - end - - def approval(recipient, glsa) - @glsa = glsa - - mail(:to => recipient.email, - :subject => "[GLSAMaker] Draft approved: #{glsa.last_revision.title}") - end - - def text(recipient, subject, text, footer) - @text = text - @footer = footer - - mail(:to => recipient.email, - :subject => subject) - end -end diff --git a/app/models/.gitkeep b/app/models/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/app/models/bug.rb b/app/models/bug.rb deleted file mode 100644 index 00e2d6d..0000000 --- a/app/models/bug.rb +++ /dev/null @@ -1,46 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2009-2011 Alex Legler -# Copyright (C) 2009 Pierre-Yves Rofes -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -# Bug model -class Bug < ActiveRecord::Base - belongs_to :revision - - def cc - self.arches - end - - include Glsamaker::Bugs::StatusMixin - include Glsamaker::Bugs::ArchesMixin - include Glsamaker::Bugs::BugReadyMixin - - # Returns the Gentoo Bugzilla URI for the bug. - # Set +secure+ to false to get a HTTP instead of a HTTPS URI - def bug_url(secure = true) - if secure - "https://#{GLSAMAKER_BUGZIE_HOST}/show_bug.cgi?id=#{self.bug_id}" - else - "http://#{GLSAMAKER_BUGZIE_HOST}/show_bug.cgi?id=#{self.bug_id}" - end - end - - # Updates the cached bug metadata - def update_cached_metadata - b = Glsamaker::Bugs::Bug.load_from_id(bug_id) - - update_attributes!( - :title => b.summary, - :whiteboard => b.status_whiteboard, - :arches => b.arch_cc.join(', ') - ) - rescue Exception => e - raise "Could not update cached metadata: " + e.message - end -end diff --git a/app/models/comment.rb b/app/models/comment.rb deleted file mode 100644 index fa285a4..0000000 --- a/app/models/comment.rb +++ /dev/null @@ -1,44 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2009-2011 Alex Legler -# Copyright (C) 2009 Pierre-Yves Rofes -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -# Comment model -class Comment < ActiveRecord::Base - belongs_to :glsa, :class_name => "Glsa", :foreign_key => "glsa_id" - belongs_to :user - - include ActiveModel::Validations - validates :glsa_id, :presence => true - validates :user_id, :presence => true - validates :rating, :inclusion => { :in => %w[neutral approval rejection]} - validates :rating, :uniqueness => { :scope => [:glsa_id, :user_id], :if => Proc.new {|comment| comment.rating != 'neutral'}, :message => 'You have already approved or rejected this draft' } - - class CommentValidator < ActiveModel::Validator - def validate(record) - if record.glsa.is_owner? record.user - if record.rating != 'neutral' - record.errors[:rating] << 'The owner of a draft cannot make approvals or rejections' - end - end - - if record.glsa.submitter.nil? - record.errors[:rating] << 'You may not approve or reject advisories that have not been filled in yet' - end - - if record.user.access < 2 - if record.rating != 'neutral' - record.errors[:rating] << 'You may not approve or reject drafts' - end - end - end - end - - validates_with CommentValidator -end diff --git a/app/models/cpe.rb b/app/models/cpe.rb deleted file mode 100644 index 243cced..0000000 --- a/app/models/cpe.rb +++ /dev/null @@ -1,29 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2010 Alex Legler -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -class Cpe < ActiveRecord::Base - has_and_belongs_to_many :cves, :class_name => 'Cve' - - def split - self.cpe.split(':') - end - - def vendor - split[2] - end - - def product - split[3] - end - - def version - split[4] - end -end diff --git a/app/models/cve.rb b/app/models/cve.rb deleted file mode 100644 index d9a05c6..0000000 --- a/app/models/cve.rb +++ /dev/null @@ -1,177 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2010 Alex Legler -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -require 'glsamaker/helpers' - -class Cve < ActiveRecord::Base - has_many :references, :class_name => "CveReference" - has_many :comments, :class_name => "CveComment" - has_and_belongs_to_many :cpes, :class_name => "Cpe" - has_many :cve_changes, :class_name => "CveChange", :foreign_key => "cve_id" - has_many :assignments, :class_name => "CveAssignment", :foreign_key => "cve_id" - - def to_s(line_length = 78) - str = "#{self.cve_id} #{"(%s):" % url}\n" - str += " " + Glsamaker::help.word_wrap(self.summary, :line_width => line_length-2).gsub(/\n/, "\n ") - end - - # Returns the URL for this CVE at NVD (:nvd, default) or MITRE (:mitre) - def url(site = :nvd) - if site == :nvd - "https://nvd.nist.gov/vuln/detail/%s" % self.cve_id - elsif site == :mitre - "https://cve.mitre.org/cgi-bin/cvename.cgi?name=%s" % self.cve_id - else - raise ArgumentError, 'Invalid site' - end - end - - # Concatenates the CVE descriptions of many cves, separated by separator - def self.concat(cves, separator = "\n\n") - txt = "" - cves.each do |cve| - txt += Cve.find(cve).to_s - txt += separator - end - txt - end - - # Assigns the CVE to a certain bug, creating a history entry - def assign(bugnr, user, action = 'assign') - bugnr = Integer(bugnr) - - case action - when 'assign', :assign - act = 'assign' - when 'file', :file - act = 'file' - else - raise ArgumentError, "Invalid action specified" - end - - a = self.assignments.create!(:bug => bugnr) - - ch = self.cve_changes.create!( - :user => user, - :action => act, - :object => a.id - ) - - self.state = 'ASSIGNED' - save! - end - - # Mark the CVE as Not-For-Us, creating a history entry - def nfu(user, reason = nil) - self.cve_changes.create!( - :user => user, - :action => 'nfu', - :object => reason - ) - - self.state = 'NFU' - save! - end - - # Mark the CVE as INVALID, creating a history entry - def invalidate(user, reason = nil) - self.cve_changes.create!( - :user => user, - :action => 'invalid', - :object => reason - ) - - self.state = 'INVALID' - save! - end - - def later(user, reason = nil) - self.cve_changes.create!( - :user => user, - :action => 'later', - :object => reason - ) - - self.state = 'LATER' - save! - end - - def mark_new(user, reason = nil) - self.cve_changes.create!( - :user => user, - :action => 'new', - :object => reason - ) - - self.state = 'NEW' - save! - end - - def add_comment(user, comment, confidential = false) - self.comments << CveComment.create!( - :user => user, - :confidential => confidential, - :comment => comment - ) - end - - # Decorates the output of field with a color, depending on the status - def colorize(field = :cve_id) - "%s" % [state.downcase, self[field]] - end - - # Looks for Gentoo packages that might be affected by this CVE - def package_hints - def search(s) - return [] if s.nil? or s == "" - - Glsamaker::Portage.find_packages( - Regexp.compile(Regexp.escape(s).gsub(/[^a-zA-Z0-9]/, '.*?'), Regexp::IGNORECASE) - ) - end - - package_hints = [] - my_cpes = cpes.map {|c| c.product }.uniq - package_hints << my_cpes.map {|c| search c }.flatten - - # stolen from the old cvetools.py - if summary =~ / in (\S+\.\S+) in (?:the )?(?:a )?(\D+) \d+/ - match = $2 - if match.end_with? 'before' - package_hints << search(match[0, match.length - 7]) - else - package_hints << search(match) - end - end - - if summary =~ / in (?:the )?(?:a )?(\D+) \d+/ - match = $1 - if match.end_with? 'before' - package_hints << search(match[0, match.length - 7]) - else - package_hints << search(match) - end - end - - if summary =~ / in (\S+\.\S+) in (?:the )?(?:a )?(\S+) / - package_hints << search($1) - end - - if summary =~ / in (?:the )?(?:a )?(\S+) / - package_hints << search($1) - end - - if summary =~ /(?:The )?(\S+) / - package_hints << search($1) - end - - package_hints.flatten.uniq - end -end diff --git a/app/models/cve_assignment.rb b/app/models/cve_assignment.rb deleted file mode 100644 index af1559a..0000000 --- a/app/models/cve_assignment.rb +++ /dev/null @@ -1,3 +0,0 @@ -class CveAssignment < ActiveRecord::Base - belongs_to :cve -end diff --git a/app/models/cve_change.rb b/app/models/cve_change.rb deleted file mode 100644 index 71ff974..0000000 --- a/app/models/cve_change.rb +++ /dev/null @@ -1,4 +0,0 @@ -class CveChange < ActiveRecord::Base - belongs_to :user, :class_name => "User", :foreign_key => "user_id" - belongs_to :cve -end diff --git a/app/models/cve_comment.rb b/app/models/cve_comment.rb deleted file mode 100644 index 73357dc..0000000 --- a/app/models/cve_comment.rb +++ /dev/null @@ -1,4 +0,0 @@ -class CveComment < ActiveRecord::Base - belongs_to :cve - belongs_to :user, :class_name => "User", :foreign_key => "user_id" -end diff --git a/app/models/cve_reference.rb b/app/models/cve_reference.rb deleted file mode 100644 index 1f11e01..0000000 --- a/app/models/cve_reference.rb +++ /dev/null @@ -1,3 +0,0 @@ -class CveReference < ActiveRecord::Base - belongs_to :cve -end diff --git a/app/models/glsa.rb b/app/models/glsa.rb deleted file mode 100644 index bee70be..0000000 --- a/app/models/glsa.rb +++ /dev/null @@ -1,311 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2009-2011 Alex Legler -# Copyright (C) 2009 Pierre-Yves Rofes -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -# GLSA model -class Glsa < ActiveRecord::Base - validates_uniqueness_of :glsa_id, :message => "must be unique" - validates_presence_of :glsa_id, :message => "GLSA ID needed" - - belongs_to :submitter, :class_name => "User", :foreign_key => "submitter" - belongs_to :requester, :class_name => "User", :foreign_key => "requester" - belongs_to :bugreadymaker, :class_name => "User", :foreign_key => "bugreadymaker" - - has_many :revisions, :dependent => :destroy - has_many :comments, :dependent => :destroy - - # Returns the last revision object, referring to the current state of things - def last_revision - @last_revision ||= self.revisions.order("revid DESC").first - end - - # Returns the last revision object that was a release - def last_release_revision - self.revisions.where(:is_release => true).order('release_revision DESC').first - end - - # Invalidates the last revision cache - def invalidate_last_revision_cache - @last_revision = nil - end - - # Returns the next revision ID to be given for this GLSA - def next_revid - if (rev = last_revision) - rev.revid + 1 - else - 0 - end - end - - # Returns the next release revision ID to be given for this GLSA - def next_releaseid - if (rev = last_release_revision) - rev.release_revision + 1 - else - 1 - end - end - - # Returns the best available release date - def release_date - return first_released_at if status == 'release' - last_revision.created_at - end - - # Returns the best available revision date - def revised_date - if status == 'release' and last_revision.created_at < first_released_at - first_released_at - else - last_revision.created_at - end - end - - # Returns all approving comments - def approvals - comments.where(:rating => 'approval') - end - - # Returns all rejecting comments - def rejections - comments.where(:rating => 'rejection') - end - - # Returns true if the draft is ready for sending - def is_approved? - count = 0 - users_who_approved = approvals.map { |a| a.user_id } - users_who_rejected = rejections.map { |a| a.user_id } - - common_users = (users_who_approved & users_who_rejected) - common_users.each do |user| - approval = approvals.where(:user_id => user).order('created_at DESC').first - rejection = rejections.where(:user_id => user).order('created_at DESC').first - - # if the approval was before a rejection => 0 - if approval.created_at < rejection.created_at - count += 0 - elsif approval.created_at > rejection.created_at - count += 1 - end - end - - (users_who_approved - common_users).each do |user| - count += 1 - end - - (users_who_rejected - common_users).each do |user| - count -= 1 - end - - (count >= 1) - end - - # Returns true if it has comments - def has_comments? - comments.count > 0 - end - - # The approval status of the GLSA, either :approved, :commented, or :none - def approval_status - if is_approved? - return :approved - elsif has_comments? - if has_pending_comments? - return :comments_pending - else - return :commented - end - end - return :none - end - - # Returns true if user is the owner of this GLSA. - def is_owner?(user) - return false if user.nil? - luser = (status == "request" ? requester : submitter) - luser == user - end - - # Returns the workflow status of this GLSA for a given user. - # Return values: :own (own draft), :approved (approval given), :commented (comment or rejection given) - def workflow_status(user) - if is_owner?(user) - return :own - end - - if comments.where(:rating => 'approval', :user_id => user.id).count > 0 - return :approved - end - - if comments.where(:user_id => user.id, :read => false).count > 0 - return :commented - end - - return :todo - end - - # Returns true if there are any pending comments left - def has_pending_comments? - comments.where(:read => false).all.count > 0 - end - - # Returns all CVEs linked to this GLSA - def related_cves - last_revision.bugs.map do |bug| - CveAssignment.where(bug: bug.bug_id).map {|assignment| assignment.cve}.uniq - end.flatten - end - - # Bulk addition of references. - # Expects an array of hashes {:title => ..., :url => ...} - def add_references(refs) - rev = last_revision.deep_copy - - refs.each do |reference| - rev.references.create(reference) - end - - invalidate_last_revision_cache - self - end - - # Performs the steps to release the GLSA, performing santiy checks. - def release - raise GLSAReleaseError, 'Cannot release the GLSA as it is not approved' if not is_approved? - raise GLSAReleaseError, 'Cannot release the GLSA as there are comments pending' if has_pending_comments? - # TODO: releasing someone else's draft - release! - end - - # Performs the steps to release the GLSA, performing not as many checks. The +release+ method is to be preferred. - def release! - # This one is not avoidable. Some information is only filled in during the first edit, thus making it required. - raise GLSAReleaseError, 'Cannot release the GLSA as it is not in "draft" or "release" status' if not (self.status == 'draft' or self.status == 'release') - - rev = last_revision.deep_copy - rev.is_release = true - rev.release_revision = next_releaseid - rev.save! - - unless self.status == 'release' - self.glsa_id = Glsa.next_id - self.first_released_at = Time.now - end - - self.status = 'release' - save! - end - - # Closes all bugs linked to this advisory and refreshes the metadata - def close_bugs(message) - last_revision.bugs.each do |bug| - logger.info "Closing bug #{bug.bug_id}" - b = Glsamaker::Bugs::Bug.load_from_id(bug.bug_id) - - changes = {} - changes[:comment] = message - changes[:whiteboard] = b.status_whiteboard.gsub(/(ebuild\+?|upstream\+?|stable\+?|glsa)\??/, 'glsa+').gsub(/glsa\/glsa/, 'glsa+') - changes[:status] = "RESOLVED" - changes[:resolution] = "FIXED" - - Bugzilla.update_bug(bug.bug_id, changes) - bug.update_cached_metadata - end - end - - # Returns a publically accessible URL for the advisory if it's a released GLSA - def to_url - "https://security.gentoo.org/glsa/#{self.glsa_id}" - end - - # Calculates the next GLSA ID for the given month, or the current month - def self.next_id(month = Time.now) - month_id = month.strftime("%Y%m") - items = Glsa.where("glsa_id LIKE ? AND status = ?", month_id + '%', 'release').order('glsa_id DESC') - - return "#{month_id}-01" if items.length == 0 - - items.first.glsa_id =~ /^#{month_id}-(\d+)$/ - next_id = $1.to_i + 1 - "#{month_id}-#{format "%02d", next_id}" - end - - # Files a new GLSA request - def self.new_request(title, bugs, comment, access, import_references, user) - glsa = Glsa.new - glsa.requester = user - glsa.glsa_id = Digest::MD5.hexdigest(title + Time.now.to_s)[0...9] - glsa.restricted = (access == "confidential") - glsa.status = "request" - - begin - glsa.save! - rescue Exception => e - raise Exception, "Error while saving the GLSA object: #{e.message}" - end - - # unless comment.strip.blank? - # glsa.comments << Comment.new(:rating => "neutral", :text => comment, :user => user) - - # begin - # glsa.save! - # rescue Exception => e - # raise Exception, "Error while saving the comment: #{e.message}" - # end - # end - - revision = Revision.new - revision.revid = glsa.next_revid - revision.glsa = glsa - revision.title = title - revision.user = user - - begin - revision.save! - rescue Exception => e - glsa.delete - raise Exception, "Error while saving Revision object: #{e.message}" - end - - bugs = Bugzilla::Bug.str2bugIDs(bugs) - - bugs.each do |bug| - begin - b = Glsamaker::Bugs::Bug.load_from_id(bug) - - revision.bugs.create( - :bug_id => bug, - :title => b.summary, - :whiteboard => b.status_whiteboard, - :arches => b.arch_cc.join(', ') - ) - rescue Exception => e - # In case of bugzilla errors, just keep the bug # - revision.bugs.create(:bug_id => bug) - end - end - - if import_references - logger.debug { "importing references" } - refs = [] - glsa.related_cves.each do |cve| - refs << {:title => cve.cve_id, :url => cve.url} - end - glsa.add_references refs - end - - glsa - end - -end - -class GLSAReleaseError < StandardError; end diff --git a/app/models/package.rb b/app/models/package.rb deleted file mode 100644 index 30fb1bd..0000000 --- a/app/models/package.rb +++ /dev/null @@ -1,48 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2009-2011 Alex Legler -# Copyright (C) 2009 Pierre-Yves Rofes -# Copyright (C) 2017 Robin H. Johnson -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -# Package model -class Package < ActiveRecord::Base - # Mapping XML comparators to internally used ones - COMP_MAP = { - '>=' => 'ge', - '>' => 'gt', - '=' => 'eq', - '<=' => 'le', - '<' => 'lt', - '*<' => 'rlt', - '*<=' => 'rle', - '*>' => 'rgt', - '*>=' => 'rge' - }.freeze - - # Arches (from $PORTDIR/profiles/arch.list) - ARCHLIST_BASE = %w{alpha amd64 arm arm64 hppa ia64 m68k mips nios2 ppc ppc64 riscv s390 sh sparc x86}.freeze - ARCHLIST_FBSD = %w{amd64-fbsd sparc-fbsd x86-fbsd}.freeze - ARCHLIST_PREFIX = %w{ppc-aix amd64-linux arm-linux arm64-linux ppc64-linux x86-linux ppc-macos x86-macos x64-macos m68k-mint sparc-solaris sparc64-solaris x64-solaris x86-solaris x86-winnt x64-cygwin x86-cygwin}.freeze - ARCHLIST = (ARCHLIST_BASE+ARCHLIST_FBSD+ARCHLIST_PREFIX).freeze - ARCHLIST_REGEX = %r{(?:#{ARCHLIST.join('|')})}.freeze - - # Model properties - belongs_to :revision - validates :comp, :inclusion => { :in => COMP_MAP.keys } - validates :arch, :format => { :with => /\A(\*|(#{ARCHLIST_REGEX} )*#{ARCHLIST_REGEX})\z/ } - - # Returns the comparator in the format needed for the XML - def xml_comp - COMP_MAP[self.comp] - end - - def self.reverse_comp(cmp) - COMP_MAP.invert[cmp] - end -end diff --git a/app/models/reference.rb b/app/models/reference.rb deleted file mode 100644 index f378cd4..0000000 --- a/app/models/reference.rb +++ /dev/null @@ -1,15 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2009-2011 Alex Legler -# Copyright (C) 2009 Pierre-Yves Rofes -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -# Reference model -class Reference < ActiveRecord::Base - belongs_to :revision -end diff --git a/app/models/revision.rb b/app/models/revision.rb deleted file mode 100644 index 26cfd82..0000000 --- a/app/models/revision.rb +++ /dev/null @@ -1,103 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2009-2011 Alex Legler -# Copyright (C) 2009 Pierre-Yves Rofes -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -require 'rexml/document' - -# Revision model -class Revision < ActiveRecord::Base - belongs_to :glsa, :class_name => "Glsa", :foreign_key => "glsa_id" - has_many :bugs, :dependent => :destroy - has_many :references, :dependent => :destroy - has_many :packages, :dependent => :destroy - has_many :vulnerable_packages, -> { where :my_type => "vulnerable" }, :class_name => "Package" - has_many :unaffected_packages, -> { where :my_type => "unaffected" }, :class_name => "Package" - belongs_to :user - - validates_numericality_of :user_id, :message => "user id needed" - validates_presence_of :title - -=begin - validates_each :description, :resolution do |record, attr, value| - # XML well-formedness test - begin - REXML::Document.new("#{value}") - rescue REXML::ParseException => e - record.errors.add attr, "is not well-formed XML" - end - end -=end - - # Returns an Array of Integers of the bugs linked to this revision - def get_linked_bugs - self.bugs.map do |bug| - bug.bug_id.to_i - end - end - - # Checks all assigned bugs for bug ready status - def bug_ready? - self.bugs.each do |b| - return false unless b.bug_ready? - end - - return true - end - - # Updates the cached metadata of all assigned bugs - def update_cached_bug_metadata - self.bugs.each do |b| - b.update_cached_metadata - end - end - - # Creates a deep copy of a previous revision, copying all bugs, references and packages, - # incrementing the revision ID by one. - # The caller must take care of deleting this revision again in case any error occurs later. - def deep_copy - new_rev = dup - new_rev.revid = glsa.next_revid - - references.each {|reference| new_rev.references << reference.dup } - packages.each {|package| new_rev.packages << package.dup } - bugs.each {|bug| new_rev.bugs << bug.dup } - - new_rev.save! - new_rev - end - - # Returns the packages linked to this revision grouped by atoms - def packages_by_atom - packages_list = {} - self.packages.each do |p| - packages_list[p[:atom]] ||= {} - (packages_list[p[:atom]][p[:my_type]] ||= []) << p - end - - packages_list - end - - def to_s - s = "r#{self.revid}" - if self.is_release? - s << " (release #{self.release_revision})" - end - - s - end - - def release_access - if self.access == "both" - "local, remote" - else - self.access - end - end -end diff --git a/app/models/template.rb b/app/models/template.rb deleted file mode 100644 index d974347..0000000 --- a/app/models/template.rb +++ /dev/null @@ -1,2 +0,0 @@ -class Template < ActiveRecord::Base -end diff --git a/app/models/user.rb b/app/models/user.rb deleted file mode 100644 index 88d5eff..0000000 --- a/app/models/user.rb +++ /dev/null @@ -1,65 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2009-2011 Alex Legler -# Copyright (C) 2009 Pierre-Yves Rofes -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -# =Access levels -# -# [0 (Contributor)] Can see own drafts, can fill in requests -# [1 (Padawan)] all of the above, plus see and edit all drafts -# [2 (Full member)] all of the above, plus voting -# [3 (Confidential member)] all of the above, including restricted drafts -class User < ActiveRecord::Base - has_many :submitted_glsas, :class_name => "Glsa", :foreign_key => "submitter" - has_many :requested_glsas, :class_name => "Glsa", :foreign_key => "requester" - has_many :bugreadymade_glsas, :class_name => "Glsa", :foreign_key => "bugreadymaker" - has_many :cve_changes, :class_name => "CveChange", :foreign_key => "user_id" - - has_many :revisions - - serialize :preferences - - validates_uniqueness_of :login, :message => "User name must be unique" - validates_presence_of :login, :message => "User name can't be blank" - - validates_presence_of :name, :message => "Name can't be blank" - - validates_presence_of :access, :message => "Access level needed" - validates_numericality_of :access, :greater_than_or_equal_to => 0, :less_than_or_equal_to => 3, :message => "Access level must be between 0 and 3" - - validates_format_of :email, :with => /[\w.%+-]+?@[\w.-]+?\.\w{2,6}\z/, :message => "Invalid Email address format" - - scope :active, -> { where(:disabled => false).where('id > ?', 0) } - - # Is the user an admin? ;) - def is_el_jefe? - self.jefe - end - - # Checks access to a given GLSA - def can_access?(glsa) - return false if disabled? - return false if access == 0 and not glsa.is_owner? self - return false if access < 3 and glsa.restricted - - true - end - - def to_s - "#{name} (#{login})" - end - - # Returns a certain category form the user's preferences - # or an empty hash if that category does not exist - def get_pref_category(category) - return {} if self.preferences == nil or self.preferences[category] == nil - - self.preferences[category] - end -end diff --git a/app/views/admin/index/index.html.erb b/app/views/admin/index/index.html.erb deleted file mode 100644 index 2313d16..0000000 --- a/app/views/admin/index/index.html.erb +++ /dev/null @@ -1,6 +0,0 @@ -

      GLSAMaker Administration

      - -
        -
      • <%= link_to 'User Management', admin_users_path %>
      • -
      • <%= link_to 'Template Management', admin_templates_path %>
      • -
      \ No newline at end of file diff --git a/app/views/admin/templates/_form.html.erb b/app/views/admin/templates/_form.html.erb deleted file mode 100644 index 9984673..0000000 --- a/app/views/admin/templates/_form.html.erb +++ /dev/null @@ -1,35 +0,0 @@ -<%= form_for([:admin, @template]) do |f| %> - <% if @template.errors.any? %> -
      -

      <%= pluralize(@template.errors.count, "error") %> prohibited this template from being saved:

      - -
        - <% @template.errors.full_messages.each do |msg| %> -
      • <%= msg %>
      • - <% end %> -
      -
      - <% end %> - - - - - - - - - - - - - - - - - - -
      <%= f.label :name %><%= f.text_field :name %>
      <%= f.label :text %><%= f.text_area :text, :rows => 10 %>
      <%= f.label :target, 'Target Field' %><%= select('template', 'target', target_list) %>
      <%= f.label :enabled %><%= f.check_box :enabled %>
      -
      - <%= f.submit %> -
      -<% end %> diff --git a/app/views/admin/templates/edit.html.erb b/app/views/admin/templates/edit.html.erb deleted file mode 100644 index 3c72272..0000000 --- a/app/views/admin/templates/edit.html.erb +++ /dev/null @@ -1,8 +0,0 @@ -
      -

      Edit user

      - - <%= render 'form' %> -
      - -<%= link_to 'Show', @admin_template %> | -<%= link_to 'Back', admin_templates_path %> \ No newline at end of file diff --git a/app/views/admin/templates/index.html.erb b/app/views/admin/templates/index.html.erb deleted file mode 100644 index 32edfbb..0000000 --- a/app/views/admin/templates/index.html.erb +++ /dev/null @@ -1,23 +0,0 @@ -

      Templates

      - - - - - - - - - -<% @templates.each do |admin_template| %> - - - - - - -<% end %> -
      NameTextFieldEnabled
      <%= link_to admin_template.name, admin_template_path(admin_template) %><%= admin_template.text %><%= admin_template.target %><%= admin_template.enabled %>
      - -
      - -<%= link_to 'New Template', new_admin_template_path %> diff --git a/app/views/admin/templates/new.html.erb b/app/views/admin/templates/new.html.erb deleted file mode 100644 index 78e25fb..0000000 --- a/app/views/admin/templates/new.html.erb +++ /dev/null @@ -1,7 +0,0 @@ -
      -

      New Template

      - - <%= render 'form' %> -
      - -<%= link_to 'Back', admin_templates_path %> \ No newline at end of file diff --git a/app/views/admin/templates/show.html.erb b/app/views/admin/templates/show.html.erb deleted file mode 100644 index e406071..0000000 --- a/app/views/admin/templates/show.html.erb +++ /dev/null @@ -1,26 +0,0 @@ -
      -

      <%= @template.name %>

      - - - - - - - - - - - - - - - - - - -
      Name:<%= @template.name %>
      Text:
      <%= @template.text %>
      Field:<%= @template.target.titleize %>
      Enabled:<%= @template.enabled %>
      -
      - -<%= link_to 'Edit', edit_admin_template_path(@template) %> | -<%= link_to 'Delete', admin_template_path(@template), :confirm => 'Are you sure?', :method => :delete %> | -<%= link_to 'Back', admin_templates_path %> \ No newline at end of file diff --git a/app/views/admin/users/_user.html.erb b/app/views/admin/users/_user.html.erb deleted file mode 100644 index 3461591..0000000 --- a/app/views/admin/users/_user.html.erb +++ /dev/null @@ -1,9 +0,0 @@ - - <%= user.id %> - <%= user.login %> - <%= link_to user.name, admin_user_path(user) %> - <%= user.email %> - <%= access_string user.access %> - <%= user.disabled %> - <%= user.jefe %> - diff --git a/app/views/admin/users/create.html.erb b/app/views/admin/users/create.html.erb deleted file mode 100644 index 34cd1ba..0000000 --- a/app/views/admin/users/create.html.erb +++ /dev/null @@ -1,2 +0,0 @@ -

      Admin::User#create

      -

      Find me in app/views/admin/user/create.html.erb

      diff --git a/app/views/admin/users/destroy.html.erb b/app/views/admin/users/destroy.html.erb deleted file mode 100644 index d77622c..0000000 --- a/app/views/admin/users/destroy.html.erb +++ /dev/null @@ -1,2 +0,0 @@ -

      Admin::User#destroy

      -

      Find me in app/views/admin/user/destroy.html.erb

      diff --git a/app/views/admin/users/edit.html.erb b/app/views/admin/users/edit.html.erb deleted file mode 100644 index aa5c7b5..0000000 --- a/app/views/admin/users/edit.html.erb +++ /dev/null @@ -1,50 +0,0 @@ -
      -

      Edit user

      - <%= form_for([:admin, @user]) do |f| %> - <% if @user.errors.any? %> -
      -

      <%= pluralize(@user.errors.count, "error") %> prohibited this record from being saved:

      -
        - <% @user.errors.full_messages.each do |msg| %> -
      • <%= msg %>
      • - <% end %> -
      -
      - <% end %> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      ID<%= @user.id %>
      Login<%= f.text_field :login %>
      Name<%= f.text_field :name %>
      Email<%= f.text_field :email %>
      Access Level<%= select('user', 'access', access_list) %>
      Disabled flag<%= f.check_box :disabled %>
      Admin flag<%= f.check_box :jefe %>
      -

      -<%= f.submit 'Update' %> -

      -
      -<% end %> -<%= link_to 'Back', admin_user_path(@user) %> \ No newline at end of file diff --git a/app/views/admin/users/index.html.erb b/app/views/admin/users/index.html.erb deleted file mode 100644 index 97bfed7..0000000 --- a/app/views/admin/users/index.html.erb +++ /dev/null @@ -1,19 +0,0 @@ -

      Users

      - - - - - - - - - - - - -<%= render :partial => "user", :collection => @users, :as => :user %> -
      IDLoginNameEmailAccess LevelDisabledAdministrator
      - -

      - <%= link_to 'New User', new_admin_user_path(@user) %> -

      \ No newline at end of file diff --git a/app/views/admin/users/new.html.erb b/app/views/admin/users/new.html.erb deleted file mode 100644 index 276cc61..0000000 --- a/app/views/admin/users/new.html.erb +++ /dev/null @@ -1,47 +0,0 @@ -
      -

      New user

      - - <%= form_for([:admin, @user]) do |f| %> - <% if @user.errors.any? %> -
      -

      <%= pluralize(@user.errors.count, "error") %> prohibited this record from being saved:

      -
        - <% @user.errors.full_messages.each do |msg| %> -
      • <%= msg %>
      • - <% end %> -
      -
      - <% end %> - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Login<%= f.text_field :login %>
      Name<%= f.text_field :name %>
      Email<%= f.text_field :email %>
      Access Level<%= select('user', 'access', access_list) %>
      Disabled flag<%= f.check_box :disabled %>
      Admin flag<%= f.check_box :jefe %>
      -

      -<%= f.submit 'Update' %> -

      -
      -<% end %> -<%= link_to 'Back', admin_users_path %> \ No newline at end of file diff --git a/app/views/admin/users/show.html.erb b/app/views/admin/users/show.html.erb deleted file mode 100644 index c009610..0000000 --- a/app/views/admin/users/show.html.erb +++ /dev/null @@ -1,34 +0,0 @@ -
      -

      <%= @user.login %>

      - - - - - - - - - - - - - - - - - - - - - - - - - - -
      ID<%= @user.id %>
      Name<%= @user.name %>
      Email<%= mail_to @user.email %>
      Access Level<%= access_string @user.access %>
      Disabled flag<%= @user.disabled %>
      Admin flag<%= @user.jefe %>
      -
      - -<%= link_to 'Edit', edit_admin_user_path(@user) %> | -<%= link_to 'Delete', admin_user_path(@user), :confirm => 'Are you sure?', :method => :delete %> | -<%= link_to 'Back', admin_users_path %> \ No newline at end of file diff --git a/app/views/admin/users/update.html.erb b/app/views/admin/users/update.html.erb deleted file mode 100644 index 90396aa..0000000 --- a/app/views/admin/users/update.html.erb +++ /dev/null @@ -1,2 +0,0 @@ -

      Admin::User#update

      -

      Find me in app/views/admin/user/update.html.erb

      diff --git a/app/views/bug/bug.html.erb b/app/views/bug/bug.html.erb deleted file mode 100644 index 67f709b..0000000 --- a/app/views/bug/bug.html.erb +++ /dev/null @@ -1,58 +0,0 @@ -<% if @bug == nil %> - -

      <%= error_msg("Invalid Bug ID") %>

      -

      There is no such bug on Gentoo's Bugzilla.

      - -<% elsif (@bug.is_a? String and @bug == "down") %> - -

      <%= error_msg("Bugzilla is unreachable") %>

      -

      Sorry, but the Gentoo Bugzilla is unreachable at the moment.

      - -<% elsif @bug.restricted %> - -

      <%= image_tag('icons/restricted.png') %> This bug is restricted

      - -

      Currently, GLSAMaker cannot process restricted bugs. :(

      -

      Try to <%= image_tag 'icons/bug.png' %> Open bug <%= @bug.bug_id %> in Bugzilla instead.

      - -<% else %> - -

      <%= @bug.summary %>

      - - - -
      - Status/Resolution: <%= @bug.status %> <%= @bug.resolution %>
      - Status Whiteboard: <%= @bug.status_whiteboard %>
      - <% arches = @bug.arch_cc %> Arches (<%= arches.size %>): <% arches = @bug.arch_cc %><%= arches.map {|a| a.gsub("@gentoo.org", "") }.join(", ") %>

      - - CC: <%= (@bug.cc - arches).map {|a| a.gsub("@gentoo.org", "@g.o")}.join(", ") %> -
      - -
      - Assigned to: <%= @bug.assigned_to %>
      - Reported: <%= @bug.reporter %> <%= @bug.created_at %>

      - - Depends on: <% @bug.depends.each do |d| %><%= d %> <% end %>
      - Blocks: <% @bug.blocks.each do |d| %><%= d %> <% end %>
      -
      -
      - -

      Comments

      -
        -<% commentID = 1 ; @bug.comments.each do |comment| %> -
      1. -

        - → Bugzilla - <%= comment.author %> - at <%= comment.date %> -

        -

        <%= simple_format_without_paragraph(linkify_comment(comment.text)).html_safe %>

        -
      2. -<% commentID +=1 ; end %> -
      - -<% end %> \ No newline at end of file diff --git a/app/views/bug/history.html.erb b/app/views/bug/history.html.erb deleted file mode 100644 index 24cf004..0000000 --- a/app/views/bug/history.html.erb +++ /dev/null @@ -1,43 +0,0 @@ -<% if @bug == nil %> - -

      <%= error_msg("Invalid Bug ID") %>

      -

      There is no such bug on Gentoo's Bugzilla.

      - -<% elsif (@bug.is_a? String and @bug == "down") %> - -

      <%= error_msg("Bugzilla is unreachable") %>

      -

      Sorry, but the Gentoo Bugzilla is unreachable at the moment.

      - -<% elsif @bug.restricted %> - -

      <%= image_tag('icons/restricted.png') %> This bug is restricted

      - -

      Currently, GLSAMaker cannot process restricted bugs. :(

      -

      Try to <%= image_tag 'icons/bug.png' %> Open bug <%= @bug.bug_id %> in Bugzilla instead.

      - -<% else %> - - -

      <%= @bug.summary %>

      - - -

      History

      -
        -<% @bug.history.changes.each do |change| %> -
      1. -

        - <%= h(change.user) %> at <%= change.time %> -

        -

        - <% change.changes.each do |where, what| %> - <%= where.to_s.capitalize %>: <%= what[0] %> → <%= what[1] %>
        - <% end %> -

        -
      2. -<% end %> -
      - -<% end %> \ No newline at end of file diff --git a/app/views/bugs/create.html.erb b/app/views/bugs/create.html.erb deleted file mode 100644 index aa3490b..0000000 --- a/app/views/bugs/create.html.erb +++ /dev/null @@ -1,2 +0,0 @@ -

      Bugs#create

      -

      Find me in app/views/bugs/create.html.erb

      diff --git a/app/views/bugs/create.js.erb b/app/views/bugs/create.js.erb deleted file mode 100644 index 13a466b..0000000 --- a/app/views/bugs/create.js.erb +++ /dev/null @@ -1,6 +0,0 @@ -<% if @error == nil %> -Element.insert('bugtable', { bottom: '<%= escape_javascript(@bugs_text).html_safe %>'}); -Modalbox.hide(); -<% else %> -alert('<%= escape_javascript(@error).html_safe %>'); -<% end %> \ No newline at end of file diff --git a/app/views/bugs/destroy.html.erb b/app/views/bugs/destroy.html.erb deleted file mode 100644 index b08c545..0000000 --- a/app/views/bugs/destroy.html.erb +++ /dev/null @@ -1,2 +0,0 @@ -

      Bugs#destroy

      -

      Find me in app/views/bugs/destroy.html.erb

      diff --git a/app/views/bugs/new.html.erb b/app/views/bugs/new.html.erb deleted file mode 100644 index 63ca3c8..0000000 --- a/app/views/bugs/new.html.erb +++ /dev/null @@ -1,34 +0,0 @@ -<% if @glsa.nil? %> -

      No or invalid GLSA ID specified.

      -<% else %> -<%= form_tag(glsa_bugs_path(@glsa, @bug), :remote => true) do -%> -<%# form_remote_tag( - :url => { :controller => :glsa, :action => :addbugsave, :id => @glsa_id.to_s }, - :update => {:success => 'bugtable'}, - :position => :bottom, - :before => '$("addbugsubmit").value="Loading...";', - :after => '$("addbugsubmit").value="Add bugs";', - :success => 'Modalbox.hide();', - :failure => 'alert(request.responseText);') do -%> -

      -

      - -

      - -
      -

      -<% end -%> -<% end %> \ No newline at end of file diff --git a/app/views/bugs/show.html.erb b/app/views/bugs/show.html.erb deleted file mode 100644 index 736728a..0000000 --- a/app/views/bugs/show.html.erb +++ /dev/null @@ -1,2 +0,0 @@ -

      Bugs#show

      -

      Find me in app/views/bugs/show.html.erb

      diff --git a/app/views/comments/create.js.erb b/app/views/comments/create.js.erb deleted file mode 100644 index 482b6ff..0000000 --- a/app/views/comments/create.js.erb +++ /dev/null @@ -1,10 +0,0 @@ -<% if @error == nil %> -Element.insert('commentslist', { bottom: '<%= escape_javascript(@comment_text).html_safe %>'}); -Modalbox.hide(); -<% else %> -<% if @error.is_a? ActiveModel::Errors %> -alert('<%= escape_javascript(@error.full_messages.join "\n").html_safe %>'); -<% else %> -alert('<%= escape_javascript(@error).html_safe %>'); -<% end %> -<% end %> \ No newline at end of file diff --git a/app/views/comments/destroy.html.erb b/app/views/comments/destroy.html.erb deleted file mode 100644 index 9dcdf77..0000000 --- a/app/views/comments/destroy.html.erb +++ /dev/null @@ -1,2 +0,0 @@ -

      Comment#destroy

      -

      Find me in app/views/comment/destroy.html.erb

      diff --git a/app/views/comments/new.html.erb b/app/views/comments/new.html.erb deleted file mode 100644 index 87d836f..0000000 --- a/app/views/comments/new.html.erb +++ /dev/null @@ -1,25 +0,0 @@ -<% if @glsa.nil? %> -

      No or invalid GLSA ID specified.

      -<% else %> -<%= form_tag(glsa_comments_path(@glsa, @comment), :remote => true, :class => "popupform") do -%> - <%= fields_for :newcomment do |f| %> -

      - <%= f.text_area :text, :class => "nice", :rows => 4 %> -

      - -

      - <% if current_user.access >= 2 and not @glsa.is_owner? current_user %> - - Rating: - <%= f.radio_button :rating, "approval" %>  - <%= f.radio_button :rating, "rejection" %>  - <%= f.radio_button :rating, "neutral", :checked => true %> - - <% else %> - <%= f.hidden_field :rating, :value => 'neutral' %> - <% end %> - <% end %> - -

      -<% end -%> -<% end %> \ No newline at end of file diff --git a/app/views/comments/show.html.erb b/app/views/comments/show.html.erb deleted file mode 100644 index b66469d..0000000 --- a/app/views/comments/show.html.erb +++ /dev/null @@ -1,2 +0,0 @@ -

      Comment#show

      -

      Find me in app/views/comment/show.html.erb

      diff --git a/app/views/cve/_assigning.js.erb b/app/views/cve/_assigning.js.erb deleted file mode 100644 index 6a25248..0000000 --- a/app/views/cve/_assigning.js.erb +++ /dev/null @@ -1,94 +0,0 @@ -/** Assigning **/ -uki( - { view: 'Popup', rect: '650 400', anchors: 'left top', id: 'assign-popup', hideOnClick: false, relativeTo: uki('#popup'), childViews: [ - { view: 'Label', rect: '10 10 630 20', anchors: 'top', text: '', id: 'cve-assign-title' }, - { view: 'ScrollPane', rect: '10 30 635 320', anchors: 'top left right bottom', id: 'cve-assign-scroll', scrollableV: true, scrollableH: false, childViews: [ - { view: 'Label', rect: '10 20 600 200', anchors: 'top', text: '', id: 'cve-assign-text', textSelectable: true, multiline: true}, - ] }, - { view: 'Button', rect: '495 365 70 24', anchors: 'bottom right', id: 'cve-assign-cancel', text: 'Cancel' }, - { view: 'Button', rect: '570 365 70 24', anchors: 'bottom right', id: 'cve-assign-go', text: 'Assign' } - ] - } -); - -uki('#assign-bug-nr').keypress( - function(e) { - if (e.charCode == 13) { - uki('#cve-assign').click(); - } - } -); - -uki("#cve-assign").click( - function() { - var sel = uki('Table').selectedRows(); - - if (sel.length < 1) { - alert("Please select at least one CVE."); - return false; - } - - var popup = uki('#assign-popup'); - var bugnr = uki('#assign-bug-nr').value(); - - if (!(bugnr == parseInt(bugnr)) || bugnr.length == 0) { - alert("Please enter a numeric bug #."); - return false; - } - - cve_assign_data = new Array(); - for (var i = 0; i < sel.length; i++) { - cve_assign_data.push(sel[i][0]); - } - - new Ajax.Request('/cve/assign_preview', { - parameters: { cves: cve_assign_data.join(','), bug: bugnr }, - onSuccess: function(response) { - uki('#cve-assign-text').html(response.responseText); - uki('#cve-assign-text').resizeToContents('height'); - - uki('#cve-assign-title').html("The following changes will be made to bug " + bugnr + ":"); - popup.show(); - uki('#cve-assign-go').disabled(false); - uki('#cve-assign-go').focus(); - }, - onFailure: function(response) { - alert("Could not process your request:\n\n" + response.responseText); - return false; - } - }); - } -); - -uki('#cve-assign-cancel').click( - function() { - uki('#assign-popup').hide(); - } -); - -uki('#cve-assign-go').click( - function() { - uki('#cve-assign-go').disabled(true); - var bugnr = uki('#assign-bug-nr').value(); - - if (cve_assign_data < 1) { - alert("Error. Internal CVE list empty."); - uki('#assign-popup').hide(); - return; - } - - new Ajax.Request('/cve/assign', { - parameters: { cves: cve_assign_data.join(','), bug: bugnr, comment: $('add_comment').checked, summary: $('change_summary').checked }, - onSuccess: function(response) { - uki('#assign-popup').hide(); - uki('#assign-bug-nr').value(''); - reloadTable(); - }, - onFailure: function(response) { - alert("Could not process your request:\n\n" + response.responseText); - uki('#cve-assign-go').disabled(false); - } - }); - } -); -/** Assigning end **/ diff --git a/app/views/cve/_filing.js.erb b/app/views/cve/_filing.js.erb deleted file mode 100644 index dc80767..0000000 --- a/app/views/cve/_filing.js.erb +++ /dev/null @@ -1,170 +0,0 @@ -/** Filing **/ -uki( - { view: 'Popup', rect: '500 300', anchors: 'left top', id: 'file-1-popup', hideOnClick: false, relativeTo: uki('#popup'), childViews: [ - { view: 'Label', rect: '10 10 480 20', anchors: 'top', text: 'Select a package to file this bug against:', id: 'cve-file-1-title' }, - { view: 'ScrollableList', rect: '10 35 480 170', anchors: 'top left right bottom', id: 'cve-file-1-list' }, - { view: 'Label', rect: '10 210 480 20', anchors: 'top', text: 'Or manually enter a package atom:', id: 'cve-file-1-title2' }, - { view: 'TextField', rect: '10 235 480 22', anchors: 'left top right', placeholder: 'package atom', id: 'cve-file-1-atom' }, - { view: 'Button', rect: '345 265 70 24', anchors: 'bottom right', id: 'cve-file-1-cancel', text: 'Cancel' }, - { view: 'Button', rect: '420 265 70 24', anchors: 'bottom right', id: 'cve-file-1-go', text: 'Next' } - ] - } -); - -uki( - { view: 'Popup', rect: '650 400', anchors: 'left top', id: 'file-2-popup', hideOnClick: false, relativeTo: uki('#popup'), childViews: [ - { view: 'Label', rect: '10 10 630 20', anchors: 'top', text: 'Enter the information for filing the bug:', id: 'cve-file-2-title' }, - { view: 'ScrollPane', rect: '10 30 635 320', anchors: 'top left right bottom', id: 'cve-file-2-scroll', scrollableV: true, scrollableH: false, childViews: [ - { view: 'Label', rect: '10 10 600 400', anchors: 'top', text: '', id: 'cve-file-2-text', textSelectable: true, multiline: true}, - ] }, - { view: 'Button', rect: '495 365 70 24', anchors: 'bottom right', id: 'cve-file-2-cancel', text: 'Cancel' }, - { view: 'Button', rect: '570 365 70 24', anchors: 'bottom right', id: 'cve-file-2-go', text: 'File bug' } - ] - } -); - -uki("#cve-file").click( - function() { - var sel = uki('Table').selectedRows(); - - if (sel.length < 1) { - alert("Please select at least one CVE."); - return false; - } - - // TODO: Avoid DoS'ing the package search by limiting the # of package to search for - - var popup = uki('#file-1-popup'); - - // yes, this wants to be a global var - cve_file_data = new Array(); - for (var i = 0; i < sel.length; i++) { - cve_file_data.push(sel[i][0]); - } - - new Ajax.Request('/cve/bug_package', { - parameters: { cves: cve_file_data.join(',')}, - onSuccess: function(response) { - uki('#cve-file-1-list').data(response.responseJSON['package_hints']); - uki('#cve-file-1-atom').value(''); - uki('#cve-file-1-atom').focus(); - disableMainView(); - popup.show(); - }, - onFailure: function(response) { - alert("Could not process your request:\n\n" + response.responseText); - return false; - } - }); - } -); - -uki('#cve-file-1-cancel').click( - function() { - uki('#file-1-popup').hide(); - enableMainView(); - } -); - -uki('#cve-file-1-go').click( - function() { - var package_name = ""; - - if (uki('#cve-file-1-list').selectedIndex() > 0 && uki('#cve-file-1-atom').value() != '') { - alert('Either select a package or enter something'); - return false; - } - - if (uki('#cve-file-1-list').selectedIndex() < 0) { - package_name = uki('#cve-file-1-atom').value(); - } else { - package_name = uki('#cve-file-1-list').selectedRow(); - } - - if (package_name == undefined || package_name == "") { - alert("Please select a package."); - return false; - } - - if (cve_file_data < 1) { - alert("Error. Internal CVE list empty."); - uki('#file-1-popup').hide(); - return; - } - - new Ajax.Request('/cve/bug_preview', { - parameters: { package: package_name, cves: cve_file_data.join(',') }, - onSuccess: function(response) { - uki('#cve-file-2-text').html(response.responseText); - uki('#cve-file-2-text').resizeToContents('height'); - - uki('#file-1-popup').hide(); - uki('#file-2-popup').show(); - $('bug_title').focus(); - }, - onFailure: function(response) { - alert("Could not process your request:\n\n" + response.responseText); - return false; - } - }); - } -); - -uki('#cve-file-2-cancel').click( - function() { - uki('#file-2-popup').hide(); - } -); - -uki('#cve-file-2-go').click( - function() { - if (cve_file_data < 1) { - alert("Error. Internal CVE list empty."); - uki('#file-2-popup').hide(); - return; - } - - if ($('wb_1').value == '--') { - alert('Please select a whiteboard setting. If unsure use "??" instead.'); - $('wb_1').focus(); - return; - } - - if (!($('add_comment').checked || $('add_cves').checked)) { - alert("Adding the CVE description is strongly suggested!\n\nIf you do not want to add it, then you need at least to add a comment."); - $('comment').focus(); - return; - } - - uki('#cve-file-2-go').disabled(true); - - var params = { - bug_title: $('bug_title').value, - bug_type: $('type_1').checked, - cc_maint: $('cc_maint').checked, - cc_custom: $('custom_cc').value, - wb_1: $('wb_1').value, - wb_2: $('wb_2').value, - wb_ext: $('wb_ext').value, - add_comment: $('add_comment').checked, - comment: $('comment').value, - add_cves: $('add_cves').checked, - package: $('package').value, - cves: cve_file_data.join(',') - }; - - new Ajax.Request('/cve/bug', { - parameters: params, - onSuccess: function(response) { - uki('#file-2-popup').hide(); - uki('#cve-file-2-go').disabled(false); - reloadTable(); - }, - onFailure: function(response) { - alert("Could not process your request:\n\n" + response.responseText); - uki('#cve-file-2-go').disabled(false); - } - }); - } -); -/** Filing end **/ diff --git a/app/views/cve/_invalidate.js.erb b/app/views/cve/_invalidate.js.erb deleted file mode 100644 index 6cb031d..0000000 --- a/app/views/cve/_invalidate.js.erb +++ /dev/null @@ -1,71 +0,0 @@ -/** Invalidating **/ -uki( - { view: 'Popup', rect: '500 300', anchors: 'left top', id: 'inva-popup', hideOnClick: false, relativeTo: uki('#popup'), childViews: [ - { view: 'Label', rect: '10 10 480 20', anchors: 'top', html: 'The following CVEs will be marked as INVALID:', id: 'cve-inva-title'}, - { view: 'ScrollableList', rect: '10 35 480 190', anchors: 'top left right bottom', id: 'cve-inva-list' }, - { view: 'TextField', rect: '10 235 480 22', anchors: 'left top right', id: 'inva-comment' }, - { view: 'Button', rect: '345 265 70 24', anchors: 'bottom right', id: 'cve-inva-cancel', text: 'Cancel' }, - { view: 'Button', rect: '420 265 70 24', anchors: 'bottom right', id: 'cve-inva-go', text: 'Commit' } - ] - } -); - -uki("#cve-mark-invalid").click( - function() { - var sel = uki('Table').selectedRows(); - - if (sel.length < 1) { - alert("Please select at least one CVE."); - return false; - } - - var data = new Array(); - cve_inva_data = new Array(); - - for (var i = 0; i < sel.length; i++) { - data.push("(" + sel[i][1] + ") " + sel[i][2]); - cve_inva_data.push(sel[i][0]); - } - - uki('#cve-inva-list').data(data); - - uki('#inva-comment').value(''); - uki('#inva-popup').show(); - - uki('#cve-inva-go').focus(); - } -); - -uki('#cve-inva-go').click( - function() { - if (cve_inva_data < 1) { - alert("Error. Internal CVE list empty."); - return; - uki('#inva-popup').hide(); - } - - if (uki('#inva-comment').value() == "") { - alert("You need to provide a reason."); - uki('#inva-comment').focus(); - return; - } - - new Ajax.Request('/cve/invalid', { - parameters: { cves: cve_inva_data.join(','), reason: uki('#inva-comment').value() }, - onSuccess: function(response) { - uki('#inva-popup').hide(); - reloadTable(); - }, - onFailure: function(response) { - alert("Could not process your request:\n\n" + response.responseText); - } - }); - } -); - -uki('#cve-inva-cancel').click( - function() { - uki('#inva-popup').hide(); - } -); -/** Invalidating end **/ \ No newline at end of file diff --git a/app/views/cve/_key_events.js.erb b/app/views/cve/_key_events.js.erb deleted file mode 100644 index 9bdf740..0000000 --- a/app/views/cve/_key_events.js.erb +++ /dev/null @@ -1,71 +0,0 @@ -/** Keyboard events **/ -document.onkeyup = function(e){ - var keycode; - - if (e == null) { // ie - keycode = event.keyCode; - } else { // mozilla - keycode = e.which; - } - - if (keycode == 27) { - if (uki('#nfu-popup').visible()) - uki('#nfu-popup').hide(); - if (uki('#assign-popup').visible()) - uki('#assign-popup').hide(); - if (uki('#file-1-popup').visible()) - uki('#file-1-popup').hide(); - if (uki('#file-2-popup').visible()) - uki('#file-2-popup').hide(); - - enableMainView(); - uki('Table').focus(); - } else if (keycode == 13 && e.ctrlKey) { - if (uki('#nfu-popup').visible()) - uki('#cve-nfu-go').click(); - if (uki('#assign-popup').visible()) - uki('#cve-assign-go').click(); - if (uki('#file-1-popup').visible()) - uki('#cve-file-1-go').click(); - if (uki('#file-2-popup').visible()) - uki('#cve-file-2-go').click(); - } -}; - -uki('Table').keyup( - function(e) { - var c = e.keyCode; - //alert(c); - - if (c == 110 || c == 78) { // n;N - uki('#cve-mark-nfu').click(); - return; - } - - if (c == 108 || c == 76) { // l;L - uki('#cve-mark-later').click(); - return; - } - - if (c == 105 || c == 73) { // i;I - uki('#cve-mark-invalid').click(); - return; - } - - if (c == 97 || c == 65 || c == 51) { // a;A;# - uki('#assign-bug-nr').focus(); - return; - } - - if (c == 102 || c == 70 || c == 98 || c == 66) { // f;F;b;B - uki('#cve-file').click(); - return; - } - - if (c == 13) { // enter key - uki('#cve-details').click(); - return; - } - } -); -/** Keyboard events end **/ \ No newline at end of file diff --git a/app/views/cve/_later.js.erb b/app/views/cve/_later.js.erb deleted file mode 100644 index 0be1726..0000000 --- a/app/views/cve/_later.js.erb +++ /dev/null @@ -1,65 +0,0 @@ -/** Latering **/ -uki( - { view: 'Popup', rect: '500 300', anchors: 'left top', id: 'later-popup', hideOnClick: false, relativeTo: uki('#popup'), childViews: [ - { view: 'Label', rect: '10 10 480 20', anchors: 'top', html: 'The following CVEs will be marked as LATER:', id: 'cve-later-title'}, - { view: 'ScrollableList', rect: '10 35 480 190', anchors: 'top left right bottom', id: 'cve-later-list' }, - { view: 'TextField', rect: '10 235 480 22', anchors: 'left top right', placeholder: 'Add a (public) comment', id: 'later-comment' }, - { view: 'Button', rect: '345 265 70 24', anchors: 'bottom right', id: 'cve-later-cancel', text: 'Cancel' }, - { view: 'Button', rect: '420 265 70 24', anchors: 'bottom right', id: 'cve-later-go', text: 'Commit' } - ] - } -); - -uki("#cve-mark-later").click( - function() { - var sel = uki('Table').selectedRows(); - - if (sel.length < 1) { - alert("Please select at least one CVE."); - return false; - } - - var data = new Array(); - cve_later_data = new Array(); - - for (var i = 0; i < sel.length; i++) { - data.push("(" + sel[i][1] + ") " + sel[i][2]); - cve_later_data.push(sel[i][0]); - } - - uki('#cve-later-list').data(data); - - uki('#later-comment').value(''); - uki('#later-popup').show(); - - uki('#cve-later-go').focus(); - } -); - -uki('#cve-later-go').click( - function() { - if (cve_later_data < 1) { - alert("Error. Internal CVE list empty."); - return; - uki('#later-popup').hide(); - } - - new Ajax.Request('/cve/later', { - parameters: { cves: cve_later_data.join(','), reason: uki('#later-comment').value() }, - onSuccess: function(response) { - uki('#later-popup').hide(); - reloadTable(); - }, - onFailure: function(response) { - alert("Could not process your request:\n\n" + response.responseText); - } - }); - } -); - -uki('#cve-later-cancel').click( - function() { - uki('#later-popup').hide(); - } -); -/** Latering end **/ \ No newline at end of file diff --git a/app/views/cve/_new.js.erb b/app/views/cve/_new.js.erb deleted file mode 100644 index 7f8c49b..0000000 --- a/app/views/cve/_new.js.erb +++ /dev/null @@ -1,75 +0,0 @@ -/** New CVE **/ -uki( - { view: 'Popup', rect: '650 300', anchors: 'left top', id: 'new-popup', hideOnClick: false, relativeTo: uki('#popup'), childViews: [ - { view: 'Label', rect: '10 10 630 20', anchors: 'top', text: '', id: 'cve-new-title' }, - { view: 'ScrollPane', rect: '10 30 635 220', anchors: 'top left right bottom', id: 'cve-new-scroll', scrollableV: true, scrollableH: false, childViews: [ - { view: 'Label', rect: '10 20 600 100', anchors: 'top', text: '', id: 'cve-new-text', textSelectable: true, multiline: true }, - ] }, - { view: 'Button', rect: '495 265 70 24', anchors: 'bottom right', id: 'cve-new-cancel', text: 'Cancel' }, - { view: 'Button', rect: '570 265 70 24', anchors: 'bottom right', id: 'cve-new-go', text: 'Create' } - ] - } -); - -uki("#cve-new").click( - function() { - var popup = uki('#new-popup'); - - new Ajax.Request('/cve/new_preview', { - onSuccess: function(response) { - uki('#cve-new-text').html(response.responseText); - uki('#cve-new-text').resizeToContents('height'); - - uki('#cve-new-title').html("Please provide the following CVE information:"); - popup.show(); - uki('#cve-new-go').disabled(false); - uki('#cve-new-go').focus(); - }, - onFailure: function(response) { - alert("Could not process your request:\n\n" + response.response.Text); - return false; - } - }); - } -); - -uki('#cve-new-cancel').click( - function() { - uki('#new-popup').hide(); - enableMainView(); - } -); - -uki('#cve-new-go').click( - function() { - if ($('cve_id').value.length < 13) { - alert("Please enter a valid 13 digit CVE identifier."); - return false; - } - if ($('summary').value.length < 1) { - alert("Please enter a CVE summary."); - return false; - } - - uki('#cve-new-go').disabled(true); - var params = { - cve_id: $('cve_id').value, - summary: $('summary').value - }; - - new Ajax.Request('new', { - parameters: params, - onSuccess: function(message) { - uki('#new-popup').hide(); - uki('#cve-new-go').disabled(false); - reloadTable(); - }, - onFailure: function(request, textStatus, errorThrown) { - var message = (request.status == 403) ? request.responseText : "Filing the CVE failed. Is this a duplicate?"; - alert(message); - uki('#cve-new-go').disabled(false); - } - }); - } -); -/** New CVE end **/ diff --git a/app/views/cve/_nfu.js.erb b/app/views/cve/_nfu.js.erb deleted file mode 100644 index b73723f..0000000 --- a/app/views/cve/_nfu.js.erb +++ /dev/null @@ -1,65 +0,0 @@ -/** NFU **/ -uki( - { view: 'Popup', rect: '500 300', anchors: 'left top', id: 'nfu-popup', hideOnClick: false, relativeTo: uki('#popup'), childViews: [ - { view: 'Label', rect: '10 10 480 20', anchors: 'top', html: 'The following CVEs will be marked as NFU:', id: 'cve-nfu-title'}, - { view: 'ScrollableList', rect: '10 35 480 190', anchors: 'top left right bottom', id: 'cve-nfu-list' }, - { view: 'TextField', rect: '10 235 480 22', anchors: 'left top right', placeholder: 'Add a (public) comment', id: 'nfu-comment' }, - { view: 'Button', rect: '345 265 70 24', anchors: 'bottom right', id: 'cve-nfu-cancel', text: 'Cancel' }, - { view: 'Button', rect: '420 265 70 24', anchors: 'bottom right', id: 'cve-nfu-go', text: 'Commit' } - ] - } -); - -uki("#cve-mark-nfu").click( - function() { - var sel = uki('Table').selectedRows(); - - if (sel.length < 1) { - alert("Please select at least one CVE."); - return false; - } - - var data = new Array(); - cve_nfu_data = new Array(); - - for (var i = 0; i < sel.length; i++) { - data.push("(" + sel[i][1] + ") " + sel[i][2]); - cve_nfu_data.push(sel[i][0]); - } - - uki('#cve-nfu-list').data(data); - - uki('#nfu-comment').value(''); - uki('#nfu-popup').show(); - - uki('#cve-nfu-go').focus(); - } -); - -uki('#cve-nfu-go').click( - function() { - if (cve_nfu_data < 1) { - alert("Error. Internal CVE list empty."); - return; - uki('#nfu-popup').hide(); - } - - new Ajax.Request('/cve/nfu', { - parameters: { cves: cve_nfu_data.join(','), reason: uki('#nfu-comment').value() }, - onSuccess: function(response) { - uki('#nfu-popup').hide(); - reloadTable(); - }, - onFailure: function(response) { - alert("Could not process your request:\n\n" + response.responseText); - } - }); - } -); - -uki('#cve-nfu-cancel').click( - function() { - uki('#nfu-popup').hide(); - } -); -/** NFU end **/ \ No newline at end of file diff --git a/app/views/cve/_toolbar.js.erb b/app/views/cve/_toolbar.js.erb deleted file mode 100644 index 2616bf6..0000000 --- a/app/views/cve/_toolbar.js.erb +++ /dev/null @@ -1,54 +0,0 @@ -/** Toolbar begin **/ -function toolbar() { - var years = [{ value: 0, text: 'ALL' }, { value: 2010, text: '2010' }, { value: 2009, text: '2009' }, { value: 2009, text: '2009' }, - { value: 2008, text: '2008' }, { value: 2007, text: '2007' }, { value: 2006, text: '2006' }, { value: 2005, text: '2005' }, - { value: 2004, text: '2004' }]; - - return [ - { view: 'Image', rect: '0 0 220 57', anchors: 'left top', src: '<%= asset_path 'cvetool-logo.png' %>', id: 'logo' }, - // view settings - { view: 'Image', rect: '5 57 16 16', anchors: 'left top', src: '<%= asset_path 'icons/switch.png' %>' }, - { view: 'Label', rect: '25 54 100 24', anchors: 'left top right', text: 'View settings' }, - { view: 'uki.more.view.ToggleButton', rect: '5 80 36 22', anchors: 'top', text: 'NEW', id: 'toggle-new', checked: true }, - { view: 'uki.more.view.ToggleButton', rect: '43 80 36 22', anchors: 'top', text: 'ASS', id: 'toggle-assigned' }, - { view: 'uki.more.view.ToggleButton', rect: '82 80 36 22', anchors: 'top', text: 'LAT', id: 'toggle-later' }, - { view: 'uki.more.view.ToggleButton', rect: '121 80 36 22', anchors: 'top', text: 'NFU', id: 'toggle-nfu' }, - { view: 'uki.more.view.ToggleButton', rect: '159 80 36 22', anchors: 'top', text: 'INV', id: 'toggle-invalid' }, - - // searching and filtering - { view: 'TextField', rect: '5 105 135 22', anchors: 'left top right', placeholder: 'quicksearch', id: 'quicksearch' }, - { view: 'Button', rect: '145 105 50 22', anchors: 'top right', text: 'Filter…', id: 'filter', disabled: true }, - - { view: 'Label', rect: '100 85 10 10', anchors: 'left top right', text: '', id: 'popup'}, - // assign - { view: 'Image', rect: '5 140 16 16', anchors: 'left top', src: '<%= asset_path 'icons/bug_add.png' %>' }, - { view: 'Label', rect: '25 137 188 24', anchors: 'left top right', text: 'Assign selected CVEs to bug' }, - { view: 'TextField', rect: '5 165 135 22', anchors: 'left top right', placeholder: 'bug', id: 'assign-bug-nr' }, - { view: 'Button', rect: '145 164 50 24', anchors: 'top right', text: 'Assign', id: 'cve-assign' }, - // file-new-bug - { view: 'Image', rect: '5 200 16 16', anchors: 'left top', src: '<%= asset_path 'icons/bug_new.png' %>' }, - { view: 'Label', rect: '25 198 188 24', anchors: 'left top right', text: 'New bug from selected CVEs' }, - { view: 'Button', rect: '5 225 188 24', anchors: 'left top right', text: 'File a new bug', id: 'cve-file' }, - // mark-as - { view: 'Image', rect: '5 265 16 16', anchors: 'left top', src: '<%= asset_path 'icons/stamp.png' %>' }, - { view: 'Label', rect: '25 262 188 24', anchors: 'left top right', text: 'Mark selected CVEs as…' }, - { view: 'Button', rect: '5 290 60 24', anchors: 'left top' , text: 'NFU', id: 'cve-mark-nfu' }, - { view: 'Button', rect: '70 290 60 24', anchors: 'left top', text: 'LATER', id: 'cve-mark-later' }, - { view: 'Button', rect: '135 290 60 24', anchors: 'left top', text: 'INVALID', id: 'cve-mark-invalid' }, - // add-a-note - { view: 'Image', rect: '5 330 16 16', anchors: 'left top', src: '<%= asset_path 'icons/note.png' %>' }, - { view: 'Label', rect: '25 327 188 24', anchors: 'left top right', text: 'Add a note to selected CVEs' }, - { view: 'MultilineTextField', rect: '5 350 189 50', anchors: 'left top right', placeholder: 'Note', id: 'cve-note-text' }, - { view: 'Button', rect: '135 405 60 24', anchors: 'right top', text: 'Add note', id: 'cve-add-note' }, - // mark-as - { view: 'Image', rect: '5 445 16 16', anchors: 'left top', src: '<%= asset_path 'icons/info.png' %>' }, - { view: 'Button', rect: '25 442 170 24', anchors: 'left top' , text: 'Info about selected CVEs', id: 'cve-details' }, - // New CVE - { view: 'Button', rect: '5 475 190 24', anchors: 'left top right', text: 'Add a new CVE', id: 'cve-new' }, - - // bottom stuff - { view: 'Button', rect: '5 940 190 24', anchors: 'left bottom right', text: 'Reload table', id: 'reload-table' }, - { view: 'Button', rect: '5 970 190 24', anchors: 'left bottom right', text: 'Back to GLSAMaker', id: 'close' } - ]; -} -/** Toolbar end **/ diff --git a/app/views/cve/_ui_misc.js.erb b/app/views/cve/_ui_misc.js.erb deleted file mode 100644 index 135f653..0000000 --- a/app/views/cve/_ui_misc.js.erb +++ /dev/null @@ -1,115 +0,0 @@ -/** UI misc **/ -uki("#reload-table").click( - function() { reloadTable(); } -); - -uki("#cve-details").click( - function() { - var sel = uki('Table').selectedRows(); - - if (sel.length > 15) { - alert("I'm not opening more than 15 windows..."); - return false; - } - - for(var i = 0; i < sel.length; i++) { - cvepopup(sel[i][1]); - } - } -); - -uki("#close").click( - function() { - window.location = "/"; - } -); - -uki('Table').bind('dblclick', function() { - cvepopup(uki('Table').selectedRow()[1]); -}); - -// View settings -uki("#toggle-new").click( - function() { - if (this.checked()) - view |= 1; - else - view ^= 1; - - reloadTable(); - } -); - -uki("#toggle-assigned").click( - function() { - if (this.checked()) - view |= 2; - else - view ^= 2; - - reloadTable(); - } -); - -uki("#toggle-later").click( - function() { - if (this.checked()) - view |= 4; - else - view ^= 4; - - reloadTable(); - } -); - -uki("#toggle-nfu").click( - function() { - if (this.checked()) - view |= 8; - else - view ^= 8; - - reloadTable(); - } -); - -uki("#toggle-invalid").click( - function() { - if (this.checked()) - view |= 16; - else - view ^= 16; - - reloadTable(); - } -); - -uki("#cve-add-note").click( - function() { - var sel = uki('Table').selectedRows(); - - if (sel.length < 1) { - alert("Please select at least one CVE."); - return false; - } - - var data = new Array(); - - for (var i = 0; i < sel.length; i++) { - data.push(sel[i][0]); - } - - new Ajax.Request('/cve/note', { - parameters: { cves: data.join(','), note: uki('#cve-note-text').value() }, - onSuccess: function(response) { - uki('#cve-note-text').value(''); - reloadTable(); - }, - onFailure: function(response) { - alert("Could not process your request:\n\n" + response.responseText); - } - }); - } -); - -/** UI misc end **/ \ No newline at end of file diff --git a/app/views/cve/actions.html.erb b/app/views/cve/actions.html.erb deleted file mode 100644 index 139bcab..0000000 --- a/app/views/cve/actions.html.erb +++ /dev/null @@ -1,5 +0,0 @@ -

      Actions

      - - - -

      For all other actions, please use the table view.

      \ No newline at end of file diff --git a/app/views/cve/assign_preview.html.erb b/app/views/cve/assign_preview.html.erb deleted file mode 100644 index 3fff283..0000000 --- a/app/views/cve/assign_preview.html.erb +++ /dev/null @@ -1,17 +0,0 @@ - - - - - -

      <%= @summary %>

      -

      was:
      - <%= @bug.summary %> -

      - -
      - - - - - -

      <%= @cve_txt %>

      \ No newline at end of file diff --git a/app/views/cve/bug_preview.html.erb b/app/views/cve/bug_preview.html.erb deleted file mode 100644 index 74d172f..0000000 --- a/app/views/cve/bug_preview.html.erb +++ /dev/null @@ -1,81 +0,0 @@ -
      -
      - -

      -File in: - -    - - -

      - - - <%= @maintainers.join ', ' %> -

      -
      - -

      - -Whiteboard:
      - - - - - - -

      - - - - - -

      - - - - - -

      <%= @cve_txt %>

      - - -
      \ No newline at end of file diff --git a/app/views/cve/changes.html.erb b/app/views/cve/changes.html.erb deleted file mode 100644 index 00de2a7..0000000 --- a/app/views/cve/changes.html.erb +++ /dev/null @@ -1,10 +0,0 @@ -

      Changes

      - -
        -<% @cve.cve_changes.each do |change| %> -
      • - <%= change.action %>: <%= change.object %>
        - —<%= change.user.login %> @ <%= change.created_at.rfc2822 %> -
      • -<% end %> -
      \ No newline at end of file diff --git a/app/views/cve/comments.html.erb b/app/views/cve/comments.html.erb deleted file mode 100644 index 36311bf..0000000 --- a/app/views/cve/comments.html.erb +++ /dev/null @@ -1,10 +0,0 @@ -

      Comments

      - -
        -<% @cve.comments.each do |comment| %> -
      • - <%= simple_format_without_paragraph(comment.comment) %>
        - —<%= comment.user.login %> @ <%= comment.created_at.rfc2822 %> -
      • -<% end %> -
      \ No newline at end of file diff --git a/app/views/cve/general_info.html.erb b/app/views/cve/general_info.html.erb deleted file mode 100644 index 5179ce9..0000000 --- a/app/views/cve/general_info.html.erb +++ /dev/null @@ -1,11 +0,0 @@ -

      Info

      - -

      Assigned bugs

      - -
        -<% @cve.assignments.each do |ass| %> -
      • - <%= ass.bug %> -
      • -<% end %> -
      diff --git a/app/views/cve/index.html.erb b/app/views/cve/index.html.erb deleted file mode 100644 index e69de29..0000000 diff --git a/app/views/cve/info.html.erb b/app/views/cve/info.html.erb deleted file mode 100644 index 33a9383..0000000 --- a/app/views/cve/info.html.erb +++ /dev/null @@ -1,140 +0,0 @@ -<% if @cve == nil %> - -

      <%= error_msg("Invalid CVE ID") %>

      -

      There is no such CVE.

      - -<% else %> - - -<% end %> diff --git a/app/views/cve/info.json.jbuilder b/app/views/cve/info.json.jbuilder deleted file mode 100644 index 31408a0..0000000 --- a/app/views/cve/info.json.jbuilder +++ /dev/null @@ -1,5 +0,0 @@ -json.extract! @cve, :id, :cve_id, :summary, :cvss, :state, :published_at - -json.references @cve.references, :source, :title, :uri - -json.bugs @cve.assignments.map { |a| a.bug } diff --git a/app/views/cve/list.html.erb b/app/views/cve/list.html.erb deleted file mode 100644 index 9a5fad6..0000000 --- a/app/views/cve/list.html.erb +++ /dev/null @@ -1,135 +0,0 @@ -

      CVE List

      - - diff --git a/app/views/cve/new_preview.html.erb b/app/views/cve/new_preview.html.erb deleted file mode 100644 index 4841c3f..0000000 --- a/app/views/cve/new_preview.html.erb +++ /dev/null @@ -1,7 +0,0 @@ -
      -
      - -

      -
      - - diff --git a/app/views/cve/packages.html.erb b/app/views/cve/packages.html.erb deleted file mode 100644 index 85d37a5..0000000 --- a/app/views/cve/packages.html.erb +++ /dev/null @@ -1,22 +0,0 @@ -

      Possibly affected Ebuilds

      - -
        -<% @package_hints.each do |package| %> -
      • - <%= package %>
        - <%= Glsamaker::Portage.get_metadata(package)[:description] %>
        - [sources.g.o] - [bugs.g.o] - [Secbug history] -
      • -<% end %> -
      - -

      Raw CPE data

      -
        -<% @cve.cpes.each do |cpe| %> -
      • - <%= cpe.cpe %> -
      • -<% end %> -
      diff --git a/app/views/cve/references.html.erb b/app/views/cve/references.html.erb deleted file mode 100644 index df59e94..0000000 --- a/app/views/cve/references.html.erb +++ /dev/null @@ -1,10 +0,0 @@ -

      References

      - -
        -<% @cve.references.each do |ref| %> -
      • - (<%= ref.source %>) <%= ref.title %>
        - <%= ref.uri %> -
      • -<% end %> -
      \ No newline at end of file diff --git a/app/views/glsa/_approval_row.erb b/app/views/glsa/_approval_row.erb deleted file mode 100644 index 1949db0..0000000 --- a/app/views/glsa/_approval_row.erb +++ /dev/null @@ -1,5 +0,0 @@ - - <%= is_approval_icon(comment.rating == 'approval') %> - <%= comment.user.name %> (<%= comment.user.login %>) - <%= comment.created_at %> - \ No newline at end of file diff --git a/app/views/glsa/_close_msg.txt.erb b/app/views/glsa/_close_msg.txt.erb deleted file mode 100644 index a07f975..0000000 --- a/app/views/glsa/_close_msg.txt.erb +++ /dev/null @@ -1,3 +0,0 @@ -This issue was resolved and addressed in - GLSA <%= @glsa.glsa_id %> at <%= @glsa.to_url %> -by GLSA coordinator <%= current_user.to_s %>. diff --git a/app/views/glsa/_comment.html.erb b/app/views/glsa/_comment.html.erb deleted file mode 100644 index 059f4a0..0000000 --- a/app/views/glsa/_comment.html.erb +++ /dev/null @@ -1,27 +0,0 @@ -
    2. "> - " /> - - <%= link_to_function(comment.read ? image_tag("icons/flag-green.png", :title => 'done') : image_tag("icons/flag.png", :title => 'todo'), - "toggleCommentRead(#{comment.id})", - :title => 'Toggle read status', - :id => "commentflag-#{comment.id}") %> - -
      - <%= case comment.rating - when "approval" - image_tag('icons/approval.png', :title => 'Approval') - when "rejection" - image_tag('icons/rejection.png', :title => 'Rejection') - else - image_tag('icons/comment.png', :title => 'Neutral') - end -%> -
      - -
      <%= Kramdown::Document.new(h(comment.text)).to_html.html_safe %>
      -
      - #<%= @comment_number ||= 1 %> - —<%= comment.user.name %>, <%= comment.created_at %> -
      -
    3. - -<% @comment_number += 1 -%> \ No newline at end of file diff --git a/app/views/glsa/_comments.html.erb b/app/views/glsa/_comments.html.erb deleted file mode 100644 index 65cac94..0000000 --- a/app/views/glsa/_comments.html.erb +++ /dev/null @@ -1,11 +0,0 @@ -
      - <%= box_title('Comments', :icon => 'icons/comment.png', - :toolbar => [ - {:title => 'Add comment', :uri => "javascript:addCommentDialog(#{@glsa.id})", :icon => 'icons/plus.png'}, - {:title => 'Dock right', :uri => "javascript:GLSAMaker.misc.ui.dock($('comments'))", :icon => 'icons/dock-right.png'} - ] - ) %> -
        - <%= render :partial => "comment", :collection => @glsa.comments.order("created_at ASC") %> -
      -
      diff --git a/app/views/glsa/_edit_bug_row.html.erb b/app/views/glsa/_edit_bug_row.html.erb deleted file mode 100644 index 4fcee0e..0000000 --- a/app/views/glsa/_edit_bug_row.html.erb +++ /dev/null @@ -1,13 +0,0 @@ - - - <%= bugready_icon(bug.bug_ready?) %> - - <%= bug.bug_id %> [BZ] - <%= truncate(bug.title, :length => 60) %> - - <%= link_to_function( - image_tag('icons/minus.png', :alt => 'Mark as deleted'), - "GLSAMaker.editing.bugs.del(#{bug.bug_id});" - ) %> - - diff --git a/app/views/glsa/_email_headers.txt.erb b/app/views/glsa/_email_headers.txt.erb deleted file mode 100644 index 3a750e6..0000000 --- a/app/views/glsa/_email_headers.txt.erb +++ /dev/null @@ -1,3 +0,0 @@ -To: gentoo-announce@lists.gentoo.org -Subject: [ GLSA <%= @glsa.glsa_id %> ] <%= @rev.title %> - diff --git a/app/views/glsa/_glsa.xml.builder b/app/views/glsa/_glsa.xml.builder deleted file mode 100644 index 9eeee69..0000000 --- a/app/views/glsa/_glsa.xml.builder +++ /dev/null @@ -1,74 +0,0 @@ -xml.instruct! -xml.declare! :DOCTYPE, :glsa, :SYSTEM, "http://www.gentoo.org/dtd/glsa.dtd" - -xml.glsa :id => glsa.glsa_id do - xml.title rev.title - xml.synopsis rev.synopsis - xml.product({:type => "ebuild"}, rev.product) - xml.announced glsa.release_date.strftime '%Y-%m-%d' - xml.revised({:count => "#{rev.release_revision || 'draft'}"}, glsa.revised_date.strftime('%Y-%m-%d')) - - rev.bugs.each do |bug| - xml.bug bug.bug_id - end - - xml.access rev.release_access - logger.debug rev.packages_by_atom.inspect - xml.affected do - rev.packages_by_atom.each_pair do |package, atoms| - xml.package({:name => package, :auto => (atoms['unaffected'] || []).select {|a| !a.automatic}.length == 0 ? 'yes' : 'no', - :arch => (atoms['vulnerable'].nil? || atoms['vulnerable'].length == 0) ? '*' : atoms['vulnerable'].first.arch}) do - (atoms['unaffected'] || []).each do |a| - if a.slot != '*' - xml.unaffected({:range => a.xml_comp, :slot => a.slot}, a.version) - else - xml.unaffected({:range => a.xml_comp}, a.version) - end - end - (atoms['vulnerable'] || []).each do |a| - if a.slot != '*' - xml.vulnerable({:range => a.xml_comp, :slot => a.slot}, a.version) - else - xml.vulnerable({:range => a.xml_comp}, a.version) - end - end - end - end - end - - xml.background do - xml << xml_format(rev.background || "") - end - - xml.description do - xml << xml_format(rev.description || "") - end - - xml.impact({:type => rev.severity}) do - xml << xml_format(rev.impact || "") - end - - xml.workaround do - xml << xml_format(rev.workaround || "") - end - - xml.resolution do - xml << xml_format(rev.resolution || "") - end - - xml.references do - rev.references.each do |ref| - xml.uri({:link => ref.url}, ref.title) - end - end - - xml.metadata({:tag => 'requester', :timestamp => glsa.created_at.iso8601}, glsa.requester.login) - - if glsa.submitter - xml.metadata({:tag => 'submitter', :timestamp => rev.created_at.iso8601}, glsa.submitter.login) - end - - if glsa.bugreadymaker - xml.metadata({:tag => 'bugReady', :timestamp => Time.now.iso8601}, glsa.bugreadymaker.login) - end -end diff --git a/app/views/glsa/_glsa_row.html.erb b/app/views/glsa/_glsa_row.html.erb deleted file mode 100644 index 5c12adf..0000000 --- a/app/views/glsa/_glsa_row.html.erb +++ /dev/null @@ -1,31 +0,0 @@ -<% if current_user.can_access? glsa %> - - - <%= status_icon glsa.status %> - <%= glsa.glsa_id %> - - - <%= bugready_icon glsa.last_revision.bug_ready? %> - <%= approval_icon glsa.approval_status %> - <%= workflow_icon(glsa.workflow_status(current_user)) %> - <%= restricted_icon glsa.restricted %> - - <% if view == :requests %> - <%= link_to(glsa.last_revision.title, {:controller => 'glsa', :action => 'edit', :id => glsa}, {:title => "Draft this GLSA"}) %> - <%= glsa.created_at %>, <%= glsa.requester.name %> (<%= glsa.requester.login %>) - <% else %> - <%= link_to(glsa.last_revision.title, {:controller => 'glsa', :action => 'show', :id => glsa}, {:title => "Show this GLSA"}) %> - <%= glsa.created_at %>, <%= glsa.submitter.name %> (<%= glsa.submitter.login %>) - <% end %> - - <% if current_user.is_el_jefe? %> - - <%= link_to(image_tag('icons/delete.png'), glsa_path(glsa), :confirm => "Are you sure you want to delete this draft?", :method => :delete) %> - - <% end %> - -<% end %> \ No newline at end of file diff --git a/app/views/glsa/_package.html.erb b/app/views/glsa/_package.html.erb deleted file mode 100644 index 5e3d115..0000000 --- a/app/views/glsa/_package.html.erb +++ /dev/null @@ -1,16 +0,0 @@ -<% comps = %w{ >= > *>= *> <= < *<= *< = } -%> - -<%= fields_for "glsa[package][]", package do |pf| %> - <%= pf.text_field :atom, :class => :nice, :index => nil %> - <%= pf.select :comp, comps, {}, :index => nil %> - <%= pf.text_field :version, :class => :nice, :size => 10, :index => nil %> - <%= pf.text_field :slot, :class => :nice, :size => 5, :index => nil %> - <%= pf.text_field :arch, :class => :nice, :size => 7, :index => nil %> - <%= pf.select :automatic, [["yes", true], ["no", false]], {}, :index => nil %> - <%= link_to_function( - image_tag('icons/package-remove.png', :alt => 'Remove package'), - "GLSAMaker.editing.packages.del(this)", - :title => 'Remove package') %> - <%= pf.hidden_field :my_type, :index => nil %> -<% end %> - diff --git a/app/views/glsa/_reference.html.erb b/app/views/glsa/_reference.html.erb deleted file mode 100644 index 8726060..0000000 --- a/app/views/glsa/_reference.html.erb +++ /dev/null @@ -1,10 +0,0 @@ - -<%= fields_for "glsa[reference][]", reference do |rf| %> - <%= rf.text_field :title, :class => :nice, :size => 18, :index => nil %> - <%= rf.text_field :url, :class => :nice, :index => nil %> - <%= link_to_function( - image_tag('icons/reference-remove.png', :alt => 'Remove reference'), - "GLSAMaker.editing.references.del(this)", - :title => 'Remove reference') %> -<% end %> - diff --git a/app/views/glsa/_show_bug_row.html.erb b/app/views/glsa/_show_bug_row.html.erb deleted file mode 100644 index 7eaad0c..0000000 --- a/app/views/glsa/_show_bug_row.html.erb +++ /dev/null @@ -1,7 +0,0 @@ - - <%= bugready_icon(bug.bug_ready?) %> - - <%= bug.bug_id %> - [BZ] - <%= truncate(bug.title, :length => 60) %> - \ No newline at end of file diff --git a/app/views/glsa/_show_package_row.txt.erb b/app/views/glsa/_show_package_row.txt.erb deleted file mode 100644 index 1ec0f95..0000000 --- a/app/views/glsa/_show_package_row.txt.erb +++ /dev/null @@ -1,49 +0,0 @@ -<%= (@packages_count += 1).to_s.rjust(3) + " " -%> -<%= if package.length <= 23 - package.ljust(23) - else - package + "\n" + ' ' * 28 - end -%> -<%= - -vulnerable_versions = (items['vulnerable'].sort_by { |p| p.version.to_i } if items.has_key? 'vulnerable') || [] -unaffected_versions = (items['unaffected'].sort_by { |p| p.version.to_i } if items.has_key? 'unaffected') || [] - -versions = [] - -print_vulnerable = (unaffected_versions.size == 0 ? true : false) -@print_vulnerable = true if print_vulnerable - -while vulnerable_versions.size > 0 or unaffected_versions.size > 0 - v = (vulnerable_versions.shift if vulnerable_versions.size > 0) || nil - print_slot = (v and v.slot != '*' ? true : false) - if print_slot - line = (v ? "#{v.comp} #{v.version}:#{v.slot}" : "").center(20) - else - line = (v ? "#{v.comp} #{v.version}" : "").center(20) - end - - if v and v.arch != '*' - @arches[@packages_count] ||= [] - @arches[@packages_count] += v.arch.split(' ') - end - - if print_vulnerable - line += "Vulnerable!".rjust(22) - print_vulnerable = false - else - v = (unaffected_versions.shift if unaffected_versions.size > 0) || nil - print_slot = (v and v.slot != '*' ? true : false) - if print_slot - line += (v ? "#{v.comp} #{v.version}:#{v.slot} #{v.automatic ? "" : (@print_noauto = true && "*")}" : "").rjust(22) - else - line += (v ? "#{v.comp} #{v.version} #{v.automatic ? "" : (@print_noauto = true && "*")}" : "").rjust(22) - end - end - versions << line -end - -versions.join("\n" + ' ' * 28).html_safe - --%> - diff --git a/app/views/glsa/_show_reference.txt.erb b/app/views/glsa/_show_reference.txt.erb deleted file mode 100644 index c29db6a..0000000 --- a/app/views/glsa/_show_reference.txt.erb +++ /dev/null @@ -1,2 +0,0 @@ -<%= prefixed_item("[ " + (@reference_number += 1).to_s.rjust(@max_digits_of_references) + " ]", reference.title) %> -<%= prefixed_item(" " * (@max_digits_of_references + 4), reference.url) %> diff --git a/app/views/glsa/_status_legend.html.erb b/app/views/glsa/_status_legend.html.erb deleted file mode 100644 index 070ac5d..0000000 --- a/app/views/glsa/_status_legend.html.erb +++ /dev/null @@ -1,38 +0,0 @@ -
      -

      Legend

      - - Status
      - <%= status_icon "request" %> Request
      - <%= status_icon "draft" %> Draft
      - <%= status_icon "release" %> Sent GLSA

      -
      - - - Bugs
      - <%= bugready_icon true %> All bugs ready
      - <%= bugready_icon false %> Not ready


      -
      - - - Approval
      - <%= approval_icon :approved %> Approved
      - <%= approval_icon :comments_pending %> Comments pending
      - <%= approval_icon :commented %> Commented
      - <%= approval_icon :none %> None -
      - - - Workflow
      - <%= workflow_icon :own %> Own draft
      - <%= workflow_icon :todo %> TODO items pending
      - <%= workflow_icon :commented %> You have commented
      - <%= workflow_icon :approved %> You have approved -
      - - - Embargo
      - <%= restricted_icon false %> public
      - <%= restricted_icon true %> confidential -
      -
      -
      \ No newline at end of file diff --git a/app/views/glsa/_template_popups.html.erb b/app/views/glsa/_template_popups.html.erb deleted file mode 100644 index 8abedfc..0000000 --- a/app/views/glsa/_template_popups.html.erb +++ /dev/null @@ -1,8 +0,0 @@ -<% GLSAMAKER_TEMPLATE_TARGETS.each do |target| %> - -<% end %> \ No newline at end of file diff --git a/app/views/glsa/archive.html.erb b/app/views/glsa/archive.html.erb deleted file mode 100644 index b8980be..0000000 --- a/app/views/glsa/archive.html.erb +++ /dev/null @@ -1,26 +0,0 @@ -

      - - <%= form_tag(archive_glsas_path, :remote => true) do -%> - <%= image_tag 'icons/calendar-select-month.png' %> - <%= date_select('view', 'month', :discard_day => true, :order => [:month, :year], :start_year => 2003, :end_year => Time.now.year + 1) %> - <%= image_submit_tag 'icons/next.png' %> - <% end -%> - - Released GLSAs in <%= Date::MONTHNAMES[@month] %> <%= @year %> -

      - - - - - - - - - <% if current_user.is_el_jefe? %><% end %> - - -<%= render :partial => "glsa_row", :collection => @glsas, :as => :glsa, :locals => { :view => :drafts } %> - -
      IDStateTitleLast changed at/byAdmin
      - -<%= render :partial => "status_legend" %> diff --git a/app/views/glsa/archive.js.erb b/app/views/glsa/archive.js.erb deleted file mode 100644 index 182e202..0000000 --- a/app/views/glsa/archive.js.erb +++ /dev/null @@ -1,2 +0,0 @@ -Element.update('date', 'in <%= escape_javascript(Date::MONTHNAMES[@month] + " " + @year.to_s) %>'); -Element.update('list', '<%= escape_javascript(@table.html_safe) %>'); \ No newline at end of file diff --git a/app/views/glsa/comment.html.erb b/app/views/glsa/comment.html.erb deleted file mode 100644 index 0faa416..0000000 --- a/app/views/glsa/comment.html.erb +++ /dev/null @@ -1,2 +0,0 @@ -

      Glsa#comment

      -

      Find me in app/views/glsa/comment.html.erb

      diff --git a/app/views/glsa/create.html.erb b/app/views/glsa/create.html.erb deleted file mode 100644 index b347c52..0000000 --- a/app/views/glsa/create.html.erb +++ /dev/null @@ -1,2 +0,0 @@ -

      Glsa#create

      -

      Find me in app/views/glsa/create.html.erb

      diff --git a/app/views/glsa/destroy.html.erb b/app/views/glsa/destroy.html.erb deleted file mode 100644 index e49b31d..0000000 --- a/app/views/glsa/destroy.html.erb +++ /dev/null @@ -1,2 +0,0 @@ -

      Glsa#destroy

      -

      Find me in app/views/glsa/destroy.html.erb

      diff --git a/app/views/glsa/diff.html.erb b/app/views/glsa/diff.html.erb deleted file mode 100644 index 1280084..0000000 --- a/app/views/glsa/diff.html.erb +++ /dev/null @@ -1,19 +0,0 @@ -

      Comparing revisions <%= params[:old] %> and <%= params[:new] %>

      - -
      - - <%= link_to "#{image_tag 'icons/draft.png'} Back".html_safe, {:controller => 'glsa', :action => 'show', :id => @glsa}, {:class => 'button'} %> - - <%= form_tag(:action => :diff, :id => @glsa.id) do %> - <%= submit_tag 'Compare' %> revisions - <%= select_tag :old, - options_from_collection_for_select(@glsa.revisions, :revid, :revid) %> (old) - and - <%= select_tag :new, - options_from_collection_for_select(@glsa.revisions, :revid, :revid) %> (new). - <% end %> -
      - -
      -<%= @diff %>
      -
      \ No newline at end of file diff --git a/app/views/glsa/drafts.html.erb b/app/views/glsa/drafts.html.erb deleted file mode 100644 index e727bd2..0000000 --- a/app/views/glsa/drafts.html.erb +++ /dev/null @@ -1,16 +0,0 @@ -

      Pooled GLSA drafts

      - - - - - - - - - <% if current_user.is_el_jefe? %><% end %> - - -<%= render :partial => "glsa_row", :collection => @glsas, :as => :glsa, :locals => { :view => :drafts } %> -
      IDStateTitleSubmitted at/byAdmin
      - -<%= render :partial => "status_legend" %> \ No newline at end of file diff --git a/app/views/glsa/edit.html.erb b/app/views/glsa/edit.html.erb deleted file mode 100644 index 000d1be..0000000 --- a/app/views/glsa/edit.html.erb +++ /dev/null @@ -1,177 +0,0 @@ -

      - Edit GLSA <%= @glsa.glsa_id %> -

      - -<%= form_for @glsa do |f| -%> -
      -
      - <%= box_title('Permissions', :icon => 'icons/permission.png') %> -

      : - -

      -
      - -
      - <%= box_title('Metadata', :icon => 'icons/metadata.png') %> -

      - -

      -

      - -

      -

      - <%= text_field_tag "glsa[product]", lastrev_content(@glsa, 'product'), :class => "nice" %> -

      -
      - -
      - <%= box_title('Background', :icon => 'icons/background.png', :label => 'background') %> -

      - -

      -
      - -
      - <%= box_title('Bugs', :icon => 'icons/bug.png', - :toolbar => [{:uri => "javascript:GLSAMaker.editing.bugs.add_dialog(#{@glsa.id})", :title => 'Add bug', :icon => 'icons/plus.png'}]) %> - - <%= render :partial => "edit_bug_row", :collection => @bugs, :as => :bug %> -
      -
      - - <%= render :partial => "comments" %> - -
      - -
      -
      - -
      -
      - <%= box_title('Title', :icon => 'icons/title.png', - :toolbar => [{:title => 'Add template', :uri => "javascript:GLSAMaker.editing.templates.dropdown(this, 'title');", :icon => 'icons/template.png'}]) %> -

      -
      - -
      - <%= box_title('Synopsis', :icon => 'icons/synopsis.png', :label => 'synopsis', - :toolbar => [ - {:title => 'Add template', :uri => "javascript:GLSAMaker.editing.templates.dropdown(this, 'synopsis');", :icon => 'icons/template.png'} - ] - ) %> -

      -
      - -
      - <%= box_title('Packages', :icon => 'icons/package.png') %> - - - - - - - - - - - - - - <%= render :partial => 'package', :collection => @vulnerable_packages %> -
      <%= image_tag 'icons/atom.png' %> AtomVersionSlot<%= image_tag 'icons/arch.png' %> Arch<%= image_tag 'icons/auto.png' %> Auto
      <%= image_tag 'icons/affected.png' %> Vulnerable - (<%= add_vulnerable_package_link(image_tag('icons/package-add.png')) %>)
      - - - - - - <%= render :partial => 'package', :collection => @unaffected_packages %> - -
      <%= image_tag 'icons/unaffected.png' %> Unaffected - (<%= add_unaffected_package_link(image_tag('icons/package-add.png')) %>)
      -
      - -
      - <%= box_title('Description', :icon => 'icons/document.png', :label => 'description', - :toolbar => [ - {:title => 'Add template', :uri => "javascript:GLSAMaker.editing.templates.dropdown(this, 'description');", :icon => 'icons/template.png'}, - {:title => 'Set default description', :uri => "javascript:generateDescription()", :icon => 'icons/document-go.png'}, - :sep, - {:title => 'Fewer lines', :uri => "javascript:lines('description', -5)", :icon => 'icons/zoom_out.png'}, - {:title => 'Reset lines', :uri => "javascript:$('description').rows = 15", :icon => 'icons/zoom_100.png'}, - {:title => 'More lines', :uri => "javascript:lines('description', 5)", :icon => 'icons/zoom_in.png'} - ] - ) %> -

      -
      - -
      - <%= box_title('Impact', :icon => 'icons/impact.png', :label => 'impact', - :toolbar => [ - {:title => 'Add template', :uri => "javascript:GLSAMaker.editing.templates.dropdown(this, 'impact');", :icon => 'icons/template.png'}, - :sep, - {:title => 'Fewer lines', :uri => "javascript:lines('impact', -5)", :icon => 'icons/zoom_out.png'}, - {:title => 'Reset lines', :uri => "javascript:$('impact').rows = 15", :icon => 'icons/zoom_100.png'}, - {:title => 'More lines', :uri => "javascript:lines('impact', 5)", :icon => 'icons/zoom_in.png'} - ] - ) %> -

      -
      - -
      - <%= box_title('Workaround', :icon => 'icons/workaround.png', :label => 'workaround', - :toolbar => [ - {:title => 'Add template', :uri => "javascript:GLSAMaker.editing.templates.dropdown(this, 'workaround');", :icon => 'icons/template.png'}, - {:title => 'No known workaround', :uri => "javascript:$('workaround').value = 'There is no known workaround at this time.'", :icon => 'icons/workaround-no.png'} - ] - ) %> -

      -
      - -
      - <%= box_title('Resolution', :icon => 'icons/resolution.png', :label => 'resolution', - :toolbar => [ - {:title => 'Add template', :uri => "javascript:GLSAMaker.editing.templates.dropdown(this, 'resolution');", :icon => 'icons/template.png'}, - {:title => 'Set default resolution', :uri => "javascript:generateResolution()", :icon => 'icons/resolution-go.png'} - ] - ) %> -

      -
      - -
      - <%= box_title('References', :icon => 'icons/reference.png', - :toolbar => [ - {:title => 'Add reference', :uri => "javascript:Element.insert('references_table', { bottom: '#{escape_javascript(render(:partial => 'reference', :object => Reference.new))}' })", :icon => 'icons/reference-add.png'} - ] - ) %> - - - - - - - - <%= render :partial => 'reference', :collection => @references %> -
      <%= image_tag 'icons/atom.png' %> Title<%= image_tag 'icons/reference.png' %> URL
      -
      - -
      - -<%- end -%> - -<%= template_popups %> - - diff --git a/app/views/glsa/finalize_release.html.erb b/app/views/glsa/finalize_release.html.erb deleted file mode 100644 index 57bf2c6..0000000 --- a/app/views/glsa/finalize_release.html.erb +++ /dev/null @@ -1,29 +0,0 @@ -

      Release finished

      - -
      -

      Release information

      - - - - - - - - - - -
      Official IDGLSA <%= @glsa.glsa_id %>
      Title<%= @glsa.last_revision.title %>
      -
      - -
      -

      Closed bugs

      - - - <% @glsa.last_revision.bugs.each do |bug| %> - - - - - <% end %> -
      <%= bug.bug_id %><%= bug.title %>
      -
      \ No newline at end of file diff --git a/app/views/glsa/import_references.html.erb b/app/views/glsa/import_references.html.erb deleted file mode 100644 index 63a0d30..0000000 --- a/app/views/glsa/import_references.html.erb +++ /dev/null @@ -1,16 +0,0 @@ -

      Please select the references to import:

      - -<%= form_tag(:go => '1') do -%> -
      - - <% @cves.each do |cve| %> - - - - - <% end %> -
      <%= render :partial => '/tools/cve', :object => cve %>
      -
      - -

      -<% end -%> \ No newline at end of file diff --git a/app/views/glsa/new-draft.html.erb b/app/views/glsa/new-draft.html.erb deleted file mode 100644 index 1c69b66..0000000 --- a/app/views/glsa/new-draft.html.erb +++ /dev/null @@ -1 +0,0 @@ -

      New draft...

      \ No newline at end of file diff --git a/app/views/glsa/new-request.html.erb b/app/views/glsa/new-request.html.erb deleted file mode 100644 index 1b0c845..0000000 --- a/app/views/glsa/new-request.html.erb +++ /dev/null @@ -1,60 +0,0 @@ -

      New GLSA request

      - -<%= form_tag(:action => "create") do %> -
      - - <%= box_title('Bugs', :icon => 'icons/bug.png') %> -

      - -

      - -
      -
      -
      -
      - <%= box_title('Title', :icon => 'icons/edit.png') %> -

      -
      -

      -
      -
      - -
      - <%= box_title('References', :icon => 'icons/reference.png') %> -

      - - -

      -
      -
      -<%- if current_user.access >= 1 -%> -
      - <%= box_title('Permissions', :icon => 'icons/permission.png') %> -

      : - -

      -
      -
      -<%- end -%> -
      - -
      -<% end -%> \ No newline at end of file diff --git a/app/views/glsa/new.html.erb b/app/views/glsa/new.html.erb deleted file mode 100644 index d7bb6a2..0000000 --- a/app/views/glsa/new.html.erb +++ /dev/null @@ -1,11 +0,0 @@ -

      New…

      - -
      -

      File a request for others to draft…

      -

      - Requests File a new request

      - -

      … or start drafting right away:

      -

      - Draft File a new draft

      -
      \ No newline at end of file diff --git a/app/views/glsa/prepare_release.html.erb b/app/views/glsa/prepare_release.html.erb deleted file mode 100644 index 3a2d5dc..0000000 --- a/app/views/glsa/prepare_release.html.erb +++ /dev/null @@ -1,112 +0,0 @@ -

      Prepare release

      - -
      -

      Advisory information

      - - - <% if @glsa.status == 'draft' %> - - - - - - - - - <% elsif @glsa.status == 'release' %> - - - - - <% end %> - - - - -
      Current IDGLSA <%= @glsa.glsa_id %>
      Final IDGLSA <%= Glsa.next_id %> (preliminary)
      Release IDGLSA <%= @glsa.glsa_id %> (this will be a re-release)
      Advisory title<%= @rev.title %>
      -
      - -
      -

      - - <%= check_icon(@rev.bug_ready?) %> - - <%= image_tag 'icons/bug.png' %> Bug Status -

      - - <%= render :partial => "show_bug_row", :collection => @rev.bugs, :as => :bug %> -
      - - <% if not @rev.bug_ready? %> -
      -

      - You cannot release this draft unless all bugs are in a bug ready state.
      - Visit Bugzilla and check the status of each bug marked with a <%= bugready_icon(false) %>, and set it to [glsa] if every arch is done. - Then, refresh the bug caches. -

      -
      - <%= button_to "Refresh bug caches and retry", { :action => 'update_cache', :id => @glsa.id, :redirect => request.url }, :method => 'get' %> -
      -
      - <% end %> -
      - -
      -

      - - <%= check_icon((@glsa.is_approved? or @comments_override)) %> - - <%= image_tag 'icons/comment.png' %> Review Status - (<%= @glsa.approvals.length %> <%= image_tag 'icons/approval.png' %>, <%= @glsa.rejections.length %> <%= image_tag 'icons/rejection.png' %>) -

      - - <%= render :partial => "approval_row", :collection => @glsa.approvals, :as => :comment %> - <%= render :partial => "approval_row", :collection => @glsa.rejections, :as => :comment %> -
      - - <% if not (@glsa.is_approved? or @comments_override) %> -
      -

      - You cannot release this draft unless it has at least two approvals.
      - Ask other Security members to review your draft. (Team leads can override this check.) - Then, refresh this page. -

      - <% if current_user.is_el_jefe? %> -
      - <%= button_to "Override this check (team leads only)", prepare_release_glsa_path(@glsa, :override_approvals => 1) %> -
      - <% end %> -
      - <% elsif @comments_override %> -

      - Approval override used. -

      - <% end %> -
      - -
      -

      - <%= image_tag 'icons/sent.png', :alt => 'release' %> Release -

      - <% if @rev.bug_ready? and (@glsa.is_approved? or @comments_override) %> -

      - All checks passed. You can release this advisory now. -

      - <%= form_tag(release_glsa_path(@glsa)) do %> - - - - - -
      <%= check_box_tag 'email' %>
      -
      - <%= submit_tag 'Release >', :class => 'largetext' %> -
      - <% end %> - <% else %> -

      - At least one check failed. Please see the red boxes above.
      - You cannot release this draft at the moment. -

      - <% end %> -
      \ No newline at end of file diff --git a/app/views/glsa/release.html.erb b/app/views/glsa/release.html.erb deleted file mode 100644 index eede6d2..0000000 --- a/app/views/glsa/release.html.erb +++ /dev/null @@ -1,31 +0,0 @@ -

      GLSA released

      - -
      -

      Release information

      - - - - - - - - - - -
      Official IDGLSA <%= @glsa.glsa_id %>
      Title<%= @rev.title %>
      -
      - -
      -

      Next steps

      - -

      - Now, download the advisory XML and publish it in Git.
      - Then you can send the advisory email and close the relevant bugs in Bugzilla. -

      - -
      - - - <%= button_to "Close bugs", finalize_release_glsa_path(@glsa, :close_bugs => '1'), :method => :post %> -
      -
      diff --git a/app/views/glsa/requests.html.erb b/app/views/glsa/requests.html.erb deleted file mode 100644 index 05b02fd..0000000 --- a/app/views/glsa/requests.html.erb +++ /dev/null @@ -1,16 +0,0 @@ -

      Pooled GLSA requests

      - - - - - - - - - <% if current_user.is_el_jefe? %><% end %> - - -<%= render :partial => "glsa_row", :collection => @glsas, :as => :glsa, :locals => { :view => :requests } %> -
      IDStateTitleRequested at/byAdmin
      - -<%= render :partial => "status_legend" %> \ No newline at end of file diff --git a/app/views/glsa/show.html.erb b/app/views/glsa/show.html.erb deleted file mode 100644 index 1da1a94..0000000 --- a/app/views/glsa/show.html.erb +++ /dev/null @@ -1,158 +0,0 @@ -

      - <%= sanitize(spelling(@rev.title), :tags => %w[span]) %> - <% if @glsa.restricted? %>(CONFIDENTIAL)<% end %> -

      - -
      - - Show revision: - <%= select_tag :revid, - options_from_collection_for_select(@glsa.revisions, :revid, :to_s, @rev.revid), - :onchange => "document.location = '#{url_for :controller=> :glsa, :action => :show, :id => @glsa}?rev_id=' + this.value" %> - - <%= link_to "#{image_tag 'icons/edit.png'} Edit this draft".html_safe, edit_glsa_path(@glsa), {:class => 'button'} %> - <%= link_to "#{image_tag 'icons/xml.png'} View as XML".html_safe, glsa_path(@glsa, :format => 'xml'), {:class => 'button'} %> - <%= link_to "#{image_tag 'icons/txt.png'} View as Text".html_safe, glsa_path(@glsa, :format => 'txt'), {:class => 'button'} %> - <%= link_to_function "#{image_tag 'icons/reference.png'} Import references".html_safe, "GLSAMaker.editing.references.import_dialog(#{@glsa.id})", {:class => 'button'} %> - <%= link_to "#{image_tag 'icons/diff.png'} Compare revisions".html_safe, diff_glsa_path(@glsa, :old => @glsa.last_revision.revid - 1, :new => @glsa.last_revision.revid), {:class => 'button'} %> - <%= link_to "#{image_tag 'icons/sent.png'} Release advisory".html_safe, prepare_release_glsa_path(@glsa), {:class => 'button'} if current_user.access >= 2 %> - <%= link_to "#{image_tag 'icons/delete.png'} Delete".html_safe, glsa_path(@glsa), :method => :delete, :confirm => "Do you really want to delete this item?", :class => 'button' if current_user.is_el_jefe? %> - <%= link_to "#{image_tag 'icons/bug.png'} Close bugs".html_safe, finalize_release_glsa_path(@glsa, :close_bugs => '1'), :method => :post, :class => 'button' if @glsa.status == 'release' %> -
      - -
      -
      -

      - GLSA <%= status_icon @glsa.status %> <%= @glsa.glsa_id %>:r<%= @rev.revid %> - <%= bugready_icon @rev.bug_ready? %> - <%= approval_icon @glsa.approval_status %> - <%= workflow_icon(@glsa.workflow_status(current_user)) %> - <%= restricted_icon @glsa.restricted %> -


      - <% if @glsa.is_approved? and @glsa.last_revision.bug_ready? %> -

      <%= image_tag 'icons/ok.png' %> This draft is ready for sending.

      - <% else %> -

      <%= image_tag 'icons/pending.png' %> This draft is not ready for sending.

      - <% end %> -

      - <%= @glsa.created_at.to_s %> - Requester: <%= @glsa.requester.to_s %> -

      - <% if @glsa.submitter %> -

      - <%= @glsa.updated_at.to_s %> - Submitter: <%= @glsa.submitter.to_s %> -

      - <% end %> -

      - <%= @glsa.updated_at.to_s %> - Editor: <%= @rev.user.to_s %> -

      -
      - -
      - <%= box_title("Bugs (#{@rev.bugs.count})", :icon => 'icons/bug.png', - :toolbar => [{:title => 'Update all cached metadata', :icon => 'icons/refresh.png', :uri => "/glsa/update_cache/#{@glsa.id}"}]) - %> - - <%= render :partial => "show_bug_row", :collection => @rev.bugs, :as => :bug %> -
      -
      - - <%= render :partial => "comments" %> -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      FieldContent
      <%= image_tag 'icons/access.png' %> Access - <%= @rev.access %> -
      <%= image_tag 'icons/severity.png' %> Severity - <%= @rev.severity %> -
      <%= image_tag 'icons/synopsis.png' %> Synopsis - <%= field_content(@rev.synopsis) %> -
      <%= image_tag 'icons/unaffected.png' %> Unaffected packages -
        - <% @rev.packages.each do |pkg| ; next unless pkg.my_type == "unaffected" %> -
      • <%= pkg.comp %><%= pkg.atom %>-<%= pkg.version %>:<%= pkg.slot %> on <%= pkg.arch %> (auto: <%= pkg.automatic %>)
      • - <% end %> -
      -
      <%= image_tag 'icons/affected.png' %> Vulnerable packages -
        - <% @rev.packages.each do |pkg| ; next unless pkg.my_type == "vulnerable" %> -
      • <%= pkg.comp %><%= pkg.atom %>-<%= pkg.version %>:<%= pkg.slot %> on <%= pkg.arch %> (auto: <%= pkg.automatic %>)
      • - <% end %> -
      -
      <%= image_tag 'icons/background.png' %> Background - <%= field_content(@rev.background) %> -
      <%= image_tag 'icons/document.png' %> Description - <%= field_content(@rev.description) %> -
      <%= image_tag 'icons/impact.png' %> Impact - <%= field_content(@rev.impact) %> -
      <%= image_tag 'icons/workaround.png' %> Workaround - <%= field_content(@rev.workaround) %> -
      <%= image_tag 'icons/resolution.png' %> Resolution - <%= field_content(@rev.resolution) %> -
      <%= image_tag 'icons/reference.png' %> References -
        - <% @rev.references.each do |r| %> -
      • <%= link_to r.title, r.url -%> - <% if r.title.start_with? 'CVE' %>
        - <% if (cve = Cve.where(:cve_id => r.title).first) != nil %> - <%= cve.summary %> - <% else %> - CVE not found in CVETool database. Double-check manually! - <% end %> - <% end %> -
      • - <% end %> -
      -
      - -
      diff --git a/app/views/glsa/show.txt.erb b/app/views/glsa/show.txt.erb deleted file mode 100644 index 91e570e..0000000 --- a/app/views/glsa/show.txt.erb +++ /dev/null @@ -1,116 +0,0 @@ -<%- @packages = @rev.packages_by_atom - @packages_count = 0 - @tf = ::Text::Format.new - @arches = {} -%> -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Gentoo Linux Security Advisory GLSA <%= @glsa.glsa_id %> -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - https://security.gentoo.org/ -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<%= prefixed_item(" Severity:", @rev.severity.capitalize.html_safe) %> -<%= prefixed_item(" Title:", @rev.title.html_safe) %> -<%= prefixed_item(" Date:", @glsa.release_date.strftime('%B %d, %Y')) %> -<%= prefixed_item(" Bugs:", @rev.bugs.map {|b| "\##{b.bug_id}" }.join(', ')) %> -<%= prefixed_item(" ID:", @glsa.glsa_id) %> - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Synopsis -======== - -<%= adv_wrap(@rev.synopsis).html_safe %> - -Background -========== - -<%= adv_wrap(@rev.background).html_safe %> - -Affected packages -================= - - ------------------------------------------------------------------- - Package / Vulnerable / Unaffected - ------------------------------------------------------------------- -<%- @packages.each do |package, items| -%> -<%= render :partial => "show_package_row", :locals => {:items => items, :package => package} -%> -<%- end -%> -<% if @print_vulnerable -%> - ------------------------------------------------------------------- - NOTE: Certain packages are still vulnerable. Users should migrate - to another package if one is available or wait for the - existing packages to be marked stable by their - architecture maintainers. -<% end -%> -<% if @print_noauto -%> - ------------------------------------------------------------------- - NOTE: Packages marked with asterisks require manual intervention! -<% end -%> -<% if @packages_count > 1 -%> - ------------------------------------------------------------------- - <%= @packages_count %> affected packages -<% end -%> -<% if @arches != {} -%> - ------------------------------------------------------------------- - <% @arches.each_pair do |num, arches| -%> - # Package <%= num %> only applies to users of these architectures: - <%= arches.sort.join ", " %> - <% end -%> -<% end -%> - -Description -=========== - -<%= adv_wrap(@rev.description).html_safe %> - -Impact -====== - -<%= adv_wrap(@rev.impact).html_safe %> - -Workaround -========== - -<%= adv_wrap(@rev.workaround).html_safe %> - -Resolution -========== - -<%= adv_wrap(@rev.resolution, true).html_safe %> - -References -========== - -<% @reference_number = 0 - @max_digits_of_references = @rev.references.size.to_s.size - - -%> -<%= render :partial => "show_reference", :as => :reference, :collection => @rev.references -%> - -Availability -============ - -This GLSA and any updates to it are available for viewing at -the Gentoo Security Website: - - https://security.gentoo.org/glsa/<%= @glsa.glsa_id %> - -Concerns? -========= - -Security is a primary focus of Gentoo Linux and ensuring the -confidentiality and security of our users' machines is of utmost -importance to us. Any security concerns should be addressed to -security@gentoo.org or alternatively, you may file a bug at -https://bugs.gentoo.org. - -License -======= - -Copyright <%= Time.now.year %> Gentoo Foundation, Inc; referenced text -belongs to its owner(s). - -The contents of this document are licensed under the -Creative Commons - Attribution / Share Alike license. - -https://creativecommons.org/licenses/by-sa/2.5 diff --git a/app/views/glsa/show.xml.erb b/app/views/glsa/show.xml.erb deleted file mode 100644 index 58ece79..0000000 --- a/app/views/glsa/show.xml.erb +++ /dev/null @@ -1 +0,0 @@ -<%= Glsamaker::XML.indent(render(:partial => 'glsa', :locals => {:glsa => @glsa, :rev => @rev}), {:indent => 2, :maxcols => 80}).html_safe %> \ No newline at end of file diff --git a/app/views/glsa/update.html.erb b/app/views/glsa/update.html.erb deleted file mode 100644 index 0a886cd..0000000 --- a/app/views/glsa/update.html.erb +++ /dev/null @@ -1,2 +0,0 @@ -

      Glsa#update

      -

      Find me in app/views/glsa/update.html.erb

      diff --git a/app/views/glsa_mailer/approval.text.erb b/app/views/glsa_mailer/approval.text.erb deleted file mode 100644 index 939e07c..0000000 --- a/app/views/glsa_mailer/approval.text.erb +++ /dev/null @@ -1,23 +0,0 @@ -Your draft is now approved. - -Approval overview ------------------ -<% @glsa.approvals.each do |approval| -%> -<%= approval.created_at.rfc2822 %> by <%= approval.user.to_s %> -<% end -%> - -<% if @glsa.rejections.count > 0 -%> -Rejection overview ------------------- -<% @glsa.rejections.each do |rejection| -%> -<%= rejection.created_at.rfc2822 %> by <%= rejection.user.to_s %> -<% end -%> -<% end -%> - -You should check whether all bugs linked in the draft are in a bug ready state. -Then, you can release the advisory at <%= prepare_release_glsa_url(@glsa) %> - -Thanks for your work! - --- -This email notification is brought to you by GLSAMaker 2. \ No newline at end of file diff --git a/app/views/glsa_mailer/comment.text.erb b/app/views/glsa_mailer/comment.text.erb deleted file mode 100644 index 901eede..0000000 --- a/app/views/glsa_mailer/comment.text.erb +++ /dev/null @@ -1,8 +0,0 @@ -Your draft received a comment (<%= @comment.rating %>) from <%= @commentator.to_s %> @ <%= @comment.created_at.rfc2822 %>: - -<%= glsa_url(@glsa) %> - -<%= @comment.text %> - --- -This email notification is brought to you by GLSAMaker 2. \ No newline at end of file diff --git a/app/views/glsa_mailer/edit.text.erb b/app/views/glsa_mailer/edit.text.erb deleted file mode 100644 index cf45a06..0000000 --- a/app/views/glsa_mailer/edit.text.erb +++ /dev/null @@ -1,8 +0,0 @@ -The draft was edited by <%= @editor.to_s %> @ <%= @glsa.last_revision.created_at.rfc2822 %>: - -<%= glsa_url(@glsa) %> - -<%= @diff.html_safe %> - --- -This email notification is brought to you by GLSAMaker 2. \ No newline at end of file diff --git a/app/views/glsa_mailer/new_request.text.erb b/app/views/glsa_mailer/new_request.text.erb deleted file mode 100644 index dadb8d0..0000000 --- a/app/views/glsa_mailer/new_request.text.erb +++ /dev/null @@ -1,13 +0,0 @@ -A new request was filed by <%= @requestor.to_s %> @ <%= @glsa.last_revision.created_at.rfc2822 %>: - -<%= @glsa.last_revision.title %> -<%= "-" * @glsa.last_revision.title.length %> - -<%= glsa_url(@glsa) %> - -Bugs: -<% @glsa.last_revision.bugs.each do |bug| %> - * <%= bug.bug_id %><%= " (#{bug.title})" if bug.title %> -<% end %> --- -This email notification is brought to you by GLSAMaker 2. \ No newline at end of file diff --git a/app/views/glsa_mailer/text.text.erb b/app/views/glsa_mailer/text.text.erb deleted file mode 100644 index 8279bb9..0000000 --- a/app/views/glsa_mailer/text.text.erb +++ /dev/null @@ -1,4 +0,0 @@ -<%= @text %> -<% if @footer %> --- -This email notification is brought to you by GLSAMaker 2.<% end %> \ No newline at end of file diff --git a/app/views/index/about.html.erb b/app/views/index/about.html.erb deleted file mode 100644 index bf2cbcc..0000000 --- a/app/views/index/about.html.erb +++ /dev/null @@ -1,29 +0,0 @@ -
      <%= image_tag('biglogo.png', :alt => "GLSAMaker 2 Logo'") %>
      - -
      -

      <%= image_tag('icons/user.png') %> Brought to you by…

      - -
      - -
      -

      <%= image_tag('icons/reference.png') %> License

      -

      Copyright © 2009–15 Alex Legler

      -

      Copyright © 2009 Pierre-Yves Rofes

      -

      Copyright © 2010 Tobias Heinlein

      -

      GLSAMaker 2 is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License - as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

      -
      - -
      -

      <%= image_tag('icons/comment.png') %> Acknowledgements

      - -

      The CVETool uses the UKI Javascript UI Toolkit by Vladimir Kolesnikov. Licensed under the MIT License.

      -

      GLSAMaker2 uses the "Silk" iconset by Mark James. Licensed under the CC Attribution 3.0 License.

      -

      GLSAMaker2 uses the "Fugue" iconset by Yusuke Kamiyamane. Licensed under the CC Attribution 3.0 License.

      -

      The header uses portions of Redmine. © Jean-Philippe Lang. Licensed under the GPL.

      - -
      diff --git a/app/views/index/error-access.html.erb b/app/views/index/error-access.html.erb deleted file mode 100644 index f183064..0000000 --- a/app/views/index/error-access.html.erb +++ /dev/null @@ -1,7 +0,0 @@ -

      Access Denied

      - -

      You do not have sufficient permissions to perform this action.

      -

      The administrator has been notified.

      -


      -

      You can get in touch with the administrative contact at -<%= GLSAMAKER_ADMIN_EMAIL %>

      \ No newline at end of file diff --git a/app/views/index/error-disabled.html.erb b/app/views/index/error-disabled.html.erb deleted file mode 100644 index 53a8f44..0000000 --- a/app/views/index/error-disabled.html.erb +++ /dev/null @@ -1,5 +0,0 @@ -

      Access Denied

      - -

      Your account has been disabled.

      -

      You can get in touch with the administrative contact at -<%= GLSAMAKER_ADMIN_EMAIL %>

      diff --git a/app/views/index/error-system.html.erb b/app/views/index/error-system.html.erb deleted file mode 100644 index e6fafa2..0000000 --- a/app/views/index/error-system.html.erb +++ /dev/null @@ -1,8 +0,0 @@ -

      Fatal error

      - -

      Couldn't get user authentication data.

      -

      Ruby on Rails is running in the production environment.
      -In this environment, GLSAMaker receives the name of the logged in user via the -REMOTE_USER or HTTP_AUTHORIZATION variables which both are empty.

      -

      Please get in touch with the administrative contact -(<%= GLSAMAKER_ADMIN_EMAIL %>) to fix this issue.

      \ No newline at end of file diff --git a/app/views/index/error-user.html.erb b/app/views/index/error-user.html.erb deleted file mode 100644 index 54c8032..0000000 --- a/app/views/index/error-user.html.erb +++ /dev/null @@ -1,7 +0,0 @@ -

      Welcome to GLSAMaker!

      - -

      This is most likely your first visit.

      -

      While your user name and password were entered into the HTTP authentication database, -your account was not yet populated to the internal GLSAMaker database.

      -

      Either retry in a few minutes or get in touch with the administrative contact -(<%= GLSAMAKER_ADMIN_EMAIL %>) to fix this issue.

      \ No newline at end of file diff --git a/app/views/index/index.html.erb b/app/views/index/index.html.erb deleted file mode 100644 index dd0a2b0..0000000 --- a/app/views/index/index.html.erb +++ /dev/null @@ -1,18 +0,0 @@ -

      Welcome to GLSAMaker2!

      - -
      -

      My last 10 drafts

      - - - - - - - - - <% if current_user.is_el_jefe? %><% end %> - - - <%= render :partial => "glsa/glsa_row", :collection => @my_drafts, :as => :glsa, :locals => { :view => :drafts } %> -
      IDStateTitleSubmitted at/byAdmin
      -
      \ No newline at end of file diff --git a/app/views/index/profile.html.erb b/app/views/index/profile.html.erb deleted file mode 100644 index d346647..0000000 --- a/app/views/index/profile.html.erb +++ /dev/null @@ -1,34 +0,0 @@ -

      My Profile

      - -<% form_tag :action => 'update' do |f| -%> -

      Email preferences

      - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Send me an Email when...
      />
      />
      />
      />
      />
      - -

      -<% end %> \ No newline at end of file diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb deleted file mode 100644 index 4120f34..0000000 --- a/app/views/layouts/application.html.erb +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - <% if @pageTitle%><%= @pageTitle %> — <% end %>GLSAMaker 2 - <%= stylesheet_link_tag "application" %> - <%= javascript_include_tag "application" %> - <%= csrf_meta_tags %> - - -
      -
      -
        - -
      -
      - - -
      - - - - <%- if flash[:notice] or flash[:error] -%> -
      "> - <%= link_to_function(image_tag('icons/close.png'), {:style => 'float: right;', :alt => 'Hide the notification'}) do |page| - page[:flash].drop_out - end %> - <%- if flash[:error] -%> - <%= image_tag 'icons/error.png', :style => 'vertical-align: middle' %> - <%- else -%> - <%= image_tag 'icons/info.png', :style => 'vertical-align: middle' %> - <%- end -%> - <%= flash[:error] ? flash[:error] : flash[:notice] %> -
      - <%- end -%> -
      -<%= yield %> -
      - -
      - - diff --git a/app/views/layouts/cve.html.erb b/app/views/layouts/cve.html.erb deleted file mode 100644 index 14f7922..0000000 --- a/app/views/layouts/cve.html.erb +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - <%= @pageTitle + " — "if @pageTitle%> GLSAMaker 2 — CVETool - <%= javascript_include_tag 'jsui' %> - <%= stylesheet_link_tag "cve" %> - - - - - <%= yield %> - - \ No newline at end of file diff --git a/app/views/layouts/none.html.erb b/app/views/layouts/none.html.erb deleted file mode 100644 index cd9bb66..0000000 --- a/app/views/layouts/none.html.erb +++ /dev/null @@ -1 +0,0 @@ -<%= yield %> \ No newline at end of file diff --git a/app/views/layouts/notice.html.erb b/app/views/layouts/notice.html.erb deleted file mode 100644 index 38b9b33..0000000 --- a/app/views/layouts/notice.html.erb +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - <% if @pageTitle%><%= @pageTitle %> — <% end %>GLSAMaker 2 - <%= stylesheet_link_tag "login" %> - <%= csrf_meta_tags %> - - -
      -
      -
      -
      -
      - <%= yield %> -
      -
      -
      -
      -
      - - \ No newline at end of file diff --git a/app/views/search/_cve_row.html.erb b/app/views/search/_cve_row.html.erb deleted file mode 100644 index 71a5eee..0000000 --- a/app/views/search/_cve_row.html.erb +++ /dev/null @@ -1,6 +0,0 @@ - - <%= link_to_function cve.colorize(:cve_id).html_safe, "cvepopup('#{cve.cve_id}')" %> - <%= cve.state %> - <%= sanitize(cve.excerpts.summary, :tags => %w[span], :attributes => %w[class]) %> - <%= cve.cvss %> - \ No newline at end of file diff --git a/app/views/search/_cves.html.erb b/app/views/search/_cves.html.erb deleted file mode 100644 index e3f66ab..0000000 --- a/app/views/search/_cves.html.erb +++ /dev/null @@ -1,13 +0,0 @@ -
      -

      CVEs

      - - - - - - - - - <%= render :partial => "cve_row", :collection => results, :as => :cve %> -
      IDStateSummaryCVSS Score
      -
      \ No newline at end of file diff --git a/app/views/search/_glsas.html.erb b/app/views/search/_glsas.html.erb deleted file mode 100644 index 28855b0..0000000 --- a/app/views/search/_glsas.html.erb +++ /dev/null @@ -1,14 +0,0 @@ -
      -

      GLSAs

      - - - - - - - - <% if current_user.is_el_jefe? %><% end %> - - <%= render :partial => "/glsa/glsa_row", :collection => results, :as => :glsa, :locals => { :view => :requests } %> -
      IDStateTitleLast changed at/byAdmin
      -
      \ No newline at end of file diff --git a/app/views/search/results.html.erb b/app/views/search/results.html.erb deleted file mode 100644 index c8c6cb2..0000000 --- a/app/views/search/results.html.erb +++ /dev/null @@ -1,19 +0,0 @@ -

      Search results for "<%= params[:q] %>"

      - -<%- if @error -%> -<%= error_msg("The search daemon is currently not available. Please contact " + GLSAMAKER_ADMIN_EMAIL) %> -<%- else -%> - - <%- if @results.include? 'Glsa' -%> -<%= render :partial => "glsas", :locals => {:results => @results['Glsa']} %> -<%- end -%> - -<%- if @results.include? 'Cve' -%> -<%= render :partial => "cves", :locals => {:results => @results['Cve']} %> -<%- end -%> - -<%- if @results.empty? -%> -<%= image_tag 'icons/error.png' %> No results found. :( -<%- end -%> - -<%- end -%> \ No newline at end of file diff --git a/app/views/tools/_cve.html.erb b/app/views/tools/_cve.html.erb deleted file mode 100644 index 25ccde7..0000000 --- a/app/views/tools/_cve.html.erb +++ /dev/null @@ -1,4 +0,0 @@ -

      - <%= cve.cve_id%>: - <%= cve.summary%> -

      \ No newline at end of file diff --git a/app/views/tools/ajaxbugs.html.erb b/app/views/tools/ajaxbugs.html.erb deleted file mode 100644 index 493c4d9..0000000 --- a/app/views/tools/ajaxbugs.html.erb +++ /dev/null @@ -1,10 +0,0 @@ -
        - <% @bugs.each do |bug| %> - <% if bug.is_a?(String) %> -
      • <%= bug %>
      • - <% else %> -
      • <%= link_to_function bug.bug_id, "buginfo('#{bug.bug_id}')" %>: - <%= truncate(bug.summary, :length => 50) %>
      • - <% end %> - <% end %> -
      \ No newline at end of file diff --git a/app/views/tools/ajaxdescr.html.erb b/app/views/tools/ajaxdescr.html.erb deleted file mode 100644 index d63bcc7..0000000 --- a/app/views/tools/ajaxdescr.html.erb +++ /dev/null @@ -1,3 +0,0 @@ - - -<%= @text %> \ No newline at end of file diff --git a/app/views/tools/background.html.erb b/app/views/tools/background.html.erb deleted file mode 100644 index 4136f3b..0000000 --- a/app/views/tools/background.html.erb +++ /dev/null @@ -1,3 +0,0 @@ -

      Using <%= params[:id] %>.

      - -<%= Glsamaker::Portage.get_description(params[:id]) %> \ No newline at end of file diff --git a/app/views/tools/template.js.erb b/app/views/tools/template.js.erb deleted file mode 100644 index 77fabdb..0000000 --- a/app/views/tools/template.js.erb +++ /dev/null @@ -1,7 +0,0 @@ -<% if @error.nil? -%> -GLSAMaker.editing.templates.close($('templates-<%= @target %>')); -var target = $('<%= @target %>'); -target.setValue(target.getValue() + "<%= escape_javascript(@template.text).html_safe %>"); -<% else -%> -alert("<%= escape_javascript(@error) %>"); -<% end -%> diff --git a/assets/.keep b/assets/.keep new file mode 100644 index 0000000..e69de29 diff --git a/bin/.keep b/bin/.keep new file mode 100644 index 0000000..e69de29 diff --git a/bin/bundle b/bin/bundle deleted file mode 100755 index 66e9889..0000000 --- a/bin/bundle +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env ruby -ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) -load Gem.bin_path('bundler', 'bundle') diff --git a/bin/rails b/bin/rails deleted file mode 100755 index 5191e69..0000000 --- a/bin/rails +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env ruby -APP_PATH = File.expand_path('../../config/application', __FILE__) -require_relative '../config/boot' -require 'rails/commands' diff --git a/bin/rake b/bin/rake deleted file mode 100755 index 1724048..0000000 --- a/bin/rake +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env ruby -require_relative '../config/boot' -require 'rake' -Rake.application.run diff --git a/bin/setup b/bin/setup deleted file mode 100755 index acdb2c1..0000000 --- a/bin/setup +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env ruby -require 'pathname' - -# path to your application root. -APP_ROOT = Pathname.new File.expand_path('../../', __FILE__) - -Dir.chdir APP_ROOT do - # This script is a starting point to setup your application. - # Add necessary setup steps to this file: - - puts "== Installing dependencies ==" - system "gem install bundler --conservative" - system "bundle check || bundle install" - - # puts "\n== Copying sample files ==" - # unless File.exist?("config/database.yml") - # system "cp config/database.yml.sample config/database.yml" - # end - - puts "\n== Preparing database ==" - system "bin/rake db:setup" - - puts "\n== Removing old logs and tempfiles ==" - system "rm -f log/*" - system "rm -rf tmp/cache" - - puts "\n== Restarting application server ==" - system "touch tmp/restart.txt" -end diff --git a/config.ru b/config.ru deleted file mode 100644 index 1afbd55..0000000 --- a/config.ru +++ /dev/null @@ -1,4 +0,0 @@ -# This file is used by Rack-based servers to start the application. - -require ::File.expand_path('../config/environment', __FILE__) -run Glsamaker::Application diff --git a/config/application.rb b/config/application.rb deleted file mode 100644 index a860bbf..0000000 --- a/config/application.rb +++ /dev/null @@ -1,38 +0,0 @@ -require File.expand_path('../boot', __FILE__) - -require 'rails/all' - -# Require the gems listed in Gemfile, including any gems -# you've limited to :test, :development, or :production. -Bundler.require(:default, Rails.env) - -module Glsamaker - class Application < Rails::Application - # Settings in config/environments/* take precedence over those specified here. - # Application configuration should go into files in config/initializers - # -- all .rb files in that directory are automatically loaded. - config.autoload_paths += ["#{config.root}/lib"] - - config.assets.precompile += %w( cve.css jsui.js ) - - # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. - # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. - # config.time_zone = 'Central Time (US & Canada)' - - # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. - # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] - # config.i18n.default_locale = :de - - # Configure the default encoding used in templates for Ruby 1.9. - config.encoding = "utf-8" - - # Configure sensitive parameters which will be filtered from the log file. - config.filter_parameters += [:password] - - # This will become standard in Rails 5.0 - config.active_record.raise_in_transactional_callbacks = true - end -end - -# Manually load the kramdown extensions -require_relative '../lib/kramdown_ext' diff --git a/config/boot.rb b/config/boot.rb deleted file mode 100644 index 6b750f0..0000000 --- a/config/boot.rb +++ /dev/null @@ -1,3 +0,0 @@ -ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) - -require 'bundler/setup' # Set up gems listed in the Gemfile. diff --git a/config/database.yml.mysql b/config/database.yml.mysql deleted file mode 100644 index 0a0610d..0000000 --- a/config/database.yml.mysql +++ /dev/null @@ -1,42 +0,0 @@ -# MySQL. Versions 4.1 and 5.0 are recommended. -# -# Install the MYSQL driver -# gem install mysql2 -# -# Ensure the MySQL gem is defined in your Gemfile -# gem 'mysql2' -# -# And be sure to use new-style password hashing: -# http://dev.mysql.com/doc/refman/5.0/en/old-client.html -development: - adapter: mysql2 - encoding: utf8 - reconnect: false - database: glsamaker_development - pool: 5 -# username: root -# password: -# socket: /tmp/mysql.sock - -# Warning: The database defined as "test" will be erased and -# re-generated from your development database when you run "rake". -# Do not set this db to the same as development or production. -test: - adapter: mysql2 - encoding: utf8 - reconnect: false - database: glsamaker_test - pool: 5 -# username: root -# password: -# socket: /tmp/mysql.sock - -production: - adapter: mysql2 - encoding: utf8 - reconnect: false - database: glsamaker_production - pool: 5 -# username: root -# password: -# socket: /tmp/mysql.sock diff --git a/config/deploy.rb b/config/deploy.rb deleted file mode 100644 index 654a641..0000000 --- a/config/deploy.rb +++ /dev/null @@ -1,37 +0,0 @@ -require 'thinking_sphinx/deploy/capistrano' -require 'bundler/capistrano' - -set :application, "glsamaker" -set :repository, "git://git.overlays.gentoo.org/proj/glsamaker.git" - -set :use_sudo, false - -set :scm, :git - -role :web, "pitaya.gentoo-ev.org" -role :app, "pitaya.gentoo-ev.org" -role :db, "pitaya.gentoo-ev.org", :primary => true - -set :user, 'glsamaker' -set :deploy_to, "/var/www/glsamaker" - -namespace :deploy do - task :start do ; end - task :stop do ; end - task :restart, :roles => :app, :except => { :no_release => true } do - run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}" - end - - task :init do - top.upload("config/deploy.private.rb", "#{deploy_to}/current/tmp/deploy.private.rb", {:mode => '0600'}) - run "cd #{deploy_to}/current/ && ./script/config_init" - end - - desc "precompile the assets" - task :precompile_assets, :roles => :web, :except => { :no_release => true } do - run "cd #{current_path}; rm -rf public/assets/*" - run "cd #{current_path}; RAILS_ENV=production bundle exec rake assets:precompile" - end - - after "deploy:symlink", "deploy:init", "deploy:precompile_assets" -end diff --git a/config/environment.rb b/config/environment.rb deleted file mode 100644 index 8ec6d35..0000000 --- a/config/environment.rb +++ /dev/null @@ -1,9 +0,0 @@ -# Load the rails Rpplication -require File.expand_path('../application', __FILE__) - -# Initialize the Rails application -Rails.application.initialize! - -GLSAMAKER_VERSION = '2.1.18' - -require 'digest/md5' diff --git a/config/environments/development.rb b/config/environments/development.rb deleted file mode 100644 index b55e214..0000000 --- a/config/environments/development.rb +++ /dev/null @@ -1,41 +0,0 @@ -Rails.application.configure do - # Settings specified here will take precedence over those in config/application.rb. - - # In the development environment your application's code is reloaded on - # every request. This slows down response time but is perfect for development - # since you don't have to restart the web server when you make code changes. - config.cache_classes = false - - # Do not eager load code on boot. - config.eager_load = false - - # Show full error reports and disable caching. - config.consider_all_requests_local = true - config.action_controller.perform_caching = false - - # Don't care if the mailer can't send. - config.action_mailer.raise_delivery_errors = false - - # Print deprecation notices to the Rails logger. - config.active_support.deprecation = :log - - # Raise an error on page load if there are pending migrations. - config.active_record.migration_error = :page_load - - # Debug mode disables concatenation and preprocessing of assets. - # This option may cause significant delays in view rendering with a large - # number of complex assets. - config.assets.debug = true - - # Asset digests allow you to set far-future HTTP expiration dates on all assets, - # yet still be able to expire them through the digest params. - config.assets.digest = true - - # Adds additional error checking when serving assets at runtime. - # Checks for improperly declared sprockets dependencies. - # Raises helpful error messages. - config.assets.raise_runtime_errors = true - - # Raises error for missing translations - # config.action_view.raise_on_missing_translations = true -end diff --git a/config/environments/production.rb b/config/environments/production.rb deleted file mode 100644 index 8e8a630..0000000 --- a/config/environments/production.rb +++ /dev/null @@ -1,83 +0,0 @@ -Rails.application.configure do - # Settings specified here will take precedence over those in config/application.rb. - - # Code is not reloaded between requests. - config.cache_classes = true - - # Eager load code on boot. This eager loads most of Rails and - # your application in memory, allowing both threaded web servers - # and those relying on copy on write to perform better. - # Rake tasks automatically ignore this option for performance. - config.eager_load = true - - # Full error reports are disabled and caching is turned on. - config.consider_all_requests_local = false - config.action_controller.perform_caching = true - - # Enable Rack::Cache to put a simple HTTP cache in front of your application - # Add `rack-cache` to your Gemfile before enabling this. - # For large-scale production use, consider using a caching reverse proxy like nginx, varnish or squid. - # config.action_dispatch.rack_cache = true - - # Disable Rails's static asset server (Apache or nginx will already do this). - config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present? - - # Compress JavaScripts and CSS. - config.assets.compress = false - # config.assets.js_compressor = :uglifier - # config.assets.css_compressor = :sass - - # Do not fallback to assets pipeline if a precompiled asset is missed. - config.assets.compile = true - - # Generate digests for assets URLs. - config.assets.digest = true - - # Specifies the header that your server uses for sending files. - # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache - config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx - - # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. - config.force_ssl = true - - # Set to :debug to see everything in the log. - config.log_level = :info - - # Prepend all log lines with the following tags. - # config.log_tags = [ :subdomain, :uuid ] - - # Use a different logger for distributed setups. - # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new) - - # Use a different cache store in production. - # config.cache_store = :mem_cache_store - - # Enable serving of images, stylesheets, and JavaScripts from an asset server. - # config.action_controller.asset_host = "http://assets.example.com" - - # Precompile additional assets. - # application.js, application.css, and all non-JS/CSS in app/assets folder are already added. - # config.assets.precompile += %w( cve.css jsui.js ) - - # Ignore bad email addresses and do not raise email delivery errors. - # Set this to true and configure the email server for immediate delivery to raise delivery errors. - config.action_mailer.raise_delivery_errors = true - - # Enable locale fallbacks for I18n (makes lookups for any locale fall back to - # the I18n.default_locale when a translation can not be found). - config.i18n.fallbacks = true - - # Send deprecation notices to registered listeners. - config.active_support.deprecation = :notify - - # Disable automatic flushing of the log to improve performance. - # config.autoflush_log = false - - # Use default logging formatter so that PID and timestamp are not suppressed. - config.log_formatter = ::Logger::Formatter.new - - # Other Sendmail config - config.action_mailer.delivery_method = :sendmail - config.action_mailer.sendmail_settings = { :location => '/usr/sbin/sendmail', :arguments => '-i -t -f glsamaker@gentoo.org' } - -end diff --git a/config/environments/test.rb b/config/environments/test.rb deleted file mode 100644 index 1c19f08..0000000 --- a/config/environments/test.rb +++ /dev/null @@ -1,42 +0,0 @@ -Rails.application.configure do - # Settings specified here will take precedence over those in config/application.rb. - - # The test environment is used exclusively to run your application's - # test suite. You never need to work with it otherwise. Remember that - # your test database is "scratch space" for the test suite and is wiped - # and recreated between test runs. Don't rely on the data there! - config.cache_classes = true - - # Do not eager load code on boot. This avoids loading your whole application - # just for the purpose of running a single test. If you are using a tool that - # preloads Rails for running tests, you may have to set it to true. - config.eager_load = false - - # Configure static file server for tests with Cache-Control for performance. - config.serve_static_files = true - config.static_cache_control = 'public, max-age=3600' - - # Show full error reports and disable caching. - config.consider_all_requests_local = true - config.action_controller.perform_caching = false - - # Raise exceptions instead of rendering exception templates. - config.action_dispatch.show_exceptions = false - - # Disable request forgery protection in test environment. - config.action_controller.allow_forgery_protection = false - - # Tell Action Mailer not to deliver emails to the real world. - # The :test delivery method accumulates sent emails in the - # ActionMailer::Base.deliveries array. - config.action_mailer.delivery_method = :test - - # Randomize the order test cases are executed. - config.active_support.test_order = :random - - # Print deprecation notices to the stderr. - config.active_support.deprecation = :stderr - - # Raises error for missing translations - # config.action_view.raise_on_missing_translations = true -end diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb deleted file mode 100644 index 01ef3e6..0000000 --- a/config/initializers/assets.rb +++ /dev/null @@ -1,11 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Version of your assets, change this if you want to expire all your assets. -Rails.application.config.assets.version = '1.0' - -# Add additional assets to the asset load path -# Rails.application.config.assets.paths << Emoji.images_path - -# Precompile additional assets. -# application.js, application.css, and all non-JS/CSS in app/assets folder are already added. -# Rails.application.config.assets.precompile += %w( search.js ) diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb deleted file mode 100644 index 59385cd..0000000 --- a/config/initializers/backtrace_silencers.rb +++ /dev/null @@ -1,7 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. -# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } - -# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. -# Rails.backtrace_cleaner.remove_silencers! diff --git a/config/initializers/cookies_serializer.rb b/config/initializers/cookies_serializer.rb deleted file mode 100644 index ac5f8b6..0000000 --- a/config/initializers/cookies_serializer.rb +++ /dev/null @@ -1,3 +0,0 @@ -# Be sure to restart your server when you modify this file. - -Rails.application.config.action_dispatch.cookies_serializer = :marshal diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb deleted file mode 100644 index 4a994e1..0000000 --- a/config/initializers/filter_parameter_logging.rb +++ /dev/null @@ -1,4 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Configure sensitive parameters which will be filtered from the log file. -Rails.application.config.filter_parameters += [:password] diff --git a/config/initializers/glsamaker-global.rb b/config/initializers/glsamaker-global.rb deleted file mode 100644 index 8f85b00..0000000 --- a/config/initializers/glsamaker-global.rb +++ /dev/null @@ -1,2 +0,0 @@ -# The fields that templates can be applied on -GLSAMAKER_TEMPLATE_TARGETS = %w[ title synopsis description impact workaround resolution ] diff --git a/config/initializers/glsamaker.rb.sample b/config/initializers/glsamaker.rb.sample deleted file mode 100644 index 7282279..0000000 --- a/config/initializers/glsamaker.rb.sample +++ /dev/null @@ -1,48 +0,0 @@ -# GLSAMaker local configuration -# rename this file to glsamaker.rb - -# The development environment uses self-issued HTTP basic authentication -# Since GLSAMaker doesn't track passwords, set a password here for usage e.g. -# in ./script/server testing environments. The password applies to every user -GLSAMAKER_DEVEL_PASSWORD = "changeme" - -# If you want to force GLSAMaker to use production-style auth in all -# environments, set this to true -GLSAMAKER_FORCE_PRODUCTION_AUTH = false - -# Email address of the administrative contact -GLSAMAKER_ADMIN_EMAIL = "security@gentoo.org" - -# Email address to send email from -GLSAMAKER_FROM_EMAIL = "glsamaker@gentoo.org" - -# Do not send any emails (for development) -GLSAMAKER_NO_EMAIL = false - -# Where does the app live? -GLSAMAKER_HOST = "localhost:3000" - -# Location of the Portage tree, that can be a full gentoo tree, or what this gets you: -# -# rsync -av rsync://rsync1.de.gentoo.org/gentoo-portage --include 'metadata' \ -# --include 'metadata/**' --include '*/*/metadata.xml' --exclude '*/*/*' \ -# --exclude scripts --exclude eclass --exclude profiles --exclude 'skel.*' \ -# --exclude 'header.txt' --exclude 'licenses' /target -# -GLSAMAKER_PORTDIR = "/usr/portage/" - -# Bugzilla login info -GLSAMAKER_BUGZIE_SKIP = false -GLSAMAKER_BUGZIE_HOST = 'bugs.gentoo.org' -GLSAMAKER_BUGZIE_USER = nil -GLSAMAKER_BUGZIE_PW = nil - -# Location of xmlindent(1) -GLSAMAKER_XMLINDENT = "/usr/bin/xmlindent" - -# Your secret key for verifying the integrity of signed cookies. -# If you change this key, all old signed cookies will become invalid! -# Make sure the secret is at least 30 characters and all random, -# no regular words or you'll be exposed to dictionary attacks. -# Yes, this is referencing an undefined variable on purpose. -Glsamaker::Application.config.secret_token = i_forgot_to_set_this diff --git a/config/initializers/glsamaker_constants.rb b/config/initializers/glsamaker_constants.rb deleted file mode 100644 index 6476c7d..0000000 --- a/config/initializers/glsamaker_constants.rb +++ /dev/null @@ -1 +0,0 @@ -CVE_CACHE_LAST_IMPORT = 'cve/last-import' diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb deleted file mode 100644 index dfb5df0..0000000 --- a/config/initializers/inflections.rb +++ /dev/null @@ -1,20 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Add new inflection rules using the following format. Inflections -# are locale specific, and you may define rules for as many different -# locales as you wish. All of these examples are active by default: -# ActiveSupport::Inflector.inflections(:en) do |inflect| -# inflect.plural /^(ox)$/i, '\1en' -# inflect.singular /^(ox)en/i, '\1' -# inflect.irregular 'person', 'people' -# inflect.uncountable %w( fish sheep ) -# end - -ActiveSupport::Inflector.inflections(:en) do |inflect| - inflect.singular 'cves', 'cve' -end - -# These inflection rules are supported but not enabled by default: -# ActiveSupport::Inflector.inflections(:en) do |inflect| -# inflect.acronym 'RESTful' -# end diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb deleted file mode 100644 index 5f94d03..0000000 --- a/config/initializers/mime_types.rb +++ /dev/null @@ -1,7 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Add new mime types for use in respond_to blocks: -# Mime::Type.register "text/richtext", :rtf -# Mime::Type.register_alias "text/html", :iphone - -Mime::Type.register "text/plain", :txt diff --git a/config/initializers/session_store.rb b/config/initializers/session_store.rb deleted file mode 100644 index df488ac..0000000 --- a/config/initializers/session_store.rb +++ /dev/null @@ -1,3 +0,0 @@ -# Be sure to restart your server when you modify this file. - -Rails.application.config.session_store :cookie_store, key: '_glsamaker_session' diff --git a/config/initializers/time_formats.rb b/config/initializers/time_formats.rb deleted file mode 100644 index 2f75d0b..0000000 --- a/config/initializers/time_formats.rb +++ /dev/null @@ -1 +0,0 @@ -Time::DATE_FORMATS[:default] = "%a, %d %b %y %H:%M" diff --git a/config/initializers/wrap_parameters.rb b/config/initializers/wrap_parameters.rb deleted file mode 100644 index 33725e9..0000000 --- a/config/initializers/wrap_parameters.rb +++ /dev/null @@ -1,14 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# This file contains settings for ActionController::ParamsWrapper which -# is enabled by default. - -# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. -ActiveSupport.on_load(:action_controller) do - wrap_parameters format: [:json] if respond_to?(:wrap_parameters) -end - -# To enable root element in JSON for ActiveRecord objects. -# ActiveSupport.on_load(:active_record) do -# self.include_root_in_json = true -# end diff --git a/config/locales/en.yml b/config/locales/en.yml deleted file mode 100644 index 0653957..0000000 --- a/config/locales/en.yml +++ /dev/null @@ -1,23 +0,0 @@ -# Files in the config/locales directory are used for internationalization -# and are automatically loaded by Rails. If you want to use locales other -# than English, add the necessary files in this directory. -# -# To use the locales, use `I18n.t`: -# -# I18n.t 'hello' -# -# In views, this is aliased to just `t`: -# -# <%= t('hello') %> -# -# To use a different locale, set it with `I18n.locale`: -# -# I18n.locale = :es -# -# This would use the information in config/locales/es.yml. -# -# To learn more, please read the Rails Internationalization guide -# available at http://guides.rubyonrails.org/i18n.html. - -en: - hello: "Hello world" diff --git a/config/routes.rb b/config/routes.rb deleted file mode 100644 index 2a28e0e..0000000 --- a/config/routes.rb +++ /dev/null @@ -1,96 +0,0 @@ -Glsamaker::Application.routes.draw do - - match 'bug/:id' => 'bug#bug', :as => :bug, :via => :get - match 'bug/:id/history' => 'bug#history', :as => :bughistory, :via => :get - - match 'cve/list.:format' => 'cve#list', :as => :cve, :via => [:get, :post] - - match 'search/results' => 'search#results', :as => :search, :via => :get - - match 'admin' => 'admin/index#index', :via => :get - - resources :glsas, :controller => 'glsa' do - resources :comments - resources :bugs - - get 'requests', :on => :collection - get 'drafts' , :on => :collection - get 'archive', :on => :collection - post 'archive', :on => :collection - - get 'diff', :on => :member - post 'diff', :on => :member - get 'download', :on => :member - get 'import_references', :on => :member - post 'import_references', :on => :member - get 'prepare_release', :on => :member - post 'prepare_release', :on => :member - post 'release', :on => :member - get 'update_cache', :on => :member - get 'finalize_release', :on => :member - post 'finalize_release', :on => :member - end - - # The priority is based upon order of creation: - # first created -> highest priority. - - # Sample of regular route: - # match 'products/:id' => 'catalog#view' - # Keep in mind you can assign values other than :controller and :action - - # Sample of named route: - # match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase - # This route can be invoked with purchase_url(:id => product.id) - - # Sample resource route (maps HTTP verbs to controller actions automatically): - # resources :products - - # Sample resource route with options: - # resources :products do - # member do - # get 'short' - # post 'toggle' - # end - # - # collection do - # get 'sold' - # end - # end - - # Sample resource route with sub-resources: - # resources :products do - # resources :comments, :sales - # resource :seller - # end - - # Sample resource route with more complex sub-resources - # resources :products do - # resources :comments - # resources :sales do - # get 'recent', :on => :collection - # end - # end - - # Sample resource route within a namespace: - # namespace :admin do - # # Directs /admin/products/* to Admin::ProductsController - # # (app/controllers/admin/products_controller.rb) - # resources :products - # end - - namespace :admin do - resources :users - resources :templates - end - - # You can have the root of your site routed with "root" - # just remember to delete public/index.html. - root :to => 'index#index' - - # See how all your routes lay out with "rake routes" - - # This is a legacy wild controller route that's not recommended for RESTful applications. - # Note: This route will make all actions in every controller accessible via GET requests. - match ':controller(/:action(/:id(.:format)))', :via => [:get, :post] - # -end diff --git a/config/secrets.yml b/config/secrets.yml deleted file mode 100644 index a98e48f..0000000 --- a/config/secrets.yml +++ /dev/null @@ -1,22 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Your secret key is used for verifying the integrity of signed cookies. -# If you change this key, all old signed cookies will become invalid! - -# Make sure the secret is at least 30 characters and all random, -# no regular words or you'll be exposed to dictionary attacks. -# You can use `rake secret` to generate a secure secret key. - -# Make sure the secrets in this file are kept private -# if you're sharing your code publicly. - -development: - secret_key_base: 865902986d47e642f24b044ba251bfa4bc1b180c15a83ed6727b7a18931aa5452cf0d221fb0519c945de1b1828c46fb484eb7c792b213a2530f1f605cf465b60 - -test: - secret_key_base: 7b16cf2278f7afa09663e09c8043579e1ed7d4df18a48f60d878b810824a89ec8ddbe7b948b10701f3636e78c44f0baa3bdbd7b38e2ed6afa669bb2bd197f5e3 - -# Do not keep production secrets in the repository, -# instead read values from the environment. -production: - secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> diff --git a/config/thinking_sphinx.yml b/config/thinking_sphinx.yml deleted file mode 100644 index d866a5a..0000000 --- a/config/thinking_sphinx.yml +++ /dev/null @@ -1,9 +0,0 @@ -development: - enable_star: true - min_infix_len: 3 -test: - enable_star: true - min_infix_len: 3 -production: - enable_star: true - min_infix_len: 3 \ No newline at end of file diff --git a/db/migrate/20090314092539_create_users.rb b/db/migrate/20090314092539_create_users.rb deleted file mode 100644 index c7eff5f..0000000 --- a/db/migrate/20090314092539_create_users.rb +++ /dev/null @@ -1,21 +0,0 @@ -class CreateUsers < ActiveRecord::Migration - def self.up - create_table :users do |t| - t.string :login - t.string :name - t.string :email - t.boolean :disabled, :default => false - t.boolean :jefe, :default => false - t.text :preferences - t.integer :access - t.timestamps - end - - add_index :users, :login, :unique => true - end - - def self.down - remove_index :users, :column => :login - drop_table :users - end -end diff --git a/db/migrate/20090314191650_create_glsas.rb b/db/migrate/20090314191650_create_glsas.rb deleted file mode 100644 index fd88029..0000000 --- a/db/migrate/20090314191650_create_glsas.rb +++ /dev/null @@ -1,22 +0,0 @@ -class CreateGlsas < ActiveRecord::Migration - def self.up - create_table :glsas do |t| - t.string :glsa_id - t.integer :requester - t.integer :submitter - t.integer :bugreadymaker - t.string :status - t.boolean :restricted, :default => false - t.timestamps - end - - add_index :glsas, :glsa_id, :unique => true - add_index :glsas, :status - end - - def self.down - remove_index :glsas, :status - remove_index :glsas, :glsa_id - drop_table :glsas - end -end diff --git a/db/migrate/20090314194257_add_glsa_user_constraints.rb b/db/migrate/20090314194257_add_glsa_user_constraints.rb deleted file mode 100644 index 51c35ac..0000000 --- a/db/migrate/20090314194257_add_glsa_user_constraints.rb +++ /dev/null @@ -1,13 +0,0 @@ -class AddGlsaUserConstraints < ActiveRecord::Migration - def self.up - execute "ALTER TABLE glsas ADD CONSTRAINT glsas_users_requesters FOREIGN KEY (requester) REFERENCES users (id)" - execute "ALTER TABLE glsas ADD CONSTRAINT glsas_users_submitters FOREIGN KEY (submitter) REFERENCES users (id)" - execute "ALTER TABLE glsas ADD CONSTRAINT glsas_users_bugreadymakers FOREIGN KEY (bugreadymaker) REFERENCES users (id)" - end - - def self.down - execute "ALTER TABLE glsas DROP FOREIGN KEY glsas_users_requesters" - execute "ALTER TABLE glsas DROP FOREIGN KEY glsas_users_submitters" - execute "ALTER TABLE glsas DROP FOREIGN KEY glsas_users_bugreadymakers" - end -end diff --git a/db/migrate/20090314194659_create_revisions.rb b/db/migrate/20090314194659_create_revisions.rb deleted file mode 100644 index dbea6ba..0000000 --- a/db/migrate/20090314194659_create_revisions.rb +++ /dev/null @@ -1,32 +0,0 @@ -class CreateRevisions < ActiveRecord::Migration - def self.up - create_table :revisions do |t| - t.integer :glsa_id - t.integer :revid - t.string :title - t.string :access, :default => "remote" - t.string :product - t.string :category - t.string :severity, :default => "normal" - t.text :synopsis - t.text :background - t.text :description - t.text :impact - t.text :workaround - t.text :resolution - t.timestamps - end - - add_index :revisions, :glsa_id - add_index :revisions, :revid - add_index :revisions, :title - end - - def self.down - remove_index :revisions, :synopsis - remove_index :revisions, :title - remove_index :revisions, :revid - remove_index :revisions, :glsa_id - drop_table :revisions - end -end diff --git a/db/migrate/20090314230516_create_references.rb b/db/migrate/20090314230516_create_references.rb deleted file mode 100644 index c7fff76..0000000 --- a/db/migrate/20090314230516_create_references.rb +++ /dev/null @@ -1,18 +0,0 @@ -class CreateReferences < ActiveRecord::Migration - def self.up - create_table :references do |t| - t.integer :revision_id - t.text :title - t.text :url - t.string :type - t.timestamps - end - - add_index :references, :revision_id - end - - def self.down - remove_index :references, :revision_id - drop_table :references - end -end diff --git a/db/migrate/20090315105049_create_bugs.rb b/db/migrate/20090315105049_create_bugs.rb deleted file mode 100644 index 21d6641..0000000 --- a/db/migrate/20090315105049_create_bugs.rb +++ /dev/null @@ -1,19 +0,0 @@ -class CreateBugs < ActiveRecord::Migration - def self.up - create_table :bugs do |t| - t.integer :bug_id - t.text :title - t.integer :revision_id - t.timestamps - end - - add_index :bugs, :revision_id - add_index :bugs, :bug_id - end - - def self.down - remove_index :bugs, :column => :revision_id - remove_index :bugs, :column => :bug_id - drop_table :bugs - end -end diff --git a/db/migrate/20090315105326_add_references_revisions_constraint.rb b/db/migrate/20090315105326_add_references_revisions_constraint.rb deleted file mode 100644 index 1fa4800..0000000 --- a/db/migrate/20090315105326_add_references_revisions_constraint.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddReferencesRevisionsConstraint < ActiveRecord::Migration - def self.up - execute "ALTER TABLE `references` ADD CONSTRAINT references_revisions_revisionid FOREIGN KEY (revision_id) REFERENCES revisions (id)" - end - - def self.down - execute "ALTER TABLE `references` DROP FOREIGN KEY references_revisions_revisionid" - end -end diff --git a/db/migrate/20090315110025_create_comments.rb b/db/migrate/20090315110025_create_comments.rb deleted file mode 100644 index bebb968..0000000 --- a/db/migrate/20090315110025_create_comments.rb +++ /dev/null @@ -1,18 +0,0 @@ -class CreateComments < ActiveRecord::Migration - def self.up - create_table :comments do |t| - t.integer :user_id - t.integer :glsa_id - t.text :text - t.string :type - t.boolean :read, :default => false - t.timestamps - end - - add_index :comments, :glsa_id - end - - def self.down - drop_table :comments - end -end diff --git a/db/migrate/20090315110119_add_comment_constraints.rb b/db/migrate/20090315110119_add_comment_constraints.rb deleted file mode 100644 index 49eabd4..0000000 --- a/db/migrate/20090315110119_add_comment_constraints.rb +++ /dev/null @@ -1,11 +0,0 @@ -class AddCommentConstraints < ActiveRecord::Migration - def self.up - execute "ALTER TABLE comments ADD CONSTRAINT comments_users_userid FOREIGN KEY (user_id) REFERENCES users (id)" - execute "ALTER TABLE comments ADD CONSTRAINT comments_glsas_glsaid FOREIGN KEY (glsa_id) REFERENCES glsas (id)" - end - - def self.down - execute "ALTER TABLE comments DROP FOREIGN KEY comments_users_userid" - execute "ALTER TABLE comments DROP FOREIGN KEY comments_glsas_glsaid" - end -end diff --git a/db/migrate/20090410212514_add_user_id_to_revisions.rb b/db/migrate/20090410212514_add_user_id_to_revisions.rb deleted file mode 100644 index f6c0254..0000000 --- a/db/migrate/20090410212514_add_user_id_to_revisions.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddUserIdToRevisions < ActiveRecord::Migration - def self.up - add_column :revisions, :user_id, :integer - end - - def self.down - remove_column :revisions, :user_id - end -end diff --git a/db/migrate/20090410212600_add_revisions_user_id_constraint.rb b/db/migrate/20090410212600_add_revisions_user_id_constraint.rb deleted file mode 100644 index 18597cb..0000000 --- a/db/migrate/20090410212600_add_revisions_user_id_constraint.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddRevisionsUserIdConstraint < ActiveRecord::Migration - def self.up - execute "ALTER TABLE `revisions` ADD CONSTRAINT revisions_user_userid FOREIGN KEY (user_id) REFERENCES users (id)" - end - - def self.down - execute "ALTER TABLE `revisions` DROP FOREIGN KEY revisions_user_userid" - end -end diff --git a/db/migrate/20090419140216_create_sessions.rb b/db/migrate/20090419140216_create_sessions.rb deleted file mode 100644 index 4ccc353..0000000 --- a/db/migrate/20090419140216_create_sessions.rb +++ /dev/null @@ -1,16 +0,0 @@ -class CreateSessions < ActiveRecord::Migration - def self.up - create_table :sessions do |t| - t.string :session_id, :null => false - t.text :data - t.timestamps - end - - add_index :sessions, :session_id - add_index :sessions, :updated_at - end - - def self.down - drop_table :sessions - end -end diff --git a/db/migrate/20090501114107_add_status_cache_to_bugs.rb b/db/migrate/20090501114107_add_status_cache_to_bugs.rb deleted file mode 100644 index 1600049..0000000 --- a/db/migrate/20090501114107_add_status_cache_to_bugs.rb +++ /dev/null @@ -1,11 +0,0 @@ -class AddStatusCacheToBugs < ActiveRecord::Migration - def self.up - add_column :bugs, :whiteboard, :string - add_column :bugs, :arches, :string - end - - def self.down - remove_column :bugs, :arches - remove_column :bugs, :whiteboard - end -end diff --git a/db/migrate/20100511192546_change_comment_type_to_rating.rb b/db/migrate/20100511192546_change_comment_type_to_rating.rb deleted file mode 100644 index c3ab83a..0000000 --- a/db/migrate/20100511192546_change_comment_type_to_rating.rb +++ /dev/null @@ -1,9 +0,0 @@ -class ChangeCommentTypeToRating < ActiveRecord::Migration - def self.up - rename_column :comments, :type, :rating - end - - def self.down - rename_column :comments, :rating, :type - end -end diff --git a/db/migrate/20100513183324_create_packages.rb b/db/migrate/20100513183324_create_packages.rb deleted file mode 100644 index 11ed193..0000000 --- a/db/migrate/20100513183324_create_packages.rb +++ /dev/null @@ -1,21 +0,0 @@ -class CreatePackages < ActiveRecord::Migration - def self.up - create_table :packages do |t| - t.integer :revision_id - t.string :my_type - t.string :atom - t.string :version - t.string :comp - t.string :arch - t.boolean :automatic, :default => true - t.timestamps - end - - add_index :packages, :revision_id - end - - def self.down - remove_index :packages, :column => :revision_id - drop_table :packages - end -end diff --git a/db/migrate/20100813183543_create_cves.rb b/db/migrate/20100813183543_create_cves.rb deleted file mode 100644 index 473e165..0000000 --- a/db/migrate/20100813183543_create_cves.rb +++ /dev/null @@ -1,19 +0,0 @@ -class CreateCves < ActiveRecord::Migration - def self.up - create_table :cves do |t| - t.string :cve_id - t.text :summary - t.string :cvss - t.string :state - t.datetime :published_at - t.datetime :last_changed_at - t.timestamps - end - - add_index :cves, :cve_id, :unique => true - end - - def self.down - drop_table :cves - end -end diff --git a/db/migrate/20100814103856_create_cve_references.rb b/db/migrate/20100814103856_create_cve_references.rb deleted file mode 100644 index ef3ef9b..0000000 --- a/db/migrate/20100814103856_create_cve_references.rb +++ /dev/null @@ -1,19 +0,0 @@ -class CreateCveReferences < ActiveRecord::Migration - def self.up - create_table :cve_references do |t| - t.string :source - t.text :title - t.text :uri - t.integer :cve_id - t.timestamps - end - - add_index :cve_references, :cve_id - execute "ALTER TABLE cve_references ADD CONSTRAINT cve_references_cve_id FOREIGN KEY (cve_id) REFERENCES cves (id)" - end - - def self.down - execute "ALTER TABLE cve_references DROP FOREIGN KEY cve_references_cve_id" - drop_table :cve_references - end -end diff --git a/db/migrate/20100814105152_create_cve_comments.rb b/db/migrate/20100814105152_create_cve_comments.rb deleted file mode 100644 index 73b1424..0000000 --- a/db/migrate/20100814105152_create_cve_comments.rb +++ /dev/null @@ -1,21 +0,0 @@ -class CreateCveComments < ActiveRecord::Migration - def self.up - create_table :cve_comments do |t| - t.integer :cve_id - t.integer :user_id - t.boolean :confidential, :default => false - t.text :comment - t.timestamps - end - - add_index :cve_comments, :cve_id - execute "ALTER TABLE cve_comments ADD CONSTRAINT cve_comments_cve_id FOREIGN KEY (cve_id) REFERENCES cves (id)" - execute "ALTER TABLE cve_comments ADD CONSTRAINT cve_comments_user_id FOREIGN KEY (user_id) REFERENCES users (id)" - end - - def self.down - execute "ALTER TABLE cve_comments DROP FOREIGN KEY cve_comments_cve_id" - execute "ALTER TABLE cve_comments DROP FOREIGN KEY cve_comments_user_id" - drop_table :cve_comments - end -end diff --git a/db/migrate/20100814105345_create_cve_changes.rb b/db/migrate/20100814105345_create_cve_changes.rb deleted file mode 100644 index 80e7db9..0000000 --- a/db/migrate/20100814105345_create_cve_changes.rb +++ /dev/null @@ -1,20 +0,0 @@ -class CreateCveChanges < ActiveRecord::Migration - def self.up - create_table :cve_changes do |t| - t.integer :cve_id - t.integer :user_id - t.string :action - t.string :object - t.timestamps - end - - execute "ALTER TABLE cve_changes ADD CONSTRAINT cve_changes_cve_id FOREIGN KEY (cve_id) REFERENCES cves (id)" - execute "ALTER TABLE cve_changes ADD CONSTRAINT cve_changes_user_id FOREIGN KEY (user_id) REFERENCES users (id)" - end - - def self.down - execute "ALTER TABLE cve_changes DROP FOREIGN KEY cve_changes_cve_id" - execute "ALTER TABLE cve_changes DROP FOREIGN KEY cve_changes_user_id" - drop_table :cve_changes - end -end diff --git a/db/migrate/20100814142647_create_cpes.rb b/db/migrate/20100814142647_create_cpes.rb deleted file mode 100644 index 439360a..0000000 --- a/db/migrate/20100814142647_create_cpes.rb +++ /dev/null @@ -1,27 +0,0 @@ -class CreateCpes < ActiveRecord::Migration - def self.up - create_table :cpes do |t| - t.string :cpe - t.timestamps - end - - create_table :cpes_cves, :id => false do |t| - t.integer :cpe_id - t.integer :cve_id - t.timestamps - end - - add_index :cpes_cves, [:cve_id, :cpe_id] - add_index :cpes, :cpe, :unique => true - - execute "ALTER TABLE cpes_cves ADD CONSTRAINT cpes_cves_cpe_id FOREIGN KEY (cpe_id) REFERENCES cpes (id)" - execute "ALTER TABLE cpes_cves ADD CONSTRAINT cpes_cves_cve_id FOREIGN KEY (cve_id) REFERENCES cves (id)" - end - - def self.down - execute "ALTER TABLE cpes_cves DROP FOREIGN KEY cpes_cves_cpe_id" - execute "ALTER TABLE cpes_cves DROP FOREIGN KEY cpes_cves_cve_id" - drop_table :cpes_cves - drop_table :cpes - end -end diff --git a/db/migrate/20100902093457_create_cve_assignments.rb b/db/migrate/20100902093457_create_cve_assignments.rb deleted file mode 100644 index 0950574..0000000 --- a/db/migrate/20100902093457_create_cve_assignments.rb +++ /dev/null @@ -1,23 +0,0 @@ -class CreateCveAssignments < ActiveRecord::Migration - def self.up - create_table :cve_assignments do |t| - t.integer :cve_id - t.integer :bug - t.timestamps - end - - add_index :cve_assignments, :cve_id - add_index :cve_assignments, :bug - - execute "ALTER TABLE cve_assignments ADD CONSTRAINT cve_assignments_cve_id FOREIGN KEY (cve_id) REFERENCES cves (id)" - end - - def self.down - execute "ALTER TABLE cve_assignments DROP FOREIGN KEY cve_assignments_cve_id" - - remove_index :cve_assignments, :bug - remove_index :cve_assignments, :cve_id - - drop_table :cve_assignments - end -end diff --git a/db/migrate/20100918223549_add_system_user.rb b/db/migrate/20100918223549_add_system_user.rb deleted file mode 100644 index b6058c9..0000000 --- a/db/migrate/20100918223549_add_system_user.rb +++ /dev/null @@ -1,12 +0,0 @@ -class AddSystemUser < ActiveRecord::Migration - def self.up - execute "INSERT INTO users (id, login, name, email, access, disabled, jefe) VALUES" + - "(1, 'system', 'Sytem Account', 'glsamaker@gentoo.org', 0, 0, 0)" - execute "UPDATE users SET id = 0 WHERE id = 1" - execute "ALTER TABLE users AUTO_INCREMENT = 1" - end - - def self.down - execute "DELETE FROM users WHERE id = 0" - end -end diff --git a/db/migrate/20110226204724_add_release_flag_to_revisions.rb b/db/migrate/20110226204724_add_release_flag_to_revisions.rb deleted file mode 100644 index 43d0b6d..0000000 --- a/db/migrate/20110226204724_add_release_flag_to_revisions.rb +++ /dev/null @@ -1,11 +0,0 @@ -class AddReleaseFlagToRevisions < ActiveRecord::Migration - def self.up - add_column :revisions, :is_release, :boolean, :default => false - add_column :revisions, :release_revision, :integer - end - - def self.down - remove_column :revisions, :release_revision - remove_column :revisions, :is_release - end -end diff --git a/db/migrate/20110827143514_create_templates.rb b/db/migrate/20110827143514_create_templates.rb deleted file mode 100644 index ef9729a..0000000 --- a/db/migrate/20110827143514_create_templates.rb +++ /dev/null @@ -1,12 +0,0 @@ -class CreateTemplates < ActiveRecord::Migration - def change - create_table :templates do |t| - t.string :name - t.text :text - t.string :target - t.boolean :enabled, :default => true - - t.timestamps - end - end -end diff --git a/db/migrate/20110829174909_add_first_release_date_to_glsa.rb b/db/migrate/20110829174909_add_first_release_date_to_glsa.rb deleted file mode 100644 index 74fb219..0000000 --- a/db/migrate/20110829174909_add_first_release_date_to_glsa.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddFirstReleaseDateToGlsa < ActiveRecord::Migration - def change - add_column :glsas, :first_released_at, :datetime - end -end diff --git a/db/migrate/20170418102638_add_slots_to_packages.rb b/db/migrate/20170418102638_add_slots_to_packages.rb deleted file mode 100644 index 73e21e9..0000000 --- a/db/migrate/20170418102638_add_slots_to_packages.rb +++ /dev/null @@ -1,11 +0,0 @@ -class AddSlotsToPackages < ActiveRecord::Migration - def change - add_column :packages, :slot, :string - Package.find_each do |package| - if package.slot.nil? - package.slot = '*' - package.save! - end - end - end -end diff --git a/db/schema.rb b/db/schema.rb deleted file mode 100644 index 1d2a6e1..0000000 --- a/db/schema.rb +++ /dev/null @@ -1,239 +0,0 @@ -# encoding: UTF-8 -# This file is auto-generated from the current state of the database. Instead -# of editing this file, please use the migrations feature of Active Record to -# incrementally modify your database, and then regenerate this schema definition. -# -# Note that this schema.rb definition is the authoritative source for your -# database schema. If you need to create the application database on another -# system, you should be using db:schema:load, not running all the migrations -# from scratch. The latter is a flawed and unsustainable approach (the more migrations -# you'll amass, the slower it'll run and the greater likelihood for issues). -# -# It's strongly recommended that you check this file into your version control system. - -ActiveRecord::Schema.define(version: 20170418102638) do - - create_table "bugs", force: :cascade do |t| - t.integer "bug_id", limit: 4 - t.text "title", limit: 65535 - t.integer "revision_id", limit: 4 - t.datetime "created_at" - t.datetime "updated_at" - t.string "whiteboard", limit: 255 - t.string "arches", limit: 255 - end - - add_index "bugs", ["bug_id"], name: "index_bugs_on_bug_id", using: :btree - add_index "bugs", ["revision_id"], name: "index_bugs_on_revision_id", using: :btree - - create_table "comments", force: :cascade do |t| - t.integer "user_id", limit: 4 - t.integer "glsa_id", limit: 4 - t.text "text", limit: 65535 - t.string "rating", limit: 255 - t.boolean "read", limit: 1, default: false - t.datetime "created_at" - t.datetime "updated_at" - end - - add_index "comments", ["glsa_id"], name: "index_comments_on_glsa_id", using: :btree - add_index "comments", ["user_id"], name: "comments_users_userid", using: :btree - - create_table "cpes", force: :cascade do |t| - t.string "cpe", limit: 255 - t.datetime "created_at" - t.datetime "updated_at" - end - - add_index "cpes", ["cpe"], name: "index_cpes_on_cpe", unique: true, using: :btree - - create_table "cpes_cves", id: false, force: :cascade do |t| - t.integer "cpe_id", limit: 4 - t.integer "cve_id", limit: 4 - t.datetime "created_at" - t.datetime "updated_at" - end - - add_index "cpes_cves", ["cpe_id"], name: "cpes_cves_cpe_id", using: :btree - add_index "cpes_cves", ["cve_id", "cpe_id"], name: "index_cpes_cves_on_cve_id_and_cpe_id", using: :btree - - create_table "cve_assignments", force: :cascade do |t| - t.integer "cve_id", limit: 4 - t.integer "bug", limit: 4 - t.datetime "created_at" - t.datetime "updated_at" - end - - add_index "cve_assignments", ["bug"], name: "index_cve_assignments_on_bug", using: :btree - add_index "cve_assignments", ["cve_id"], name: "index_cve_assignments_on_cve_id", using: :btree - - create_table "cve_changes", force: :cascade do |t| - t.integer "cve_id", limit: 4 - t.integer "user_id", limit: 4 - t.string "action", limit: 255 - t.string "object", limit: 255 - t.datetime "created_at" - t.datetime "updated_at" - end - - add_index "cve_changes", ["cve_id"], name: "cve_changes_cve_id", using: :btree - add_index "cve_changes", ["user_id"], name: "cve_changes_user_id", using: :btree - - create_table "cve_comments", force: :cascade do |t| - t.integer "cve_id", limit: 4 - t.integer "user_id", limit: 4 - t.boolean "confidential", limit: 1, default: false - t.text "comment", limit: 65535 - t.datetime "created_at" - t.datetime "updated_at" - end - - add_index "cve_comments", ["cve_id"], name: "index_cve_comments_on_cve_id", using: :btree - add_index "cve_comments", ["user_id"], name: "cve_comments_user_id", using: :btree - - create_table "cve_references", force: :cascade do |t| - t.string "source", limit: 255 - t.text "title", limit: 65535 - t.text "uri", limit: 65535 - t.integer "cve_id", limit: 4 - t.datetime "created_at" - t.datetime "updated_at" - end - - add_index "cve_references", ["cve_id"], name: "index_cve_references_on_cve_id", using: :btree - - create_table "cves", force: :cascade do |t| - t.string "cve_id", limit: 255 - t.text "summary", limit: 65535 - t.string "cvss", limit: 255 - t.string "state", limit: 255 - t.datetime "published_at" - t.datetime "last_changed_at" - t.datetime "created_at" - t.datetime "updated_at" - end - - add_index "cves", ["cve_id"], name: "index_cves_on_cve_id", unique: true, using: :btree - - create_table "glsas", force: :cascade do |t| - t.string "glsa_id", limit: 255 - t.integer "requester", limit: 4 - t.integer "submitter", limit: 4 - t.integer "bugreadymaker", limit: 4 - t.string "status", limit: 255 - t.boolean "restricted", limit: 1, default: false - t.datetime "created_at" - t.datetime "updated_at" - t.datetime "first_released_at" - end - - add_index "glsas", ["bugreadymaker"], name: "glsas_users_bugreadymakers", using: :btree - add_index "glsas", ["glsa_id"], name: "index_glsas_on_glsa_id", unique: true, using: :btree - add_index "glsas", ["requester"], name: "glsas_users_requesters", using: :btree - add_index "glsas", ["status"], name: "index_glsas_on_status", using: :btree - add_index "glsas", ["submitter"], name: "glsas_users_submitters", using: :btree - - create_table "packages", force: :cascade do |t| - t.integer "revision_id", limit: 4 - t.string "my_type", limit: 255 - t.string "atom", limit: 255 - t.string "version", limit: 255 - t.string "comp", limit: 255 - t.string "arch", limit: 255 - t.boolean "automatic", limit: 1, default: true - t.datetime "created_at" - t.datetime "updated_at" - t.string "slot", limit: 255 - end - - add_index "packages", ["atom"], name: "atom", using: :btree - add_index "packages", ["comp"], name: "comp", using: :btree - add_index "packages", ["revision_id"], name: "index_packages_on_revision_id", using: :btree - add_index "packages", ["slot"], name: "slot", using: :btree - - create_table "references", force: :cascade do |t| - t.integer "revision_id", limit: 4 - t.text "title", limit: 65535 - t.text "url", limit: 65535 - t.string "type", limit: 255 - t.datetime "created_at" - t.datetime "updated_at" - end - - add_index "references", ["revision_id"], name: "index_references_on_revision_id", using: :btree - - create_table "revisions", force: :cascade do |t| - t.integer "glsa_id", limit: 4 - t.integer "revid", limit: 4 - t.string "title", limit: 255 - t.string "access", limit: 255, default: "remote" - t.string "product", limit: 255 - t.string "category", limit: 255 - t.string "severity", limit: 255, default: "normal" - t.text "synopsis", limit: 65535 - t.text "background", limit: 65535 - t.text "description", limit: 65535 - t.text "impact", limit: 65535 - t.text "workaround", limit: 65535 - t.text "resolution", limit: 65535 - t.datetime "created_at" - t.datetime "updated_at" - t.integer "user_id", limit: 4 - t.boolean "is_release", limit: 1, default: false - t.integer "release_revision", limit: 4 - end - - add_index "revisions", ["glsa_id"], name: "index_revisions_on_glsa_id", using: :btree - add_index "revisions", ["revid"], name: "index_revisions_on_revid", using: :btree - add_index "revisions", ["title"], name: "index_revisions_on_title", using: :btree - add_index "revisions", ["user_id"], name: "revisions_user_userid", using: :btree - - create_table "sessions", force: :cascade do |t| - t.string "session_id", limit: 255, null: false - t.text "data", limit: 65535 - t.datetime "created_at" - t.datetime "updated_at" - end - - add_index "sessions", ["session_id"], name: "index_sessions_on_session_id", using: :btree - add_index "sessions", ["updated_at"], name: "index_sessions_on_updated_at", using: :btree - - create_table "templates", force: :cascade do |t| - t.string "name", limit: 255 - t.text "text", limit: 65535 - t.string "target", limit: 255 - t.boolean "enabled", limit: 1, default: true - t.datetime "created_at" - t.datetime "updated_at" - end - - create_table "users", force: :cascade do |t| - t.string "login", limit: 255 - t.string "name", limit: 255 - t.string "email", limit: 255 - t.boolean "disabled", limit: 1, default: false - t.boolean "jefe", limit: 1, default: false - t.text "preferences", limit: 65535 - t.integer "access", limit: 4 - t.datetime "created_at" - t.datetime "updated_at" - end - - add_index "users", ["login"], name: "index_users_on_login", unique: true, using: :btree - - add_foreign_key "comments", "glsas", name: "comments_glsas_glsaid" - add_foreign_key "comments", "users", name: "comments_users_userid" - add_foreign_key "cpes_cves", "cpes", name: "cpes_cves_cpe_id" - add_foreign_key "cpes_cves", "cves", name: "cpes_cves_cve_id" - add_foreign_key "cve_assignments", "cves", name: "cve_assignments_cve_id" - add_foreign_key "cve_changes", "cves", name: "cve_changes_cve_id" - add_foreign_key "cve_changes", "users", name: "cve_changes_user_id" - add_foreign_key "cve_comments", "cves", name: "cve_comments_cve_id" - add_foreign_key "cve_comments", "users", name: "cve_comments_user_id" - add_foreign_key "cve_references", "cves", name: "cve_references_cve_id" - add_foreign_key "glsas", "users", column: "bugreadymaker", name: "glsas_users_bugreadymakers" - add_foreign_key "glsas", "users", column: "requester", name: "glsas_users_requesters" - add_foreign_key "glsas", "users", column: "submitter", name: "glsas_users_submitters" - add_foreign_key "references", "revisions", name: "references_revisions_revisionid" - add_foreign_key "revisions", "users", name: "revisions_user_userid" -end diff --git a/db/seeds.rb b/db/seeds.rb deleted file mode 100644 index d34dfa0..0000000 --- a/db/seeds.rb +++ /dev/null @@ -1,7 +0,0 @@ -# This file should contain all the record creation needed to seed the database with its default values. -# The data can then be loaded with the rake db:seed (or created alongside the db with db:setup). -# -# Examples: -# -# cities = City.create([{ :name => 'Chicago' }, { :name => 'Copenhagen' }]) -# Mayor.create(:name => 'Emanuel', :city => cities.first) diff --git a/doc/README_FOR_APP b/doc/README_FOR_APP deleted file mode 100644 index 164a90c..0000000 --- a/doc/README_FOR_APP +++ /dev/null @@ -1,29 +0,0 @@ -=GLSAMaker v2 - -GLSAMaker is a core tool for the Gentoo Security Team. -It is used to track, create, edit and review Security announcements and drafts. - -Project website: https://redmine.a3li.li/projects/glsamaker2 - -==Needed libraries -* Rails 3.1 -* Nokogiri -* JSON -* Rcov -* text-format -* xmlindent -* Sphinx -* Sparklines - -==Copyright - Copyright (C) 2009-2011 Alex Legler - Copyright (C) 2009 Pierre-Yves Rofes - Portions Copyright (C) 2006-2007 Jean-Philippe Lang - -==License -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -For more information, see the LICENSE file. diff --git a/doc/app/Admin.html b/doc/app/Admin.html deleted file mode 100644 index b5cdb87..0000000 --- a/doc/app/Admin.html +++ /dev/null @@ -1,278 +0,0 @@ - - - - - - - Module: Admin - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      -
      -
        - -
      -
      -
      - - -
      - -
      - - - - - - -
      -

      Namespace

      - -
      - - - - - -
      - - -
      - -
      -

      Admin

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Admin/IndexController.html b/doc/app/Admin/IndexController.html deleted file mode 100644 index c9a5c28..0000000 --- a/doc/app/Admin/IndexController.html +++ /dev/null @@ -1,317 +0,0 @@ - - - - - - - Class: Admin::IndexController - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      Admin::IndexController

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - index() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/admin/index_controller.rb, line 4
      -def index
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Admin/IndexHelper.html b/doc/app/Admin/IndexHelper.html deleted file mode 100644 index 9fbac05..0000000 --- a/doc/app/Admin/IndexHelper.html +++ /dev/null @@ -1,261 +0,0 @@ - - - - - - - Module: Admin::IndexHelper - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - - - - - - - - -
      - - -
      - -
      -

      Admin::IndexHelper

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Admin/TemplatesController.html b/doc/app/Admin/TemplatesController.html deleted file mode 100644 index aa5903e..0000000 --- a/doc/app/Admin/TemplatesController.html +++ /dev/null @@ -1,569 +0,0 @@ - - - - - - - Class: Admin::TemplatesController - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      - - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      Admin::TemplatesController

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - create() - click to toggle source -
      - - -
      - -

      POST /admin/templates POST /admin/templates.json

      - - - -
      -
      -# File app/controllers/admin/templates_controller.rb, line 44
      -def create
      -  @template = Template.new(params[:template])
      -
      -  respond_to do |format|
      -    if @template.save
      -      format.html { redirect_to admin_template_path(@template), :notice => 'Template was successfully created.' }
      -      format.json { render :json => @template, :status => :created, :location => @template }
      -    else
      -      format.html { render :action => "new" }
      -      format.json { render :json => @template.errors, :status => :unprocessable_entity }
      -    end
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - destroy() - click to toggle source -
      - - -
      - -

      DELETE /admin/templates/1 DELETE /admin/templates/1.json

      - - - -
      -
      -# File app/controllers/admin/templates_controller.rb, line 76
      -def destroy
      -  @template = Template.find(params[:id])
      -  @template.destroy
      -
      -  respond_to do |format|
      -    format.html { redirect_to admin_templates_url }
      -    format.json { head :ok }
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - edit() - click to toggle source -
      - - -
      - -

      GET /admin/templates/1/edit

      - - - -
      -
      -# File app/controllers/admin/templates_controller.rb, line 38
      -def edit
      -  @template = Template.find(params[:id])
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - index() - click to toggle source -
      - - -
      - -

      GET /admin/templates GET /admin/templates.json

      - - - -
      -
      -# File app/controllers/admin/templates_controller.rb, line 6
      -def index
      -  @templates = Template.all
      -
      -  respond_to do |format|
      -    format.html # index.html.erb
      -    format.json { render :json => @templates }
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - new() - click to toggle source -
      - - -
      - -

      GET /admin/templates/new GET /admin/templates/new.json

      - - - -
      -
      -# File app/controllers/admin/templates_controller.rb, line 28
      -def new
      -  @template = Template.new
      -
      -  respond_to do |format|
      -    format.html # new.html.erb
      -    format.json { render :json => @template }
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - show() - click to toggle source -
      - - -
      - -

      GET /admin/templates/1 GET /admin/templates/1.json

      - - - -
      -
      -# File app/controllers/admin/templates_controller.rb, line 17
      -def show
      -  @template = Template.find(params[:id])
      -
      -  respond_to do |format|
      -    format.html # show.html.erb
      -    format.json { render :json => @template }
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - update() - click to toggle source -
      - - -
      - -

      PUT /admin/templates/1 PUT /admin/templates/1.json

      - - - -
      -
      -# File app/controllers/admin/templates_controller.rb, line 60
      -def update
      -  @template = Template.find(params[:id])
      -
      -  respond_to do |format|
      -    if @template.update_attributes(params[:template])
      -      format.html { redirect_to admin_template_path(@template), :notice => 'Template was successfully updated.' }
      -      format.json { head :ok }
      -    else
      -      format.html { render :action => "edit" }
      -      format.json { render :json => @template.errors, :status => :unprocessable_entity }
      -    end
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Admin/TemplatesHelper.html b/doc/app/Admin/TemplatesHelper.html deleted file mode 100644 index 0bb6028..0000000 --- a/doc/app/Admin/TemplatesHelper.html +++ /dev/null @@ -1,310 +0,0 @@ - - - - - - - Module: Admin::TemplatesHelper - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      Admin::TemplatesHelper

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - target_list() - click to toggle source -
      - - -
      - -

      Generates a list of targets

      - - - -
      -
      -# File app/helpers/admin/templates_helper.rb, line 3
      -def target_list
      -  GLSAMAKER_TEMPLATE_TARGETS.map{|x| [x.titleize, x]}
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Admin/UsersController.html b/doc/app/Admin/UsersController.html deleted file mode 100644 index a313b89..0000000 --- a/doc/app/Admin/UsersController.html +++ /dev/null @@ -1,568 +0,0 @@ - - - - - - - Class: Admin::UsersController - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      Admin::UsersController

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - create() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/admin/users_controller.rb, line 18
      -def create
      -  @user = User.new(params[:user])
      -  
      -  if @user.save
      -    redirect_to(admin_user_path(@user), :notice => 'User was successfully created.')
      -  else
      -    render :action => "new"
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - destroy() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/admin/users_controller.rb, line 58
      -def destroy
      -  @user = User.find(params[:id])
      -  
      -  if @user.id == 0
      -    flash[:error] = "That's the system account."
      -    redirect_to(admin_users_path)
      -    return
      -  end    
      -  
      -  @user.destroy
      -  flash[:notice] = "User was successfully deleted."
      -  redirect_to(admin_users_path)
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - edit() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/admin/users_controller.rb, line 32
      -def edit
      -  @user = User.find(params[:id])
      -
      -  if @user.id == 0
      -    flash[:error] = "That's the system account."
      -    redirect_to(admin_users_path)
      -    return
      -  end    
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - index() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/admin/users_controller.rb, line 4
      -def index
      -  @users = User.where('id > 0')
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - new() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/admin/users_controller.rb, line 28
      -def new
      -  @user = User.new
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - show() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/admin/users_controller.rb, line 8
      -def show  
      -  @user = User.find(params[:id])
      -  
      -  if @user.id == 0
      -    flash[:error] = "That's the system account."
      -    redirect_to(admin_users_path)
      -    return
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - update() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/admin/users_controller.rb, line 42
      -def update
      -  @user = User.find(params[:id])
      -
      -  if @user.id == 0
      -    flash[:error] = "That's the system account."
      -    redirect_to(admin_users_path)
      -    return
      -  end
      -
      -  if @user.update_attributes(params[:user])
      -    redirect_to(admin_user_path(@user), :notice => 'User was successfully updated.')
      -  else
      -    render :action => "edit"
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Admin/UsersHelper.html b/doc/app/Admin/UsersHelper.html deleted file mode 100644 index 5c4a519..0000000 --- a/doc/app/Admin/UsersHelper.html +++ /dev/null @@ -1,354 +0,0 @@ - - - - - - - Module: Admin::UsersHelper - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      Admin::UsersHelper

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - access_list() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/helpers/admin/users_helper.rb, line 15
      -def access_list
      -  [0, 1, 2, 3].map{|x| [access_string(x), x]}
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - access_string(lvl) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/helpers/admin/users_helper.rb, line 2
      -def access_string(lvl)
      -  case lvl
      -  when 0
      -    "Contributor"
      -  when 1
      -    "Padawan"
      -  when 2
      -    "Full member"
      -  when 3
      -    "Confidential member"
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/ApplicationController.html b/doc/app/ApplicationController.html deleted file mode 100644 index 5637b50..0000000 --- a/doc/app/ApplicationController.html +++ /dev/null @@ -1,344 +0,0 @@ - - - - - - - Class: ApplicationController - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - - -
      -

      Included Modules

      - -
      - -
      - - -
      - -
      -

      ApplicationController

      - -
      - -

      Filters added to this controller apply to all controllers in the -application. Likewise, all the methods added will be available for all -controllers.

      - -
      - - - - -
      - - - - - - - - - - -
      -

      Protected Instance Methods

      - - -
      - - - -
      - log_error(error) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/application_controller.rb, line 29
      -def log_error(error)
      -  caller[0] =~ /`([^']*)'/ and where = $1
      -  logger.error "[#{where}] #{error.class}: #{error.to_s}"
      -  logger.info error.backtrace.join("\n")
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/ApplicationHelper.html b/doc/app/ApplicationHelper.html deleted file mode 100644 index fd36f36..0000000 --- a/doc/app/ApplicationHelper.html +++ /dev/null @@ -1,661 +0,0 @@ - - - - - - - Module: ApplicationHelper - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - - - - -
      - -
      -

      ApplicationHelper

      - -
      - -

      Methods added to this helper will be available to all templates in the -application.

      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - box_title(title, options = {}) - click to toggle source -
      - - -
      - -

      Renders a title bar for our boxes

      - - - -
      -
      -# File app/helpers/application_helper.rb, line 104
      -def box_title(title, options = {})
      -  content = "".html_safe
      -
      -  if options.has_key? :toolbar
      -    span_content = "".html_safe
      -
      -    options[:toolbar].each do |toolbar_item|
      -      if toolbar_item == :sep
      -        span_content << image_tag('separator.png')
      -      else
      -        if toolbar_item[:uri].start_with? 'javascript:'
      -          span_content << link_to_function(
      -              image_tag(toolbar_item[:icon]),
      -              toolbar_item[:uri].gsub(/^javascript:/, ''),
      -              :title => toolbar_item[:title]
      -          ) << ' '
      -        else
      -          span_content << link_to(image_tag(toolbar_item[:icon]), toolbar_item[:uri]) << ' '
      -        end
      -      end
      -    end
      -
      -    content << content_tag("span", span_content, :class => 'toolbar')
      -  end
      -
      -  if options.has_key? :icon
      -    content << image_tag(options[:icon]) << " "
      -  end
      -
      -  title2 = title
      -  if options.has_key? :escape and options[:escape] == false
      -    title2 = title2.html_safe
      -  end
      -
      -  if options.has_key? :label
      -    content << content_tag('label', title2, :for => options[:label])
      -  else
      -    content << title2
      -  end
      -
      -  content_tag("h2", content, :class => "boxtitle")
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - bugs_unify_cvenames(cves) - click to toggle source -
      - - -
      - -

      Groups an array of CVE names into groups

      - - - -
      -
      -# File app/helpers/application_helper.rb, line 41
      -def bugs_unify_cvenames(cves)
      -  cve_r = /CVE-(\d{4})-(\d+)/
      -
      -  years = {}
      -  cves.uniq.each do |cve|
      -    cve_r =~ cve
      -    years[$1] ||= []
      -    years[$1] << $2
      -  end
      -
      -  title = ""
      -  years.keys.sort.each do |year|
      -    title += "CVE-%s" % year
      -    if years[year].size == 1
      -      title += "-%s," % years[year].first
      -    else
      -      title += "-{%s}," % years[year].sort.join(',')
      -    end
      -  end
      -  
      -  title[0, title.length - 1]
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - cveify_bug_title(summary, cve_ids) - click to toggle source -
      - - -
      - -

      Updates a bug string with the cve_ids

      - - - -
      -
      -# File app/helpers/application_helper.rb, line 65
      -def cveify_bug_title(summary, cve_ids)
      -  cve_str = bugs_unify_cvenames(get_bug_cves(summary) + cve_ids)
      -  summary = summary.gsub(/[ (]*CVE-(\d{4})([-,(){}|, \d]+)/, '')
      -  summary.gsub!(/\(?CVEs? requested\)?/, '')
      -  "#{summary} (#{cve_str})"
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - error_msg(msg) - click to toggle source -
      - - -
      - -

      Simplistic helper for rendering an error message. Shows a little icon -before the message

      - - - -
      -
      -# File app/helpers/application_helper.rb, line 97
      -def error_msg(msg)
      -  content = image_tag('icons/error.png')
      -  content << " " << msg
      -  content
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - get_bug_cves(str) - click to toggle source -
      - - -
      - -

      shamelessly stolen from the old cvetools.py Extracts all CVEs from a string -into an array

      - - - -
      -
      -# File app/helpers/application_helper.rb, line 25
      -def get_bug_cves(str)
      -  cve_group_all = /[ (]*CVE-(\d{4})([-,(){}|, \d]+)/
      -  cve_group_split = /(\d{4})(?:\D|$)/
      -
      -  bug_cves = []
      -
      -  str.scan(cve_group_all).each do |m|
      -    m[1].scan(cve_group_split).each do |n|
      -      bug_cves << "CVE-%s-%s" % [m[0], n[0]]
      -    end
      -  end
      -
      -  bug_cves
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - simple_format_without_paragraph(text) - click to toggle source -
      - - -
      - -

      Same as Rails’ simple_format helper without using paragraphs

      - - - -
      -
      -# File app/helpers/application_helper.rb, line 16
      -def simple_format_without_paragraph(text)
      -  text.to_s.
      -  gsub(/\r\n?/, "\n").                    # \r\n and \r -> \n
      -  gsub(/\n\n+/, "<br /><br />").          # 2+ newline  -> 2 br
      -  gsub(/([^\n]\n)(?=[^\n])/, '\1<br />')  # 1 newline   -> br
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - whiteboard_to_severity(wb) - click to toggle source -
      - - -
      - -

      Returns the appropriate severity setting for a given whiteboard string

      - - - -
      -
      -# File app/helpers/application_helper.rb, line 73
      -def whiteboard_to_severity(wb)
      -  return 'normal' if wb.length < 2
      -
      -  ev = wb[0..1]
      -  case ev
      -  when 'A0', 'B0'
      -    'blocker'
      -  when 'A1', 'C0'
      -    'critical'
      -  when 'A2', 'B2', 'C1'
      -    'major'
      -  when 'A3', 'B3', 'C2'
      -    'normal'
      -  when 'A4', 'B4', 'C3'
      -    'minor'
      -  when 'C4', '~0', '~1', '~2', '~3', '~4'
      -    'trivial'
      -  else
      -    'normal'
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - with_format(format, &block) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/helpers/application_helper.rb, line 147
      -def with_format(format, &block)
      -  old_formats = formats
      -  begin
      -    self.formats = [format]
      -    return block.call
      -  ensure
      -    self.formats = old_formats
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Authentication.html b/doc/app/Authentication.html deleted file mode 100644 index e7184d2..0000000 --- a/doc/app/Authentication.html +++ /dev/null @@ -1,464 +0,0 @@ - - - - - - - Module: Authentication - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      -
      - -
      -
      - - -
      - -
      - - - - - - - - - - - - -
      - - -
      - -
      -

      Authentication

      - -
      - -

      Authentication module

      - -
      - - - - -
      - - - - - - - - - - -
      -

      Protected Class Methods

      - - -
      - - - -
      - included(base) - click to toggle source -
      - - -
      - -

      Populate user to views, shamelessly stolen from restful auth. ;)

      - - - -
      -
      -# File lib/authentication.rb, line 72
      -def self.included(base)
      -  base.send :helper_method, :current_user if base.respond_to? :helper_method
      -end
      -
      - -
      - - - - -
      - - -
      - -
      -

      Protected Instance Methods

      - - -
      - - - -
      - admin_access_required() - click to toggle source -
      - - -
      - -

      Filter for admin pages

      - - - -
      -
      -# File lib/authentication.rb, line 59
      -def admin_access_required
      -  unless current_user.is_el_jefe?
      -    deny_access "Admin interface"
      -    false
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - current_user() - click to toggle source -
      - - -
      - -

      Returns the ActiveRecord object of the currently logged in user

      - - - -
      -
      -# File lib/authentication.rb, line 67
      -def current_user
      -  User.find_by_login(user_name)
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - login_required() - click to toggle source -
      - - -
      - -

      Login filter to be applied to all pages on GLSAMaker

      - - - -
      -
      -# File lib/authentication.rb, line 16
      -def login_required
      -  # Production authentication via REMOTE_USER
      -  if Rails.env.production? or GLSAMAKER_FORCE_PRODUCTION_AUTH
      -    # REMOTE_USER should be there in FCGI or Passenger
      -    env_user_name = user_name
      -  
      -    # Autentication system most likely broken
      -    if env_user_name.nil?
      -      logger.warn "Neither REMOTE_USER nor HTTP_AUTHORIZATION set in environment."
      -      redirect_to :controller => 'index', :action => 'error', :type => 'system'
      -      return
      -    end
      -
      -    user = User.find_by_login(env_user_name)
      -    
      -    # User not known to GLSAMaker
      -    if user == nil
      -      logger.warn "Unknown user #{env_user_name} tried to log in from #{request.remote_ip}"
      -      redirect_to :controller => 'index', :action => 'error', :type => 'user'
      -      return
      -    end
      -
      -    # User is marked as disabled in the DB
      -    if user.disabled
      -      logger.warn "Disabled user #{env_user_name} tried to log in from #{request.remote_ip}"
      -      redirect_to :controller => 'index', :action => 'error', :type => 'disabled'
      -      return
      -    end
      -
      -    # Auth is fine now.
      -    logger.debug "Environment username: #{env_user_name}"
      -
      -  # For all other environments request, HTTP auth by ourselves
      -  # The password can be set in config/initializers/glsamaker.rb
      -  else
      -    authenticate_or_request_with_http_basic("GLSAMaker testing environment") do |username, password|
      -      logger.debug "Environment username: #{username}"
      -      check_auth(username, password)
      -    end
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Authorization.html b/doc/app/Authorization.html deleted file mode 100644 index b30f20e..0000000 --- a/doc/app/Authorization.html +++ /dev/null @@ -1,435 +0,0 @@ - - - - - - - Module: Authorization - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      -
      - -
      -
      - - -
      - -
      - - - - - - - - - - - - -
      - - -
      - -
      -

      Authorization

      - -
      - -

      Authorization module

      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - check_object_access(glsa) - click to toggle source -
      - - -
      - -

      Checks access to a given GLSA

      - - - -
      -
      -# File lib/authorization.rb, line 14
      -def check_object_access(glsa)
      -  # Contributor, no foreign drafts
      -  if current_user.access == 0
      -    unless glsa.is_owner? current_user
      -      return false
      -    end
      -  elsif current_user.access < 3
      -    if glsa.restricted
      -      return false
      -    end
      -  end
      -
      -  true
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - check_object_access!(glsa) - click to toggle source -
      - - -
      - -

      Checks access to a given GLSA, and aborts the request if the user does not -have sufficient permissions

      - - - -
      -
      -# File lib/authorization.rb, line 30
      -def check_object_access!(glsa)
      -  unless check_object_access(glsa)
      -    deny_access "Access to restricted GLSA #{glsa.id} (#{params[:action]})"
      -    return false
      -  end
      -
      -  true
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - deny_access(msg) - click to toggle source -
      - - -
      - -

      Redirects the user to a ‘Access Denied’ screen and logs the incident

      - - - -
      -
      -# File lib/authorization.rb, line 40
      -def deny_access(msg)
      -  log_unauthorized_access msg
      -  redirect_to :controller => '/index', :action => 'error', :type => 'access'
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - log_unauthorized_access(msg) - click to toggle source -
      - - -
      - -

      Logs an unauthorized access attempt

      - - - -
      -
      -# File lib/authorization.rb, line 46
      -def log_unauthorized_access(msg)
      -  logger.warn "[#{Time.now.rfc2822}] UNAUTHORIZED ACCESS by #{current_user.login} from #{request.remote_ip} to #{request.url}: #{msg}"
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Bug.html b/doc/app/Bug.html deleted file mode 100644 index 1c2d6e8..0000000 --- a/doc/app/Bug.html +++ /dev/null @@ -1,423 +0,0 @@ - - - - - - - Class: Bug - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      -
      - -
      -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - - - - -
      - - -
      - -
      -

      Bug

      - -
      - -

      Bug model

      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - bug_url(secure = true) - click to toggle source -
      - - -
      - -

      Returns the Gentoo Bugzilla URI for the bug. -Set secure to false to get a HTTP instead of a HTTPS URI

      - - - -
      -
      -# File app/models/bug.rb, line 32
      -def bug_url(secure = true)
      -  if secure
      -    "https://#{GLSAMAKER_BUGZIE_HOST}/show_bug.cgi?id=#{self.bug_id}"
      -  else
      -    "http://#{GLSAMAKER_BUGZIE_HOST}/show_bug.cgi?id=#{self.bug_id}"
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - cc() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/models/bug.rb, line 22
      -def cc
      -  self.arches
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - update_cached_metadata() - click to toggle source -
      - - -
      - -

      Updates the cached bug metadata

      - - - -
      -
      -# File app/models/bug.rb, line 41
      -def update_cached_metadata
      -  b = Glsamaker::Bugs::Bug.load_from_id(bug_id)
      -
      -  update_attributes!(
      -    :title => b.summary,
      -    :whiteboard => b.status_whiteboard,
      -    :arches => b.arch_cc.join(', ')
      -  )
      -rescue Exception => e
      -  raise "Could not update cached metadata: " + e.message
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/BugController.html b/doc/app/BugController.html deleted file mode 100644 index e6aecc9..0000000 --- a/doc/app/BugController.html +++ /dev/null @@ -1,383 +0,0 @@ - - - - - - - Class: BugController - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      BugController

      - -
      - -

      GLSAMaker v2

      - -
      Copyright (C) 2009-2011 Alex Legler <a3li@gentoo.org>
      -Copyright (C) 2009 Pierre-Yves Rofes <py@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - bug() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/bug_controller.rb, line 13
      -def bug
      -  begin
      -    @bug = Glsamaker::Bugs::Bug.load_from_id(params[:id].to_i)
      -  rescue SocketError => e
      -    log_error e
      -    @bug = "down"
      -  rescue ArgumentError => e
      -    log_error e
      -    @bug = nil
      -  end
      -  
      -  render :layout => false
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - history() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/bug_controller.rb, line 27
      -def history
      -  begin
      -    @bug = Glsamaker::Bugs::Bug.load_from_id(params[:id].to_i)
      -  rescue SocketError => e
      -    @bug = "down"
      -  rescue ArgumentError => e
      -    @bug = nil
      -  end
      -  
      -  render :layout => false
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/BugHelper.html b/doc/app/BugHelper.html deleted file mode 100644 index 2c61ef9..0000000 --- a/doc/app/BugHelper.html +++ /dev/null @@ -1,311 +0,0 @@ - - - - - - - Module: BugHelper - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      BugHelper

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - linkify_comment(text) - click to toggle source -
      - - -
      - -

      Creates links around common phrases like Bug 12345 or Comment -234

      - - - -
      -
      -# File app/helpers/bug_helper.rb, line 5
      -def linkify_comment(text)
      -  text.gsub(/bug (\d+)/, link_to_function('bug \1', 'buginfo(\1);'))
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/BugsController.html b/doc/app/BugsController.html deleted file mode 100644 index 88b04d3..0000000 --- a/doc/app/BugsController.html +++ /dev/null @@ -1,449 +0,0 @@ - - - - - - - Class: BugsController - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      BugsController

      - -
      - -

      BugsController handles bugs attached to -GLSAs

      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - create() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/bugs_controller.rb, line 24
      -def create
      -  @glsa = Glsa.find(params[:glsa_id].to_i)
      -  return unless check_object_access!(@glsa)
      -
      -  unless @glsa.nil?
      -    @added_bugs = []
      -    Bugzilla::Bug.str2bugIDs(params[:addbugs]).map do |bugid|
      -      begin
      -        @added_bugs << Glsamaker::Bugs::Bug.load_from_id(bugid)
      -      rescue Exception => e
      -        # Silently ignore invalid bugs
      -      end
      -    end
      -
      -    begin
      -      @bugs_text = render_to_string :partial => '/glsa/edit_bug_row', :collection => @added_bugs, :as => :bug
      -    rescue Exception => e
      -      @error = "Error: #{e.message}"
      -    end
      -  else
      -    @error = "Cannot find GLSA"
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - destroy() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/bugs_controller.rb, line 48
      -def destroy
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - new() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/bugs_controller.rb, line 15
      -def new
      -  begin
      -    @glsa = Glsa.find(Integer(params[:glsa_id]))
      -    @bug = Bug.new
      -  rescue Exception
      -    @glsa = nil
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - show() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/bugs_controller.rb, line 51
      -def show
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/BugsHelper.html b/doc/app/BugsHelper.html deleted file mode 100644 index 43597ab..0000000 --- a/doc/app/BugsHelper.html +++ /dev/null @@ -1,261 +0,0 @@ - - - - - - - Module: BugsHelper - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - - - - - - - - -
      - - -
      - -
      -

      BugsHelper

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Bugzilla.html b/doc/app/Bugzilla.html deleted file mode 100644 index 6a47185..0000000 --- a/doc/app/Bugzilla.html +++ /dev/null @@ -1,619 +0,0 @@ - - - - - - - Module: Bugzilla - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - - - -
      - - - - - - -
      -

      Namespace

      - -
      - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      Bugzilla

      - -
      - -

      Bugzilla module

      -
      - -

      Encapsulates a Bugzilla Bug

      -
      - -

      Encapsulates a bug’s history

      -
      - -

      Encapsulates a comment to a Bug

      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - add_comment(bug, comment) - click to toggle source -
      - - -
      - -

      Adds a comment to a bug. Returns the comment id on success, raises an -exception on failure.

      - - - -
      -
      -# File lib/bugzilla.rb, line 25
      -def add_comment(bug, comment)
      -  Rails.logger.debug 'Called Bugzilla.add_comment'
      -  did_retry = false
      -
      -  begin
      -    client = xmlrpc_client
      -
      -    result = client.call('Bug.add_comment', {
      -        'id' => bug.to_i,
      -        'comment' => comment
      -    })
      -    result['id']
      -  rescue XMLRPC::FaultException => e
      -    if did_retry
      -      raise "Could not add the comment: #{e.faultString} (code #{e.faultCode})"
      -    end
      -
      -    # If we need to log in first
      -    if e.faultCode == 410
      -      Rails.logger.debug "Not logged in, doing that now."
      -      log_in
      -      did_retry = true
      -      retry
      -    else
      -      raise "Could not add the comment: #{e.faultString} (code #{e.faultCode})"
      -    end
      -  end
      -
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - file_bug(data) - click to toggle source -
      - - -
      - -

      Files a bug, and returns the id of the filed bug

      - - - -
      -
      -# File lib/bugzilla.rb, line 100
      -def file_bug(data)
      -  Rails.logger.debug 'Called Bugzilla.file_bug'
      -  did_retry = false
      -
      -  begin
      -    client = xmlrpc_client
      -
      -    rpc_data = {}
      -    rpc_data['component'] = data[:component] if data.has_key?(:component)
      -    rpc_data['product'] = data[:product] if data.has_key?(:product)
      -    rpc_data['summary'] = data[:summary] if data.has_key?(:summary)
      -    rpc_data['version'] = data[:version] if data.has_key?(:version)
      -    rpc_data['description'] = data[:comment] if data.has_key?(:comment)
      -    rpc_data['priority'] = data[:priority] if data.has_key?(:priority)
      -    rpc_data['severity'] = data[:severity] if data.has_key?(:severity)
      -    rpc_data['alias'] = data[:alias] if data.has_key?(:alias)
      -    rpc_data['assigned_to'] = data[:assignee] if data.has_key?(:assignee)
      -    rpc_data['cc'] = data[:cc].to_a if data.has_key?(:cc)
      -    rpc_data['status'] = data[:status] if data.has_key?(:status)
      -
      -    result = client.call('Bug.create', rpc_data)
      -    result['id']
      -  rescue XMLRPC::FaultException => e
      -    if did_retry
      -      raise "Could not file the bug: #{e.faultString} (code #{e.faultCode})"
      -    end
      -
      -    # If we need to log in first
      -    if e.faultCode == 410
      -      Rails.logger.debug "Not logged in, doing that now."
      -      log_in
      -      did_retry = true
      -      retry
      -    else
      -      raise "Could not file the bug: #{e.faultString} (code #{e.faultCode})"
      -    end
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - log_in() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File lib/bugzilla.rb, line 139
      -def log_in
      -  Rails.logger.debug "Called Bugzilla.log_in"
      -  raise unless GLSAMAKER_BUGZIE_USER and GLSAMAKER_BUGZIE_PW
      -
      -  client = xmlrpc_client
      -
      -  begin
      -    result = client.call('User.login', {
      -        'login' => GLSAMAKER_BUGZIE_USER,
      -        'password' => GLSAMAKER_BUGZIE_PW
      -    })
      -
      -    Rails.logger.debug "Successfully logged in. UID: #{result['id']}"
      -
      -    cookie_file = File.join(Rails.root, 'tmp', 'bugzie-cookies.txt')
      -    FileUtils.rm(cookie_file) if File.exist?(cookie_file)
      -    FileUtils.touch(cookie_file)
      -    File.chmod(0600, cookie_file)
      -    File.open(cookie_file, 'w') {|f| f.write client.cookie }
      -
      -    return true
      -  rescue XMLRPC::FaultException => e
      -    Rails.logger.warn "Failure logging in: #{e.message}"
      -    return false
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - update_bug(bug, changes = {}) - click to toggle source -
      - - -
      - -

      Updates a bug. Returns an array of changes that were done on the bug.

      - - - -
      -
      -# File lib/bugzilla.rb, line 56
      -def update_bug(bug, changes = {})
      -  Rails.logger.debug 'Called Bugzilla.update_bug'
      -  did_retry = false
      -
      -  begin
      -    client = xmlrpc_client
      -
      -    rpc_data = {}
      -    rpc_data['ids'] = [bug]
      -    rpc_data['component'] = changes[:component] if changes.has_key?(:component)
      -    rpc_data['product'] = changes[:product] if changes.has_key?(:product)
      -    rpc_data['summary'] = changes[:summary] if changes.has_key?(:summary)
      -    rpc_data['version'] = changes[:version] if changes.has_key?(:version)
      -    rpc_data['comment'] = {'body' => changes[:comment]} if changes.has_key?(:comment)
      -    rpc_data['priority'] = changes[:priority] if changes.has_key?(:priority)
      -    rpc_data['severity'] = changes[:severity] if changes.has_key?(:severity)
      -    rpc_data['alias'] = changes[:alias] if changes.has_key?(:alias)
      -    rpc_data['assigned_to'] = changes[:assignee] if changes.has_key?(:assignee)
      -    #rpc_data['cc'] = changes[:cc].to_a if changes.has_key?(:cc) TODO: add and remove
      -    rpc_data['status'] = changes[:status] if changes.has_key?(:status)
      -    rpc_data['whiteboard'] = changes[:whiteboard] if changes.has_key?(:whiteboard)
      -    rpc_data['url'] = changes[:url] if changes.has_key?(:url)
      -    rpc_data['resolution'] = changes[:resolution] if changes.has_key?(:resolution)
      -
      -    result = client.call('Bug.update', rpc_data)
      -    result['bugs'].first
      -  rescue XMLRPC::FaultException => e
      -    if did_retry
      -      raise "Could not file the bug: #{e.faultString} (code #{e.faultCode})"
      -    end
      -
      -    # If we need to log in first
      -    if e.faultCode == 410
      -      Rails.logger.debug "Not logged in, doing that now."
      -      log_in
      -      did_retry = true
      -      retry
      -    else
      -      raise "Could not file the bug: #{e.faultString} (code #{e.faultCode})"
      -    end
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - xmlrpc_client() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File lib/bugzilla.rb, line 166
      -def xmlrpc_client
      -  client = XMLRPC::Client.new(GLSAMAKER_BUGZIE_HOST, '/xmlrpc.cgi', 443, nil, nil, nil, nil, true)
      -  client.http_header_extra = {'User-Agent' => "GLSAMaker/#{GLSAMAKER_VERSION} (http://security.gentoo.org/)"}
      -
      -  cookie_file = File.join(Rails.root, 'tmp', 'bugzie-cookies.txt')
      -  if File.readable? cookie_file
      -    client.cookie = File.read(cookie_file)
      -  end
      -
      -  client
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Bugzilla/Bug.html b/doc/app/Bugzilla/Bug.html deleted file mode 100644 index 5271ac6..0000000 --- a/doc/app/Bugzilla/Bug.html +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - Class: Bugzilla::Bug - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      -
      - -
      -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      Bugzilla::Bug

      - -
      - -
      - - - - -
      - - - - - - - - -
      -

      Attributes

      - - -
      - - -
      - alias[R] -
      - -
      - - - -
      -
      - -
      - - -
      - assigned_to[R] -
      - -
      - - - -
      -
      - -
      - - -
      - blocks[R] -
      - -
      - - - -
      -
      - -
      - - -
      - bug_id[R] -
      - -
      - - - -
      -
      - -
      - - -
      - cc[R] -
      - -
      - - - -
      -
      - -
      - - -
      - comments[R] -
      - -
      - - - -
      -
      - -
      - - -
      - component[R] -
      - -
      - - - -
      -
      - -
      - - -
      - created_at[R] -
      - -
      - - - -
      -
      - -
      - - -
      - depends[R] -
      - -
      - - - -
      -
      - -
      - - -
      - priority[R] -
      - -
      - - - -
      -
      - -
      - - -
      - product[R] -
      - -
      - - - -
      -
      - -
      - - -
      - reporter[R] -
      - -
      - - - -
      -
      - -
      - - -
      - resolution[R] -
      - -
      - - - -
      -
      - -
      - - -
      - restricted[R] -
      - -
      - - - -
      -
      - -
      - - -
      - severity[R] -
      - -
      - - - -
      -
      - -
      - - -
      - status[R] -
      - -
      - - - -
      -
      - -
      - - -
      - status_whiteboard[R] -
      - -
      - - - -
      -
      - -
      - - -
      - summary[R] -
      - -
      - - - -
      -
      - -
      - - -
      - title[R] -
      - -
      - - - -
      -
      - -
      - - -
      - url[R] -
      - -
      - - - -
      -
      - -
      - - - - -
      -

      Public Class Methods

      - - -
      - - - -
      - load_from_id(bugid) - click to toggle source -
      - - -
      - -

      Creates a new Bug object from the Gentoo bug referenced as -#bugid

      - - - -
      -
      -# File lib/bugzilla/bug.rb, line 21
      -def self.load_from_id(bugid)
      -  begin
      -    id = Integer(bugid)
      -
      -    raise ArgumentError if id == 0
      -  rescue ArgumentError => e
      -    raise ArgumentError, "Invalid Bug ID"
      -  end
      -
      -  begin
      -    xml = Nokogiri::XML(Glsamaker::HTTP.get("https://#{GLSAMAKER_BUGZIE_HOST}/show_bug.cgi?ctype=xml&id=#{id}"))
      -  rescue SocketError => e
      -    raise SocketError, "Bugzilla is unreachable: #{e.message}"
      -  rescue Exception => e
      -    raise ArgumentError, "Couldn't load bug: #{e.message}"
      -  end
      -
      -  self.new(xml.root.xpath("bug").first, bugid)
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - new(bug, id) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File lib/bugzilla/bug.rb, line 54
      -def initialize(bug, id)
      -  unless bug.is_a? Nokogiri::XML::Element
      -    raise ArgumentError, "Nokogiri failure"
      -  end
      -
      -  if bug["error"] == "NotFound"
      -    raise ArgumentError, "Bug not found"
      -  elsif bug["error"] == "NotPermitted"
      -    @bug_id = id
      -    @restricted = true
      -    return
      -  end
      -
      -  @restricted = false
      -  @cc = []
      -  @depends = []
      -  @blocks = []
      -  @comments = []
      -
      -  bug.children.each do |node|
      -    # Ignore whitespace
      -    next if node.type == Nokogiri::XML::Node::TEXT_NODE
      -    # Ignore empty nodes
      -    next if node.children.size == 0
      -
      -    case node.name
      -    when "bug_id" then
      -      @bug_id = content_in node
      -    when "short_desc" then
      -      @summary = content_in node
      -    when "creation_ts" then
      -      @created_at = Time.parse(content_in(node))
      -    when "reporter" then
      -      @reporter = content_in node
      -    when "alias" then
      -      @alias = content_in node
      -    when "assigned_to" then
      -      @assigned_to = content_in node
      -    when "cc" then
      -      @cc << content_in(node)
      -    when "status_whiteboard" then
      -      @status_whiteboard = content_in node
      -    when "product" then
      -      @product = content_in node
      -    when "component" then
      -      @component = content_in node
      -    when "bug_status" then
      -      @status = content_in node
      -    when "resolution" then
      -      @resolution = content_in node
      -    when "bug_file_loc" then
      -      @url = content_in node
      -    when "bug_severity" then
      -      @severity = content_in node
      -    when "priority" then
      -      @priority = content_in node
      -    when "dependson" then
      -      @depends << content_in(node)
      -    when "blocked" then
      -      @blocks << content_in(node)
      -    when "long_desc" then
      -      @comments << Bugzilla::Comment.new(
      -        node.xpath("who").first.children.first.to_s,
      -        node.xpath("thetext").first.children.first.to_s,
      -        node.xpath("bug_when").first.children.first.to_s
      -      )
      -    end
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - str2bugIDs(str) - click to toggle source -
      - - -
      - -

      Splits a String str into an array of -valid bug IDs

      - - - -
      -
      -# File lib/bugzilla/bug.rb, line 130
      -def self.str2bugIDs(str)
      -  bug_ids = str.split(/,\s*/)
      -
      -  bug_ids.map do |bug|
      -    bug.gsub(/\D/, '')
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - -
      -

      Public Instance Methods

      - - -
      - - - -
      - description() - click to toggle source -
      - - -
      - -

      Returns the initial bug description

      - - - -
      -
      -# File lib/bugzilla/bug.rb, line 125
      -def description
      -  @comments.first.text
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - history() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File lib/bugzilla/bug.rb, line 50
      -def history()
      -  @history ||= History.new(self)
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Bugzilla/Bugzilla.html b/doc/app/Bugzilla/Bugzilla.html deleted file mode 100644 index eb7b038..0000000 --- a/doc/app/Bugzilla/Bugzilla.html +++ /dev/null @@ -1,268 +0,0 @@ - - - - - - - Module: Bugzilla::Bugzilla - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      -
      -
        - -
      -
      -
      - - -
      - -
      - - - - - - -
      -

      Namespace

      - -
      - - - - - -
      - - -
      - -
      -

      Bugzilla::Bugzilla

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Bugzilla/Bugzilla/Bugzilla.html b/doc/app/Bugzilla/Bugzilla/Bugzilla.html deleted file mode 100644 index e9973d4..0000000 --- a/doc/app/Bugzilla/Bugzilla/Bugzilla.html +++ /dev/null @@ -1,268 +0,0 @@ - - - - - - - Module: Bugzilla::Bugzilla::Bugzilla - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      -
      -
        - -
      -
      -
      - - -
      - -
      - - - - - - -
      -

      Namespace

      - -
      - - - - - -
      - - -
      - -
      -

      Bugzilla::Bugzilla::Bugzilla

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Bugzilla/Bugzilla/Bugzilla/Change.html b/doc/app/Bugzilla/Bugzilla/Bugzilla/Change.html deleted file mode 100644 index b80192d..0000000 --- a/doc/app/Bugzilla/Bugzilla/Bugzilla/Change.html +++ /dev/null @@ -1,461 +0,0 @@ - - - - - - - Class: Bugzilla::Bugzilla::Bugzilla::Change - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      Bugzilla::Bugzilla::Bugzilla::Change

      - -
      - -

      This represents a single Change made to a Bug

      - -
      - - - - -
      - - - - - - - - -
      -

      Attributes

      - - -
      - - -
      - changes[R] -
      - -
      - - - -
      -
      - -
      - - -
      - time[R] -
      - -
      - - - -
      -
      - -
      - - -
      - user[R] -
      - -
      - - - -
      -
      - -
      - - - - -
      -

      Public Class Methods

      - - -
      - - - -
      - new(user, time) - click to toggle source -
      - - -
      - -

      Creates a new Change made by user at -time.

      - - - -
      -
      -# File lib/bugzilla/history.rb, line 80
      -def initialize(user, time)
      -  @user = user || ""
      -  @time = Time.parse(time)
      -  @changes = {}
      -end
      -
      - -
      - - - - -
      - - -
      - -
      -

      Public Instance Methods

      - - -
      - - - -
      - add_change(field, removed, added) - click to toggle source -
      - - -
      - -

      Adds a changed field to the Change -object. removed denotes the removed text and added is the -new text

      - - - -
      -
      -# File lib/bugzilla/history.rb, line 88
      -def add_change(field, removed, added)    
      -  raise(ArgumentError, "field has to be a symbol") unless field.is_a? Symbol
      -
      -  if @changes.has_key?(field)
      -    @changes[field][0] += " #{removed}"
      -    @changes[field][1] += " #{added}"
      -  else
      -    @changes[field] = [removed, added]
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - to_s() - click to toggle source -
      - - -
      - -

      Returns a string representation

      - - - -
      -
      -# File lib/bugzilla/history.rb, line 100
      -def to_s
      -  "#{@user} changed at #{@time.to_s}: #{@changes.inspect}"
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Bugzilla/Comment.html b/doc/app/Bugzilla/Comment.html deleted file mode 100644 index 3db75d2..0000000 --- a/doc/app/Bugzilla/Comment.html +++ /dev/null @@ -1,372 +0,0 @@ - - - - - - - Class: Bugzilla::Comment - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      Bugzilla::Comment

      - -
      - -
      - - - - -
      - - - - - - - - -
      -

      Attributes

      - - -
      - - -
      - author[R] -
      - -
      - - - -
      -
      - -
      - - -
      - date[R] -
      - -
      - - - -
      -
      - -
      - - -
      - text[R] -
      - -
      - - - -
      -
      - -
      - - - - -
      -

      Public Class Methods

      - - -
      - - - -
      - new(by, text, date) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File lib/bugzilla/comment.rb, line 16
      -def initialize(by, text, date)
      -  @author = by
      -  @text = text
      -  @date = Time.parse(date)
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Bugzilla/History.html b/doc/app/Bugzilla/History.html deleted file mode 100644 index b4b5d04..0000000 --- a/doc/app/Bugzilla/History.html +++ /dev/null @@ -1,470 +0,0 @@ - - - - - - - Class: Bugzilla::History - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      Bugzilla::History

      - -
      - -
      - - - - -
      - - - - - - - - -
      -

      Attributes

      - - -
      - - -
      - changes[R] -
      - -
      - - - -
      -
      - -
      - - - - -
      -

      Public Class Methods

      - - -
      - - - -
      - new(bug) - click to toggle source -
      - - -
      - -

      Creates a new History for the Bug object bug.

      - - - -
      -
      -# File lib/bugzilla/history.rb, line 7
      -def initialize(bug)
      -  unless bug.respond_to? :bug_id
      -    raise ArgumentError, "Need a bug (or something that at least looks like a bug)"
      -  end
      -
      -  begin
      -    html = Nokogiri::HTML(Glsamaker::HTTP.get("https://bugs.gentoo.org/show_activity.cgi?id=#{bug.bug_id}"))
      -  rescue Exception => e
      -    raise ArgumentError, "Couldn't load the bug history: #{e.message}"
      -  end
      -
      -  @changes = []
      -  change_cache = nil
      -
      -  html.xpath("/html/body/table/tr").each do |change|
      -    # ignore header line
      -    next if change.children.first.name == "th"
      -  
      -    # First line in a multi-change set
      -    unless (chcount = change.children.first["rowspan"]) == nil
      -      change_cache = Change.new(change.children.first.content.strip, change.children[2].content.strip)
      -    
      -      change_cache.add_change(
      -        change.children[4].content.strip.downcase.to_sym,
      -        change.children[6].content.strip,
      -        change.children[8].content.strip
      -      )
      -    
      -      @changes << change_cache          
      -    else
      -      change_cache.add_change(
      -        change.children[0].content.strip.downcase.to_sym,
      -        change.children[2].content.strip,
      -        change.children[4].content.strip
      -      )
      -    end
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - -
      -

      Public Instance Methods

      - - -
      - - - -
      - by_field(field) - click to toggle source -
      - - -
      - -

      Returns an Array of Changes made to the field field

      - - - -
      -
      -# File lib/bugzilla/history.rb, line 47
      -def by_field(field)
      -  raise(ArgumentError, "Symbol expected") unless field.is_a? Symbol
      -
      -  changes = []
      -
      -  @changes.each do |change|
      -    if change.changes.has_key?(field)
      -      changes << change
      -    end
      -  end
      -  
      -  changes
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - by_user(user) - click to toggle source -
      - - -
      - -

      Returns an Array of Changes made by the user user

      - - - -
      -
      -# File lib/bugzilla/history.rb, line 62
      -def by_user(user)
      -  changes = []
      -
      -  @changes.each do |change|
      -    if change.user == user
      -      changes << change
      -    end
      -  end
      -
      -  changes
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Comment.html b/doc/app/Comment.html deleted file mode 100644 index 912a6d8..0000000 --- a/doc/app/Comment.html +++ /dev/null @@ -1,293 +0,0 @@ - - - - - - - Class: Comment - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      -
      - -
      -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - -
      -

      Namespace

      - -
      - - - - - - -
      -

      Included Modules

      - -
      - -
      - - -
      - -
      -

      Comment

      - -
      - -

      Comment model

      - -
      - - - - -
      - - - - - - - - - - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Comment/CommentValidator.html b/doc/app/Comment/CommentValidator.html deleted file mode 100644 index e2895ab..0000000 --- a/doc/app/Comment/CommentValidator.html +++ /dev/null @@ -1,328 +0,0 @@ - - - - - - - Class: Comment::CommentValidator - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      -
      - -
      -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      Comment::CommentValidator

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - validate(record) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/models/comment.rb, line 24
      -def validate(record)
      -  if record.glsa.is_owner? record.user
      -    if record.rating != 'neutral'
      -      record.errors[:rating] << 'The owner of a draft cannot make approvals or rejections'
      -    end
      -  end
      -
      -  if record.user.access < 2
      -    if record.rating != 'neutral'
      -      record.errors[:rating] << 'You may not approve or reject drafts'
      -    end
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/CommentsController.html b/doc/app/CommentsController.html deleted file mode 100644 index 91da088..0000000 --- a/doc/app/CommentsController.html +++ /dev/null @@ -1,459 +0,0 @@ - - - - - - - Class: CommentsController - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      CommentsController

      - -
      - -

      CommentController handles comments made for GLSAs

      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - create() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/comments_controller.rb, line 24
      -def create
      -  @glsa = Glsa.find(params[:glsa_id].to_i)
      -
      -  unless @glsa.nil?
      -    comment_data = params[:newcomment]
      -    comment = nil
      -
      -    if comment_data['text'].strip != ''
      -      comment = @glsa.comments.build(comment_data)
      -      comment.user = current_user
      -
      -      if comment.save
      -        Glsamaker::Mail.comment_notification(@glsa, comment, current_user)
      -
      -        if @glsa.is_approved? and @glsa.approvals.count ==  @glsa.rejections.count + 2
      -          Glsamaker::Mail.approval_notification(@glsa)
      -        end
      -      else
      -        @error = comment.errors
      -        render
      -        return
      -      end
      -    end
      -
      -    begin
      -      @comment_number = @glsa.comments.count
      -      @comment_text = render_to_string :partial => "/glsa/comment", :object => comment
      -    rescue Exception => e
      -      @error = "Error: #{e.message}"
      -    end
      -  else
      -    @error = "Error: Cannot find GLSA"
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - destroy() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/comments_controller.rb, line 62
      -def destroy
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - new() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/comments_controller.rb, line 15
      -def new
      -  begin
      -    @glsa = Glsa.find(Integer(params[:glsa_id]))
      -    @comment = Comment.new
      -  rescue Exception => e
      -    @glsa = nil
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - show() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/comments_controller.rb, line 59
      -def show
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/CommentsHelper.html b/doc/app/CommentsHelper.html deleted file mode 100644 index 8207f2d..0000000 --- a/doc/app/CommentsHelper.html +++ /dev/null @@ -1,261 +0,0 @@ - - - - - - - Module: CommentsHelper - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - - - - - - - - -
      - - -
      - -
      -

      CommentsHelper

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Cpe.html b/doc/app/Cpe.html deleted file mode 100644 index 21965be..0000000 --- a/doc/app/Cpe.html +++ /dev/null @@ -1,434 +0,0 @@ - - - - - - - Class: Cpe - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      -
      - -
      -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      Cpe

      - -
      - -

      GLSAMaker v2

      - -
      Copyright (C) 2010 Alex Legler <a3li@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - product() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/models/cpe.rb, line 22
      -def product
      -  split[3]
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - split() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/models/cpe.rb, line 14
      -def split
      -  self.cpe.split(':')
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - vendor() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/models/cpe.rb, line 18
      -def vendor
      -  split[2]
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - version() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/models/cpe.rb, line 26
      -def version
      -  split[4]
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Cve.html b/doc/app/Cve.html deleted file mode 100644 index 1d325de..0000000 --- a/doc/app/Cve.html +++ /dev/null @@ -1,821 +0,0 @@ - - - - - - - Class: Cve - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      -
      - -
      -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      Cve

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Class Methods

      - - -
      - - - -
      - concat(cves, separator = "\n\n") - click to toggle source -
      - - -
      - -

      Concatenates the CVE descriptions of many cves, separated by separator

      - - - -
      -
      -# File app/models/cve.rb, line 45
      -def self.concat(cves, separator = "\n\n")
      -  txt = ""
      -  cves.each do |cve|
      -    txt += Cve.find(cve).to_s
      -    txt += separator
      -  end
      -  txt
      -end
      -
      - -
      - - - - -
      - - -
      - -
      -

      Public Instance Methods

      - - -
      - - - -
      - add_comment(user, comment, confidential = false) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/models/cve.rb, line 125
      -def add_comment(user, comment, confidential = false)
      -  self.comments << CveComment.create!(
      -    :user => user,
      -    :confidential => confidential,
      -    :comment => comment
      -  )
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - assign(bugnr, user, action = 'assign') - click to toggle source -
      - - -
      - -

      Assigns the CVE to a certain bug, creating a history entry

      - - - -
      -
      -# File app/models/cve.rb, line 55
      -def assign(bugnr, user, action = 'assign')
      -  bugnr = Integer(bugnr)
      -  
      -  case action
      -  when 'assign', :assign
      -    act = 'assign'
      -  when 'file', :file
      -    act = 'file'
      -  else
      -    raise ArgumentError, "Invalid action specified"
      -  end
      -  
      -  a = self.assignments.create!(:bug => bugnr)
      -  
      -  ch = self.cve_changes.create!(
      -    :user => user,
      -    :action => act,
      -    :object => a.id
      -  )
      -  
      -  self.state = 'ASSIGNED'
      -  save!
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - colorize(field = :cve_id) - click to toggle source -
      - - -
      - -

      Decorates the output of field with a color, depending on the status

      - - - -
      -
      -# File app/models/cve.rb, line 134
      -def colorize(field = :cve_id)
      -  "<span class='cvename cve-%s'>%s</span>" % [state.downcase, self[field]]
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - invalidate(user, reason = nil) - click to toggle source -
      - - -
      - -

      Mark the CVE as INVALID, creating a history entry

      - - - -
      -
      -# File app/models/cve.rb, line 92
      -def invalidate(user, reason = nil)
      -  self.cve_changes.create!(
      -    :user => user,
      -    :action => 'invalid',
      -    :object => reason
      -  )
      -  
      -  self.state = 'INVALID'
      -  save!
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - later(user, reason = nil) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/models/cve.rb, line 103
      -def later(user, reason = nil)
      -  self.cve_changes.create!(
      -    :user => user,
      -    :action => 'later',
      -    :object => reason
      -  )
      -  
      -  self.state = 'LATER'
      -  save!
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - mark_new(user, reason = nil) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/models/cve.rb, line 114
      -def mark_new(user, reason = nil)
      -  self.cve_changes.create!(
      -    :user => user,
      -    :action => 'new',
      -    :object => reason
      -  )
      -  
      -  self.state = 'NEW'
      -  save!
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - nfu(user, reason = nil) - click to toggle source -
      - - -
      - -

      Mark the CVE as Not-For-Us, creating a history entry

      - - - -
      -
      -# File app/models/cve.rb, line 80
      -def nfu(user, reason = nil)
      -  self.cve_changes.create!(
      -    :user => user,
      -    :action => 'nfu',
      -    :object => reason
      -  )
      -  
      -  self.state = 'NFU'
      -  save!
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - package_hints() - click to toggle source -
      - - -
      - -

      Looks for Gentoo packages that might be affected by this CVE

      - - - -
      -
      -# File app/models/cve.rb, line 139
      -def package_hints
      -  def search(s)
      -    return [] if s.nil? or s == ""
      -    
      -    Glsamaker::Portage.find_packages(
      -      Regexp.compile(Regexp.escape(s).gsub(/[^a-zA-Z0-9]/, '.*?'), Regexp::IGNORECASE)
      -    )
      -  end
      -  
      -  package_hints = []
      -  my_cpes = cpes.map {|c| c.product }.uniq
      -  package_hints << my_cpes.map {|c| search c }.flatten
      -  
      -  # stolen from the old cvetools.py
      -  if summary =~ / in (\S+\.\S+) in (?:the )?(?:a )?(\D+) \d+/
      -    match = $2
      -    if match.end_with? 'before'
      -      package_hints << search(match[0, match.length - 7])
      -    else
      -      package_hints << search(match)
      -    end
      -  end
      -  
      -  if summary =~ / in (?:the )?(?:a )?(\D+) \d+/
      -    match = $1
      -    if match.end_with? 'before'
      -      package_hints << search(match[0, match.length - 7])
      -    else
      -      package_hints << search(match)
      -    end
      -  end
      -  
      -  if summary =~ / in (\S+\.\S+) in (?:the )?(?:a )?(\S+) /
      -    package_hints << search($1)
      -  end
      -  
      -  if summary =~ / in (?:the )?(?:a )?(\S+) /
      -    package_hints << search($1)
      -  end
      -  
      -  if summary =~ /(?:The )?(\S+) /
      -    package_hints << search($1)
      -  end
      -  
      -  package_hints.flatten.uniq
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - search(s) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/models/cve.rb, line 140
      -def search(s)
      -  return [] if s.nil? or s == ""
      -  
      -  Glsamaker::Portage.find_packages(
      -    Regexp.compile(Regexp.escape(s).gsub(/[^a-zA-Z0-9]/, '.*?'), Regexp::IGNORECASE)
      -  )
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - to_s(line_length = 78) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/models/cve.rb, line 28
      -def to_s(line_length = 78)
      -  str = "#{self.cve_id} #{"(%s):" % url}\n"
      -  str += "  " + Glsamaker::help.word_wrap(self.summary, line_length-2).gsub(/\n/, "\n  ")
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - url(site = :nvd) - click to toggle source -
      - - -
      - -

      Returns the URL for this CVE at NVD (:nvd, default) or MITRE -(:mitre)

      - - - -
      -
      -# File app/models/cve.rb, line 34
      -def url(site = :nvd)
      -  if site == :nvd
      -    "http://nvd.nist.gov/nvd.cfm?cvename=%s" % self.cve_id
      -  elsif site == :mitre
      -    "http://cve.mitre.org/cgi-bin/cvename.cgi?name=%s" % self.cve_id
      -  else
      -    raise ArgumentError, 'Invalid site'
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/CveAssignment.html b/doc/app/CveAssignment.html deleted file mode 100644 index 3a8b58f..0000000 --- a/doc/app/CveAssignment.html +++ /dev/null @@ -1,269 +0,0 @@ - - - - - - - Class: CveAssignment - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - - -
      - - -
      - -
      -

      CveAssignment

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/CveChange.html b/doc/app/CveChange.html deleted file mode 100644 index 1e4f8e2..0000000 --- a/doc/app/CveChange.html +++ /dev/null @@ -1,269 +0,0 @@ - - - - - - - Class: CveChange - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - - -
      - - -
      - -
      -

      CveChange

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/CveComment.html b/doc/app/CveComment.html deleted file mode 100644 index b8a009e..0000000 --- a/doc/app/CveComment.html +++ /dev/null @@ -1,269 +0,0 @@ - - - - - - - Class: CveComment - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - - -
      - - -
      - -
      -

      CveComment

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/CveController.html b/doc/app/CveController.html deleted file mode 100644 index 84b8448..0000000 --- a/doc/app/CveController.html +++ /dev/null @@ -1,1175 +0,0 @@ - - - - - - - Class: CveController - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - - -
      -

      Included Modules

      - -
      - -
      - - -
      - -
      -

      CveController

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - actions() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/cve_controller.rb, line 273
      -def actions
      -  @cve = Cve.where(:cve_id => params[:cve_id]).first
      -  raise "Cannot find CVE" if @cve == nil
      -
      -  render :layout => false
      -rescue Exception => e
      -  log_error e
      -  render :text => e.message, :status => 500
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - assign() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/cve_controller.rb, line 136
      -def assign
      -  bug_id = Integer(params[:bug])
      -  cves = params[:cves].split(',').map{|cve| Integer(cve)}
      -  logger.debug { "Assign Bug: #{bug_id} CVElist: " + cves.inspect }
      -
      -  if params[:comment] or params[:summary]
      -    bug = Glsamaker::Bugs::Bug.load_from_id(bug_id)
      -    cve_ids = cves.map {|c| Cve.find(c).cve_id }
      -    changes = {}
      -
      -    changes[:comment] = Cve.concat(cves) if params[:comment] == 'true'
      -    changes[:summary] = cveify_bug_title(bug.summary, cve_ids) if params[:summary] == 'true'
      -    Bugzilla.update_bug(bug_id, changes)
      -  end
      -
      -  cves.each {|cve_id| Cve.find(cve_id).assign(bug_id, current_user, :assign) }
      -
      -  render :text => "ok"
      -rescue Exception => e
      -  log_error e
      -  render :text => e.message, :status => 500
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - assign_preview() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/cve_controller.rb, line 118
      -def assign_preview
      -  bug_id = Integer(params[:bug])
      -  cves = params[:cves].split(',').map{|cve| Integer(cve)}
      -  logger.debug { "Assign Bug: #{bug_id} CVElist: " + cves.inspect }
      -
      -  cve_ids = cves.map {|c| Cve.find(c).cve_id }
      -  logger.debug { cve_ids.inspect }
      -
      -  @cve_txt = Cve.concat(cves)
      -  @bug = Glsamaker::Bugs::Bug.load_from_id(bug_id)
      -  @summary = cveify_bug_title(@bug.summary, cve_ids)
      -
      -  render :layout => false
      -rescue Exception => e
      -  log_error e
      -  render :text => e.message, :status => 500
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - bug() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/cve_controller.rb, line 55
      -def bug
      -  cve_nums = params[:cves].split(',').map{|cve| Integer(cve)}
      -  logger.debug { "File new Bug (final); CVElist: " + cve_nums.inspect }
      -
      -  cves = cve_nums.map {|c| Cve.find(c) }
      -
      -  data = {
      -    :product => 'Gentoo Security',
      -    :component => params[:bug_type] == 'true' ? 'Vulnerabilities' : 'Kernel',
      -    :summary => params[:bug_title],
      -    :assignee => 'security@gentoo.org'
      -  }
      -
      -  cc = []
      -  if params[:cc_maint] == 'true'
      -    cc += Glsamaker::Portage.get_maintainers(params[:package])
      -  end
      -
      -  cc += params[:cc_custom].split(',')
      -  data[:cc] = cc.compact.delete_if {|i| i == ''}
      -
      -  comment = ""
      -  if params[:add_cves] == 'true'
      -    comment += Cve.concat(cve_nums)
      -  end
      -
      -  if params[:add_comment] == 'true'
      -    comment += "\n" if params[:add_cves]
      -    comment += params[:comment]
      -  end
      -  data[:comment] = comment
      -
      -  whiteboard = ""
      -  if params[:bug_type] == 'true' # If the bug is not a kernel issue
      -    whiteboard += "%s %s" % [params[:wb_1], params[:wb_2]]
      -    whiteboard += " %s" % params[:wb_ext] unless params[:wb_ext] == ""
      -  else
      -    whiteboard = params[:wb_ext]
      -  end
      -
      -  data[:severity] = whiteboard_to_severity(whiteboard)
      -  data[:version] = 'unspecified'
      -  data[:status] = 'IN_PROGRESS'
      -
      -  bugnr = -1
      -  begin
      -    bugnr = Bugzilla.file_bug(data)
      -    Bugzilla.update_bug(bugnr, {:whiteboard => whiteboard})
      -  rescue Exception => e
      -    log_error e
      -    raise "Filing the bug failed. Check if the accounts in CC actually exist."
      -  end
      -
      -  logger.info "Filed bug #{bugnr} on behalf of user #{current_user.login}."
      -
      -  cves.each {|cve| cve.assign(bugnr, current_user, :file) }
      -
      -  render :text => 'ok'
      -rescue Exception => e
      -  log_error e
      -  render :text => e.message, :status => 500
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - bug_package() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/cve_controller.rb, line 23
      -def bug_package
      -  cve_nums = params[:cves].split(',').map{|cve| Integer(cve)}
      -  logger.debug { "File new Bug; CVElist: " + cve_nums.inspect }
      -
      -  cves = cve_nums.map {|c| Cve.find(c) }
      -  cpes = cves.map {|c| c.cpes.map{|cpe| cpe.product } }.flatten.uniq
      -
      -  package_hints = cves.map{|c| c.package_hints }.flatten.uniq.sort
      -  logger.debug { "CPE Products: " + cpes.inspect }
      -  logger.debug { "Package hints: " + package_hints.inspect }
      -
      -  logger.debug { {:package_hints => package_hints}.to_json }
      -  render :json => {:package_hints => package_hints}.to_json
      -rescue Exception => e
      -  log_error e
      -  render :text => e.message, :status => 500
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - bug_preview() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/cve_controller.rb, line 41
      -def bug_preview
      -  cve_nums = params[:cves].split(',').map{|cve| Integer(cve)}
      -  logger.debug { "File new Bug (preview); CVElist: " + cve_nums.inspect }
      -
      -  @cve_ids = cve_nums.map {|c| Cve.find(c).cve_id }
      -  @cve_txt = Cve.concat(cve_nums)
      -  @package = params[:package]
      -  @maintainers = Glsamaker::Portage.get_maintainers(params[:package])
      -  render :layout => false
      -rescue Exception => e
      -  log_error e
      -  render :text => e.message, :status => 500    
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - changes() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/cve_controller.rb, line 263
      -def changes
      -  @cve = Cve.where(:cve_id => params[:cve_id]).first
      -  raise "Cannot find CVE" if @cve == nil
      -
      -  render :layout => false
      -rescue Exception => e
      -  log_error e
      -  render :text => e.message, :status => 500
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - comments() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/cve_controller.rb, line 253
      -def comments
      -  @cve = Cve.where(:cve_id => params[:cve_id]).first
      -  raise "Cannot find CVE" if @cve == nil
      -
      -  render :layout => false
      -rescue Exception => e
      -  log_error e
      -  render :text => e.message, :status => 500
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - general_info() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/cve_controller.rb, line 220
      -def general_info
      -  @cve = Cve.where(:cve_id => params[:cve_id]).first
      -
      -  render :layout => false
      -rescue Exception => e
      -  log_error e
      -  render :text => e.message, :status => 500
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - index() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/cve_controller.rb, line 5
      -def index
      -  @pageID = 'cve'
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - info() - click to toggle source -
      - - -
      - -

      Popup methods

      - - - -
      -
      -# File app/controllers/cve_controller.rb, line 216
      -def info
      -  @cve = Cve.where(:cve_id => params[:id]).first
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - invalid() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/cve_controller.rb, line 187
      -def invalid
      -  @cves = params[:cves].split(',').map{|cve| Integer(cve)}
      -  logger.debug { "Invalid CVElist: " + @cves.inspect + " Reason: " + params[:reason] }
      -
      -  @cves.each do |cve_id|
      -    Cve.find(cve_id).invalidate(current_user, params[:reason])
      -  end
      -
      -  render :text => "ok"
      -rescue Exception => e
      -  log_error e
      -  render :text => e.message, :status => 500
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - later() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/cve_controller.rb, line 201
      -def later
      -  @cves = params[:cves].split(',').map{|cve| Integer(cve)}
      -  logger.debug { "LATER CVElist: " + @cves.inspect + " Reason: " + params[:reason] }
      -
      -  @cves.each do |cve_id|
      -    Cve.find(cve_id).later(current_user, params[:reason])
      -  end
      -
      -  render :text => "ok"
      -rescue Exception => e
      -  log_error e
      -  render :text => e.message, :status => 500
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - list() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/cve_controller.rb, line 9
      -def list
      -  @pageID = 'cve'
      -
      -  condition = view_mask_to_condition(params[:view_map].to_i)
      -  @cves = Cve.where(condition).limit(500).order('cve_id DESC')
      -
      -  respond_to do |format|
      -    format.html
      -    format.json {
      -      x = @cves.map {|cve| [cve.id, cve.colorize(:cve_id), CGI.escapeHTML(cve.summary), cve.state]}
      -      render :text => x.to_json }
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - mark_new() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/cve_controller.rb, line 283
      -def mark_new
      -  @cve = Cve.where(:cve_id => params[:cve_id]).first
      -
      -  @cve.mark_new(current_user)
      -  render :text => "ok"
      -rescue Exception => e
      -  log_error e
      -  render :text => e.message, :status => 500
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - nfu() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/cve_controller.rb, line 159
      -def nfu
      -  @cves = params[:cves].split(',').map{|cve| Integer(cve)}
      -  logger.debug { "NFU CVElist: " + @cves.inspect + " Reason: " + params[:reason] }
      -
      -  @cves.each do |cve_id|
      -    Cve.find(cve_id).nfu(current_user, params[:reason])
      -  end
      -
      -  render :text => "ok"
      -rescue Exception => e
      -  log_error e
      -  render :text => e.message, :status => 500
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - note() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/cve_controller.rb, line 173
      -def note
      -  @cves = params[:cves].split(',').map{|cve| Integer(cve)}
      -  logger.debug { "Note CVElist: " + @cves.inspect + " Note: " + params[:note] }
      -
      -  @cves.each do |cve_id|
      -    Cve.find(cve_id).add_comment(current_user, params[:note])
      -  end
      -
      -  render :text => "ok"
      -rescue Exception => e
      -  log_error e
      -  render :text => e.message, :status => 500
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - packages() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/cve_controller.rb, line 239
      -def packages
      -  @cve = Cve.where(:cve_id => params[:cve_id]).first
      -  raise "Cannot find CVE" if @cve == nil
      -
      -  @package_hints = @cve.package_hints
      -
      -  logger.debug @package_hints.inspect
      -
      -  render :layout => false
      -rescue Exception => e
      -  log_error e
      -  render :text => e.message, :status => 500
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - references() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/cve_controller.rb, line 229
      -def references
      -  @cve = Cve.where(:cve_id => params[:cve_id]).first
      -  raise "Cannot find CVE" if @cve == nil
      -
      -  render :layout => false
      -rescue Exception => e
      -  log_error e
      -  render :text => e.message, :status => 500
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/CveHelper.html b/doc/app/CveHelper.html deleted file mode 100644 index 99ef12a..0000000 --- a/doc/app/CveHelper.html +++ /dev/null @@ -1,318 +0,0 @@ - - - - - - - Module: CveHelper - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      CveHelper

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - view_mask_to_condition(mask) - click to toggle source -
      - - -
      - -

      Converts a bit mask to a condition usable by AR

      - - - -
      -
      -# File app/helpers/cve_helper.rb, line 3
      -def view_mask_to_condition(mask)
      -  conditions = []
      -
      -  conditions << 'state = "NEW"' if mask & 1 == 1
      -  conditions << 'state = "ASSIGNED"' if mask & 2 == 2
      -  conditions << 'state = "LATER"' if mask & 4 == 4
      -  conditions << 'state = "NFU"' if mask & 8 == 8
      -  conditions << 'state = "INVALID"' if mask & 16 == 16
      -
      -  conditions.join(' OR ')
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/CveReference.html b/doc/app/CveReference.html deleted file mode 100644 index 4bbcf6d..0000000 --- a/doc/app/CveReference.html +++ /dev/null @@ -1,269 +0,0 @@ - - - - - - - Class: CveReference - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - - -
      - - -
      - -
      -

      CveReference

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/GLSAReleaseError.html b/doc/app/GLSAReleaseError.html deleted file mode 100644 index e72d841..0000000 --- a/doc/app/GLSAReleaseError.html +++ /dev/null @@ -1,269 +0,0 @@ - - - - - - - Class: GLSAReleaseError - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      -
      - -
      -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - - -
      - - -
      - -
      -

      GLSAReleaseError

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Glsa.html b/doc/app/Glsa.html deleted file mode 100644 index de38479..0000000 --- a/doc/app/Glsa.html +++ /dev/null @@ -1,1086 +0,0 @@ - - - - - - - Class: Glsa - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      -
      - -
      -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - - - - - -
      - - -
      - -
      -

      Glsa

      - -
      - -

      GLSA model

      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Class Methods

      - - -
      - - - -
      - new_request(title, bugs, comment, access, import_references, user) - click to toggle source -
      - - -
      - -

      Files a new GLSA request

      - - - -
      -
      -# File app/models/glsa.rb, line 185
      -def self.new_request(title, bugs, comment, access, import_references, user)
      -  glsa = Glsa.new
      -  glsa.requester = user
      -  glsa.glsa_id = Digest::MD5.hexdigest(title + Time.now.to_s)[0...9]
      -  glsa.restricted = (access == "confidential")
      -  glsa.status = "request"
      -
      -  begin
      -    glsa.save!
      -  rescue Exception => e
      -    raise Exception, "Error while saving the GLSA object: #{e.message}"
      -  end
      -
      -  unless comment.strip.blank?
      -    glsa.comments << Comment.new(:rating => "neutral", :text => comment, :user => user)
      -
      -    begin
      -      glsa.save!
      -    rescue Exception => e
      -      raise Exception, "Error while saving the comment: #{e.message}"
      -    end
      -  end
      -
      -  revision = Revision.new
      -  revision.revid = glsa.next_revid
      -  revision.glsa = glsa
      -  revision.title = title
      -  revision.user = user
      -
      -  begin
      -    revision.save!
      -  rescue Exception => e
      -    glsa.delete
      -    raise Exception, "Error while saving Revision object: #{e.message}"
      -  end
      -
      -  bugs = Bugzilla::Bug.str2bugIDs(bugs)
      -
      -  bugs.each do |bug|
      -    begin
      -      b = Glsamaker::Bugs::Bug.load_from_id(bug)
      -    
      -      revision.bugs.create(
      -        :bug_id => bug,
      -        :title => b.summary,
      -        :whiteboard => b.status_whiteboard,
      -        :arches => b.arch_cc.join(', ')
      -      )
      -    rescue Exception => e
      -      # In case of bugzilla errors, just keep the bug #
      -      revision.bugs.create(:bug_id => bug)
      -    end
      -  end
      -
      -  if import_references
      -    logger.debug { "importing references" }
      -    refs = []
      -    glsa.related_cves.each do |cve|
      -      refs << {:title => cve.cve_id, :url => cve.url}
      -    end
      -    glsa.add_references refs
      -  end
      -
      -  glsa
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - next_id(month = Time.now) - click to toggle source -
      - - -
      - -

      Calculates the next GLSA ID for the given month, or the current month

      - - - -
      -
      -# File app/models/glsa.rb, line 173
      -def self.next_id(month = Time.now)
      -  month_id = month.strftime("%Y%m")
      -  items = Glsa.where("glsa_id LIKE ? AND status = ?", month_id + '%', 'release').order('glsa_id DESC')
      -
      -  return "#{month_id}-01" if items.length == 0
      -
      -  items.first.glsa_id =~ /^#{month_id}-(\d+)$/
      -  next_id = Integer($1) + 1
      -  "#{month_id}-#{format "%02d", next_id}"
      -end
      -
      - -
      - - - - -
      - - -
      - -
      -

      Public Instance Methods

      - - -
      - - - -
      - add_references(refs) - click to toggle source -
      - - -
      - -

      Bulk addition of references. Expects an array of hashes {:title => -..., :url => ...}

      - - - -
      -
      -# File app/models/glsa.rb, line 134
      -def add_references(refs)
      -  rev = last_revision.deep_copy
      -  
      -  refs.each do |reference|
      -    rev.references.create(reference)
      -  end
      -  
      -  invalidate_last_revision_cache
      -  self
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - approval_status() - click to toggle source -
      - - -
      - -

      The approval status of the GLSA, either :approved, :commented, or :none

      - - - -
      -
      -# File app/models/glsa.rb, line 82
      -def approval_status
      -  if is_approved?
      -    return :approved
      -  elsif has_comments?
      -    if has_pending_comments?
      -      return :comments_pending
      -    else
      -      return :commented
      -    end
      -  end
      -    return :none
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - approvals() - click to toggle source -
      - - -
      - -

      Returns all approving comments

      - - - -
      -
      -# File app/models/glsa.rb, line 62
      -def approvals
      -  comments.where(:rating => 'approval')
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - has_comments?() - click to toggle source -
      - - -
      - -

      Returns true if it has comments

      - - - -
      -
      -# File app/models/glsa.rb, line 77
      -def has_comments?
      -  comments.count > 0
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - has_pending_comments?() - click to toggle source -
      - - -
      - -

      Returns true if there are any pending comments left

      - - - -
      -
      -# File app/models/glsa.rb, line 121
      -def has_pending_comments?
      -  comments.where(:read => false).all.count > 0
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - invalidate_last_revision_cache() - click to toggle source -
      - - -
      - -

      Invalidates the last revision cache

      - - - -
      -
      -# File app/models/glsa.rb, line 39
      -def invalidate_last_revision_cache
      -  @last_revision = nil
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - is_approved?() - click to toggle source -
      - - -
      - -

      Returns true if the draft is ready for sending

      - - - -
      -
      -# File app/models/glsa.rb, line 72
      -def is_approved?
      -  (approvals.count - rejections.count) >= 2
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - is_owner?(user) - click to toggle source -
      - - -
      - -

      Returns true if user is the owner of this GLSA.

      - - - -
      -
      -# File app/models/glsa.rb, line 96
      -def is_owner?(user)
      -  return false if user.nil?
      -  luser = (status == "request" ? requester : submitter)
      -  luser == user
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - last_release_revision() - click to toggle source -
      - - -
      - -

      Returns the last revision object that was a release

      - - - -
      -
      -# File app/models/glsa.rb, line 34
      -def last_release_revision
      -  self.revisions.where(:is_release => true).order('release_revision DESC').first
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - last_revision() - click to toggle source -
      - - -
      - -

      Returns the last revision object, referring to the current state of things

      - - - -
      -
      -# File app/models/glsa.rb, line 29
      -def last_revision
      -  @last_revision ||= self.revisions.order("revid DESC").first
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - next_releaseid() - click to toggle source -
      - - -
      - -

      Returns the next release revision ID to be given for this GLSA

      - - - -
      -
      -# File app/models/glsa.rb, line 53
      -def next_releaseid
      -  if (rev = last_release_revision)
      -    rev.release_revision + 1
      -  else
      -    1
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - next_revid() - click to toggle source -
      - - -
      - -

      Returns the next revision ID to be given for this GLSA

      - - - -
      -
      -# File app/models/glsa.rb, line 44
      -def next_revid
      -  if (rev = last_revision)
      -    rev.revid + 1
      -  else
      -    0
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - rejections() - click to toggle source -
      - - -
      - -

      Returns all rejecting comments

      - - - -
      -
      -# File app/models/glsa.rb, line 67
      -def rejections
      -  comments.where(:rating => 'rejection')
      -end
      -
      - -
      - - - - -
      - - - - - -
      - - - -
      - release() - click to toggle source -
      - - -
      - -

      Performs the steps to release the GLSA, performing santiy checks.

      - - - -
      -
      -# File app/models/glsa.rb, line 146
      -def release
      -  raise GLSAReleaseError, 'Cannot release the GLSA as it is not approved' if not is_approved?
      -  raise GLSAReleaseError, 'Cannot release the GLSA as there are comments pending' if has_pending_comments?
      -  # TODO: releasing someone else's draft
      -  release!
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - release!() - click to toggle source -
      - - -
      - -

      Performs the steps to release the GLSA, performing not as many checks. The -release method is to be preferred.

      - - - -
      -
      -# File app/models/glsa.rb, line 154
      -def release!
      -  # This one is not avoidable. Some information is only filled in during the first edit, thus making it required.
      -  raise GLSAReleaseError, 'Cannot release the GLSA as it is not in "draft" or "release" status' if not (self.status == 'draft' or self.status == 'release')
      -
      -  rev = last_revision.deep_copy
      -  rev.is_release = true
      -  rev.release_revision = next_releaseid
      -  rev.save!
      -
      -  unless self.status == 'release'
      -    self.glsa_id = Glsa.next_id
      -    self.first_released_at = Time.now
      -  end
      -
      -  self.status = 'release'
      -  save!
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - workflow_status(user) - click to toggle source -
      - - -
      - -

      Returns the workflow status of this GLSA for a given user. Return values: -:own (own draft), :approved (approval given), :commented (comment or -rejection given)

      - - - -
      -
      -# File app/models/glsa.rb, line 104
      -def workflow_status(user)
      -  if is_owner?(user)
      -    return :own
      -  end
      -
      -  if comments.where(:rating => 'approval', :user_id => user.id).all.count > 1
      -    return :approved
      -  end
      -
      -  if comments.where(:user_id => user.id).all.count > 1
      -    return :commented
      -  end
      -
      -  return :todo
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/GlsaController.html b/doc/app/GlsaController.html deleted file mode 100644 index c20d239..0000000 --- a/doc/app/GlsaController.html +++ /dev/null @@ -1,1231 +0,0 @@ - - - - - - - Class: GlsaController - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      GlsaController

      - -
      - -

      GLSA controller

      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - archive() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/glsa_controller.rb, line 26
      -def archive
      -  @pageID = "archive"
      -  @pageTitle = "GLSA archive"    
      -
      -  respond_to do |format|
      -    format.html {
      -      @month = (params[:month] || Date.today.month).to_i
      -      @year = (params[:year] || Date.today.year).to_i
      -
      -      month_start = Date.new(@year, @month, 1)
      -      month_end = Date.new(@year, @month + 1, 1) - 1
      -
      -      @glsas = Glsa.where(:status => 'release', :first_released_at => month_start..month_end).order('updated_at DESC')
      -    }
      -    format.js {
      -      @month = params[:view]['month(2i)'].to_i
      -      @year = params[:view]['month(1i)'].to_i
      -
      -      month_start = Date.new(@year, @month, 1)
      -      month_end = Date.new(@year, @month + 1, 1) - 1
      -
      -      @glsas = Glsa.where(:status => 'release', :first_released_at => month_start..month_end).order('updated_at DESC')
      -      @table = render_to_string :partial => "glsa_row", :collection => @glsas, :as => :glsa, :locals => { :view => :drafts }
      -    }
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - comment() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/glsa_controller.rb, line 368
      -def comment
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - create() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/glsa_controller.rb, line 70
      -def create
      -  if params[:what] == "request"
      -    begin
      -      glsa = Glsa.new_request(params[:title], params[:bugs], params[:comment], params[:access], (params[:import_references].to_i == 1), current_user)
      -      
      -      Glsamaker::Mail.request_notification(glsa, current_user)
      -      
      -      flash[:notice] = "Successfully created GLSA #{glsa.glsa_id}"
      -      redirect_to :action => "requests"
      -    rescue Exception => e
      -      log_error e
      -      flash.now[:error] = e.message
      -      render :action => "new-request"
      -    end
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - destroy() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/glsa_controller.rb, line 365
      -def destroy
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - diff() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/glsa_controller.rb, line 332
      -def diff
      -  @glsa = Glsa.find(params[:id])
      -  return unless check_object_access!(@glsa)
      -  
      -  rev_old = @glsa.revisions.find_by_revid(params[:old])
      -  rev_new = @glsa.revisions.find_by_revid(params[:new])
      -  
      -  @diff = with_format(:xml) { rev_diff(@glsa, rev_old, rev_new) }
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - download() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/glsa_controller.rb, line 105
      -def download
      -  @glsa = Glsa.find(params[:id])
      -  return unless check_object_access!(@glsa)
      -  @rev = params[:rev_id].nil? ? @glsa.last_revision : @glsa.revisions.find_by_revid(params[:rev_id])
      -
      -  if @rev == nil
      -    flash[:error] = "Invalid revision ID"
      -    redirect_to :action => "show"
      -    return
      -  end
      -
      -  text = nil
      -  respond_to do |wants|
      -    wants.xml { text = render_to_string(:action => :show, :format => 'xml')}
      -    wants.txt { text = render_to_string(:action => :show, :format => 'txt')}
      -    wants.html { render :text => "Cannot download HTML format. Pick .xml or .txt"; return }
      -  end
      -  
      -  send_data(text, :filename => "glsa-#{@glsa.glsa_id}.#{params[:format]}")
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - drafts() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/glsa_controller.rb, line 20
      -def drafts
      -  @pageID = "drafts"
      -  @pageTitle = "Pooled GLSA drafts"
      -  @glsas = Glsa.where(:status => 'draft').order('updated_at DESC')
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - edit() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/glsa_controller.rb, line 126
      -def edit
      -  @glsa = Glsa.find(params[:id])
      -  return unless check_object_access!(@glsa)
      -  @rev = @glsa.last_revision
      -  
      -  # Packages
      -  @rev.vulnerable_packages.build(:comp => "<", :arch => "*") if @rev.vulnerable_packages.length == 0
      -  @rev.unaffected_packages.build(:comp => ">=", :arch => "*") if @rev.unaffected_packages.length == 0
      -  
      -  # References
      -  @rev.references.build if @rev.references.length == 0
      -
      -  @templates = {}
      -  GLSAMAKER_TEMPLATE_TARGETS.each do |target|
      -    @templates[target] = Template.where(:target => target).all
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - import_references() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/glsa_controller.rb, line 371
      -def import_references
      -  begin
      -    if params[:go].to_s == '1'
      -      glsa = Glsa.find(Integer(params[:id]))
      -      return unless check_object_access!(glsa)
      -      refs = []
      -      
      -      params[:import][:cve].each do |cve_id|
      -        cve = Cve.find_by_cve_id cve_id
      -        refs << {:title => cve.cve_id, :url => cve.url}
      -      end
      -      
      -      glsa.add_references refs
      -      
      -      flash[:notice] = "Imported #{refs.count} references."
      -      redirect_to :action => "show", :id => glsa.id
      -      return
      -    else
      -      @glsa = Glsa.find(Integer(params[:id]))
      -      return unless check_object_access!(@glsa)
      -      @cves = @glsa.related_cves
      -    end      
      -  rescue Exception => e
      -    render :text => "Error: #{e.message}", :status => 500
      -    log_error e
      -    return
      -  end
      -  
      -  render :layout => false
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - new() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/glsa_controller.rb, line 53
      -def new
      -  @pageID = "new"
      -  @pageTitle = "New GLSA"
      -  
      -  # TODO: Straight-to-draft editing
      -  render :action => "new-request"
      -  return
      -  
      -  if params[:what] == "request"
      -    render :action => "new-request"
      -  elsif params[:what] == "draft"
      -    render :action => "new-draft"
      -  else
      -    render
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - prepare_release() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/glsa_controller.rb, line 253
      -def prepare_release
      -  @glsa = Glsa.find(params[:id])
      -  return unless check_object_access!(@glsa)
      -
      -  if current_user.access < 2
      -    deny_access "Tried to prepare release"
      -    return
      -  end
      -
      -  if @glsa.status == 'request'
      -    flash[:error] = 'You cannot release a request. Draft the advisory first.'
      -    redirect_to :action => "show", :id => @glsa
      -    return
      -  end
      -
      -  if @glsa.restricted
      -    flash[:error] = 'You cannot release a confidential draft. Make it public first.'
      -    redirect_to :action => "show", :id => @glsa
      -    return
      -  end
      -
      -  @rev = @glsa.last_revision
      -
      -  @comments_override = (current_user.is_el_jefe? and params[:override_approvals].to_i == 1) || false
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - release() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/glsa_controller.rb, line 279
      -def release
      -  @glsa = Glsa.find(params[:id])
      -  return unless check_object_access!(@glsa)
      -
      -  if current_user.access < 2
      -    deny_access "Tried to prepare release"
      -    return
      -  end
      -
      -  if @glsa.status == 'request'
      -    flash[:error] = 'You cannot release a request. Draft the advisory first.'
      -    redirect_to :action => "show", :id => @glsa
      -    return
      -  end
      -
      -  if @glsa.restricted
      -    flash[:error] = 'You cannot release a confidential draft. Make it public first.'
      -    redirect_to :action => "show", :id => @glsa
      -    return
      -  end
      -
      -  @rev = @glsa.last_revision
      -  begin
      -    if current_user.is_el_jefe?
      -      @glsa.release!
      -    else
      -      @glsa.release
      -    end
      -    
      -    @glsa.invalidate_last_revision_cache
      -
      -    if params[:email] == '1'
      -      of = @template_format
      -      @template_format = 'txt'
      -      Glsamaker::Mail.send_text(
      -          render_to_string({:template => 'glsa/show.txt.erb', :format => :txt, :layout => false}),
      -          "[ GLSA #{@glsa.glsa_id} ] #{@rev.title}",
      -          current_user,
      -          false
      -      )
      -      @template_format = of
      -    end
      -  rescue GLSAReleaseError => e
      -    flash[:error] = "Internal error: #{e.message}. Cannot release advisory."
      -    redirect_to :action => "show", :id => @glsa
      -    return
      -  end
      -
      -  # ugly hack, but necessary to switch back to html
      -  @real_format = 'html'
      -  render(:format => :html, :layout => 'application')
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - requests() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/glsa_controller.rb, line 14
      -def requests
      -  @pageID = "requests"
      -  @pageTitle = "Pooled GLSA requests"
      -  @glsas = Glsa.where(:status => 'request').order('updated_at DESC')
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - show() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/glsa_controller.rb, line 87
      -def show
      -  @glsa = Glsa.find(params[:id])
      -  return unless check_object_access!(@glsa)
      -  @rev = params[:rev_id].nil? ? @glsa.last_revision : @glsa.revisions.find_by_revid(params[:rev_id])
      -
      -  if @rev == nil
      -    flash[:error] = "Invalid revision ID"
      -    redirect_to :action => "show"
      -    return
      -  end
      -
      -  respond_to do |wants|
      -    wants.html { render }
      -    wants.xml { }
      -    wants.txt { render }
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - update() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/glsa_controller.rb, line 144
      -def update
      -  @glsa = Glsa.find(params[:id])
      -  return unless check_object_access!(@glsa)
      -  @prev_latest_rev = @glsa.last_revision
      -
      -  if @glsa.nil?
      -    flash[:error] = "Unknown GLSA ID"
      -    redirect_to :action => "index"
      -    return
      -  end
      -
      -  # GLSA object
      -  # The first editor is submitter
      -  # TODO: Maybe take a better condition (adding bugs would make so. the submitter)
      -  if @glsa.submitter.nil?
      -    @glsa.submitter = current_user
      -  end
      -
      -  @glsa.status = "draft" if @glsa.status == "request"
      -
      -  @glsa.restricted = (params[:glsa][:restricted] == "confidential")
      -
      -  # Force update
      -  @glsa.updated_at = 0
      -
      -  revision = Revision.new
      -  revision.revid = @glsa.next_revid
      -  revision.glsa = @glsa
      -  revision.user = current_user
      -  revision.title = params[:glsa][:title]
      -  revision.synopsis = params[:glsa][:synopsis]
      -  revision.access = params[:glsa][:access]
      -  revision.severity = params[:glsa][:severity]
      -  revision.product = params[:glsa][:product]
      -  revision.description = params[:glsa][:description]
      -  revision.background = params[:glsa][:background]
      -  revision.impact = params[:glsa][:impact]
      -  revision.workaround = params[:glsa][:workaround]
      -  revision.resolution = params[:glsa][:resolution]
      -
      -  unless revision.save
      -    flash.now[:error] = "Errors occurred while saving the Revision object: #{revision.errors.full_messages.join ', '}"
      -    render :action => "edit"
      -    return
      -  end
      -
      -  unless @glsa.save
      -    flash[:error] = "Errors occurred while saving the GLSA object"
      -    render :action => "edit"
      -  end
      -
      -  # Bugs
      -  bugzilla_warning = false
      -
      -  if params[:glsa][:bugs]
      -    bugs = params[:glsa][:bugs].map {|bug| bug.to_i }
      -
      -    bugs.each do |bug|
      -      begin
      -        b = Glsamaker::Bugs::Bug.load_from_id(bug)
      -
      -        revision.bugs.create(
      -          :bug_id => bug,
      -          :title => b.summary,
      -          :whiteboard => b.status_whiteboard,
      -          :arches => b.arch_cc.join(', ')
      -        )
      -      rescue Exception => e
      -        log_error e
      -        logger.info { e.inspect }
      -        # In case of bugzilla errors, just keep the bug #
      -        revision.bugs.create(
      -          :bug_id => bug
      -        )
      -        bugzilla_warning = true
      -      end
      -    end
      -  end
      -
      -  logger.debug params[:glsa][:package].inspect
      -
      -  # Packages
      -  params[:glsa][:package].each do |package|
      -    logger.debug package.inspect
      -    next if package[:atom].strip == ''
      -    revision.packages.create(package)
      -  end
      -
      -  # References
      -  params[:glsa][:reference].each do |reference|
      -    logger.debug reference.inspect
      -    next if reference[:title].strip == ''
      -    revision.references.create(reference)
      -  end
      -
      -  # Comments
      -  @glsa.comments.each do |comment|
      -    comment.read = params["commentread-#{comment.id}"] == "true"
      -    comment.save
      -  end
      -
      -  # Sending emails
      -  Glsamaker::Mail.edit_notification(@glsa, rev_diff(@glsa, @glsa.revisions[-2], revision), current_user)
      -
      -  flash[:notice] = "Saving was successful. #{'NOTE: Bugzilla integration is not available, only plain bug numbers.' if bugzilla_warning}"
      -  redirect_to :action => 'show', :id => @glsa
      -  
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - update_cache() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/glsa_controller.rb, line 342
      -def update_cache
      -  @glsa = Glsa.find(params[:id])
      -  return unless check_object_access!(@glsa)
      -  @rev = @glsa.last_revision
      -  
      -  @rev.update_cached_bug_metadata
      -  
      -  flash[:notice] = "Successfully updated all caches."
      -  if params[:redirect]
      -    redirect_to params[:redirect]
      -  else
      -    redirect_to :action => 'show', :id => @glsa unless params[:no_redirect]
      -  end
      -rescue Exception => e
      -  log_error e
      -  flash[:notice] = "Could not update caches: #{e.message}"
      -  if params[:redirect]
      -    redirect_to params[:redirect]
      -  else
      -    redirect_to :action => 'show', :id => @glsa unless params[:no_redirect]
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - -
      -

      Protected Instance Methods

      - - -
      - - - -
      - rev_diff(glsa, rev_old, rev_new, format = :unified, context_lines = 3) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/glsa_controller.rb, line 403
      -def rev_diff(glsa, rev_old, rev_new, format = :unified, context_lines = 3)
      -  @glsa = glsa
      -  @rev = rev_old
      -  old_text = Glsamaker::XML.indent(
      -    render_to_string(
      -      :template => 'glsa/_glsa.xml.builder',
      -      :locals => {:glsa => @glsa, :rev => @rev},
      -      :layout => 'none'
      -    ),
      -    {:indent => 2, :maxcols => 80}
      -  )    
      -  
      -  @rev = rev_new
      -  new_text = Glsamaker::XML.indent(
      -    render_to_string(
      -      :template => 'glsa/_glsa.xml.builder',
      -      :locals => {:glsa => @glsa, :rev => @rev},
      -      :layout => 'none'
      -    ),
      -    {:indent => 2, :maxcols => 80}
      -  )
      -
      -  Glsamaker::Diff.diff(old_text, new_text, format, context_lines)
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/GlsaHelper.html b/doc/app/GlsaHelper.html deleted file mode 100644 index 1397dd3..0000000 --- a/doc/app/GlsaHelper.html +++ /dev/null @@ -1,876 +0,0 @@ - - - - - - - Module: GlsaHelper - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - - - - -
      - -
      -

      GlsaHelper

      - -
      - -

      GLSA Helper

      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - - - - - - - - - - -
      - - - -
      - adv_wrap(text, shorten_args = false) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/helpers/glsa_helper.rb, line 120
      -def adv_wrap(text, shorten_args = false)
      -  text.gsub!(/\r?\n/, "\n")
      -  
      -  text.gsub!(/<\/?(b|i)>/, '')
      -
      -  text.gsub!(/(?:<ul>\s*(.*?)<\/ul>(?:\s*\n)?)/) do |s|
      -    $1.gsub(/<li>(.*?)<\/li>\s*/) do |t|
      -      ('* ' + word_wrap($1, 69)).gsub("\n", "\n  ") + "\n\n"
      -    end
      -  end
      -  
      -  text.gsub!(/(?:<ol>\s*(.*?)<\/ol>(?:\s*\n)?)/) do |s|
      -    nom = 0
      -    $1.gsub(/<li>(.*?)<\/li>\s*/) do |t|
      -      ("#{nom += 1}. " + word_wrap($1, 68)).gsub("\n", "\n   ") + "\n\n"
      -    end
      -  end
      -
      -  text.gsub!(/(?:<code>\s*(.*?)<\/code>(?:\s*\n)?)/) do |s|      
      -    ('  ' + word_wrap(shorten_args ? shorten_args($1) : $1, 69)).gsub("\n", "\n  ") + "\n\n"
      -  end
      -  
      -  word_wrap(text.chomp, 71)
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - approval_icon(status) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/helpers/glsa_helper.rb, line 63
      -def approval_icon(status)
      -  if status == :approved
      -    image_tag "icons/status-green.png", :title => "This item is approved for sending."
      -  elsif status == :commented
      -    image_tag "icons/status-red.png", :title => "This item has received comments."
      -  elsif status == :comments_pending
      -    image_tag "icons/status-yellow.png", :title => "This item has received comments."
      -  else
      -    image_tag "icons/status-grey.png", :title => "This item has no comments."
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - bugready_icon(status) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/helpers/glsa_helper.rb, line 55
      -def bugready_icon(status)
      -  if status
      -    image_tag "icons/bug.png", :title => "This item is bug ready."
      -  else
      -    image_tag "icons/bug-grey.png", :title => "This item is NOT bug ready."
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - check_icon(status) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/helpers/glsa_helper.rb, line 95
      -def check_icon(status)
      -  if status
      -    image_tag "icons/ok.png", :title => "All checks passed"
      -  else
      -    image_tag "icons/error.png", :title => "Error. Cannot continue."
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - glsa_content(g, field) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/helpers/glsa_helper.rb, line 15
      -def glsa_content(g, field)
      -  (params[:glsa][field.to_sym] if params[:glsa]) || g[field]
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - is_approval_icon(status) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/helpers/glsa_helper.rb, line 103
      -def is_approval_icon(status)
      -  if status
      -    image_tag 'icons/approved.png', :title => 'This item is an approval'
      -  else
      -    image_tag 'icons/not-approved.png', :title => 'This item is a rejection'
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - lastrev_content(g, field) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/helpers/glsa_helper.rb, line 19
      -def lastrev_content(g, field)
      -  (params[:glsa][field.to_sym] if params[:glsa]) || g.last_revision[field]
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - prefixed_item(prefix, text) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/helpers/glsa_helper.rb, line 111
      -def prefixed_item(prefix, text)
      -  tf = Text::Format.new()
      -  tf.first_indent = tf.body_indent = prefix.length + 1
      -  
      -  str = tf.format(text)
      -  str[0, prefix.length] = prefix  
      -  str.chomp
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - restricted_icon(status) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/helpers/glsa_helper.rb, line 87
      -def restricted_icon(status)
      -  if status
      -    image_tag "icons/confidential.png", :title => "This item is CONFIDENTIAL."
      -  else
      -    image_tag "icons/public.png", :title => "This item is public."
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - status_icon(status) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/helpers/glsa_helper.rb, line 43
      -def status_icon(status)
      -  if status == "request"
      -    image_tag "icons/request.png", :title => "This item is a request."
      -  elsif status == "draft"
      -    image_tag "icons/draft.png", :title => "This item is a draft."
      -  elsif status == "release"
      -    image_tag "icons/sent.png", :title => "This item is a sent GLSA."
      -  else
      -    "?"
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - template_popups() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/helpers/glsa_helper.rb, line 145
      -def template_popups
      -  render :partial => 'template_popups', :locals => {:templates => @templates}
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - workflow_icon(status) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/helpers/glsa_helper.rb, line 75
      -def workflow_icon(status)
      -  if status == :commented
      -    image_tag "icons/commented.png", :title => "You have commented on this item."
      -  elsif status == :approved
      -    image_tag "icons/approved.png", :title => "You have approved this item."
      -  elsif status == :own
      -    image_tag "icons/user.png", :title => "This is your own draft."
      -  elsif status == :todo
      -    image_tag "icons/not-approved.png", :title => "Please comment and/or approve."
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/GlsaMailer.html b/doc/app/GlsaMailer.html deleted file mode 100644 index 8f1030a..0000000 --- a/doc/app/GlsaMailer.html +++ /dev/null @@ -1,440 +0,0 @@ - - - - - - - Class: GlsaMailer - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      GlsaMailer

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - approval(recipient, glsa) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/mailers/glsa_mailer.rb, line 31
      -def approval(recipient, glsa)
      -  @glsa = glsa
      -
      -  mail(:to => recipient.email,
      -       :subject => "[GLSAMaker] Draft approved: #{glsa.last_revision.title}")
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - comment(recipient, glsa, comment, commentator) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/mailers/glsa_mailer.rb, line 22
      -def comment(recipient, glsa, comment, commentator)
      -  @commentator = commentator
      -  @comment = comment
      -  @glsa = glsa
      -
      -  mail(:to => recipient.email,
      -       :subject => "[GLSAMaker] Draft commented: #{glsa.last_revision.title}")
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - edit(recipient, glsa, diff, editor) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/mailers/glsa_mailer.rb, line 13
      -def edit(recipient, glsa, diff, editor)
      -  @editor = editor
      -  @diff = diff
      -  @glsa = glsa
      -
      -  mail(:to => recipient.email,
      -       :subject => "[GLSAMaker] Draft edit: #{glsa.last_revision.title}")
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - new_request(recipient, glsa, requestor) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/mailers/glsa_mailer.rb, line 5
      -def new_request(recipient, glsa, requestor)
      -  @requestor = requestor
      -  @glsa = glsa
      -
      -  mail(:to => recipient.email,
      -       :subject => "[GLSAMaker] New request: #{glsa.last_revision.title}")
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Glsamaker.html b/doc/app/Glsamaker.html deleted file mode 100644 index 55bd87f..0000000 --- a/doc/app/Glsamaker.html +++ /dev/null @@ -1,388 +0,0 @@ - - - - - - - Module: Glsamaker - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - - - -
      - - - - - - -
      -

      Namespace

      - -
      - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      Glsamaker

      - -
      - -

      GLSAMaker v2

      - -
      Copyright (C) 2010 Alex Legler <a3li@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      -
      - -

      GLSAMaker v2

      - -
      Copyright (C) 2010 Alex Legler <a3li@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      -
      - -

      GLSAMaker library

      -
      - -

      GLSAMaker v2

      - -
      Copyright (C) 2010-11 Alex Legler <a3li@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - help() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File lib/glsamaker/helpers.rb, line 13
      -def help
      -  Helper.instance
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Glsamaker/Bugs.html b/doc/app/Glsamaker/Bugs.html deleted file mode 100644 index 08b4f0b..0000000 --- a/doc/app/Glsamaker/Bugs.html +++ /dev/null @@ -1,279 +0,0 @@ - - - - - - - Module: Glsamaker::Bugs - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      -
      - -
      -
      - - -
      - -
      - - - - - - - - - - - - -
      - - -
      - -
      -

      Glsamaker::Bugs

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Glsamaker/Bugs/ArchesMixin.html b/doc/app/Glsamaker/Bugs/ArchesMixin.html deleted file mode 100644 index d1bc6e8..0000000 --- a/doc/app/Glsamaker/Bugs/ArchesMixin.html +++ /dev/null @@ -1,310 +0,0 @@ - - - - - - - Module: Glsamaker::Bugs::ArchesMixin - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      -
      - -
      -
      - - -
      - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      Glsamaker::Bugs::ArchesMixin

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - arch_cc() - click to toggle source -
      - - -
      - -

      Returns an array of all arch teams in CC

      - - - -
      -
      -# File lib/glsamaker/bugs.rb, line 35
      -def arch_cc
      -  @arch_cc ||= _arch_cc
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Glsamaker/Bugs/Bug.html b/doc/app/Glsamaker/Bugs/Bug.html deleted file mode 100644 index 810cd26..0000000 --- a/doc/app/Glsamaker/Bugs/Bug.html +++ /dev/null @@ -1,376 +0,0 @@ - - - - - - - Class: Glsamaker::Bugs::Bug - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      -
      - -
      -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - - - - -
      - - -
      - -
      -

      Glsamaker::Bugs::Bug

      - -
      - -

      Extends Bugzilla::Bug with the Status and Arches functionality

      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - cc() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File lib/glsamaker/bugs.rb, line 82
      -def cc
      -  @cc
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - whiteboard() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File lib/glsamaker/bugs.rb, line 78
      -def whiteboard
      -  @status_whiteboard
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Glsamaker/Bugs/BugReadyMixin.html b/doc/app/Glsamaker/Bugs/BugReadyMixin.html deleted file mode 100644 index b34c627..0000000 --- a/doc/app/Glsamaker/Bugs/BugReadyMixin.html +++ /dev/null @@ -1,317 +0,0 @@ - - - - - - - Module: Glsamaker::Bugs::BugReadyMixin - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      -
      - -
      -
      - - -
      - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      Glsamaker::Bugs::BugReadyMixin

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - bug_ready?() - click to toggle source -
      - - -
      - -

      Indicates whether this bug has been handled and is in the correct state for -sending a GLSA assigned to it.

      - - - -
      -
      -# File lib/glsamaker/bugs.rb, line 65
      -def bug_ready?
      -  secbug_status.each do |s|
      -    return false unless s.status == :glsa and not s.pending?
      -  end
      -
      -  return arch_cc == []
      -rescue Exception => e
      -  return false
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Glsamaker/Bugs/Status.html b/doc/app/Glsamaker/Bugs/Status.html deleted file mode 100644 index 6d819fe..0000000 --- a/doc/app/Glsamaker/Bugs/Status.html +++ /dev/null @@ -1,580 +0,0 @@ - - - - - - - Class: Glsamaker::Bugs::Status - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      -
      - -
      -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - - -
      -

      Included Modules

      - -
      - -
      - - -
      - -
      -

      Glsamaker::Bugs::Status

      - -
      - -

      This baby is a bug status, one of the things you see in squared brackets in -whiteboards.

      - -
      - - - - -
      - - - - - - - - -
      -

      Attributes

      - - -
      - - -
      - status[R] -
      - -
      - - - -
      -
      - -
      - - - - -
      -

      Public Class Methods

      - - -
      - - - -
      - new(str) - click to toggle source -
      - - -
      - -

      Creates a new Status object by parsing -str as a single status string

      - - - -
      -
      -# File lib/glsamaker/bugs.rb, line 98
      -def initialize(str)
      -  if str == '?'
      -    @status = '?'.to_sym
      -    @blocked = @overdue = @pending = false
      -    return
      -  end
      -  
      -  cmp = str.strip.split(/\s+/)
      -  
      -  if cmp.length == 2
      -    @blocked = (cmp[1] == "blocked")
      -  end
      -  
      -  if cmp[0] =~ /^(upstream|ebuild|stable|glsa|noglsa)(\+|\?|\+\?|\?\+)?$/
      -    @overdue = ($2 != nil and $2.include? "+")
      -    @pending = ($2 != nil and $2.include? "?")
      -    
      -    @status = $1.downcase.to_sym
      -  else
      -    raise ArgumentError, "Malformed Status string: #{str}"
      -  end   
      -end
      -
      - -
      - - - - -
      - - -
      - -
      -

      Public Instance Methods

      - - -
      - - - -
      - <=>(other) - click to toggle source -
      - - -
      - -

      Comparison

      - - - -
      -
      -# File lib/glsamaker/bugs.rb, line 142
      -def <=>(other)
      -  raise(ArgumentError, "Cannot compare to #{other.class}") unless other.is_a? Status
      -  
      -  s = ['?'.to_sym, :upstream, :ebuild, :stable, :glsa, :noglsa]
      -  
      -  if other.status == @status
      -    if other.pending? == @pending and other.overdue? == @overdue
      -      0
      -    else
      -      if other.overdue? and not @overdue
      -        -1
      -      elsif @overdue and not other.overdue?
      -        1
      -      else
      -        if @pending and not other.pending?
      -          -1
      -        else
      -          1
      -        end
      -      end
      -    end
      -  else
      -    (s.index(@status) - s.index(other.status)) < 0 ? -1 : 1
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - blocked?() - click to toggle source -
      - - -
      - -

      Returns true if the bug is blocked by another (c.f. -+‘blocked’+ in whiteboards)

      - - - -
      -
      -# File lib/glsamaker/bugs.rb, line 122
      -def blocked?
      -  @blocked
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - overdue?() - click to toggle source -
      - - -
      - -

      Returns true if the bug is overdue (cf. +‘+’+ in whiteboards)

      - - - -
      -
      -# File lib/glsamaker/bugs.rb, line 127
      -def overdue?
      -  @overdue
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - pending?() - click to toggle source -
      - - -
      - -

      Returns true if the bug is pending action (cf. +‘?’+ in -whiteboards)

      - - - -
      -
      -# File lib/glsamaker/bugs.rb, line 132
      -def pending?
      -  @pending
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - to_s() - click to toggle source -
      - - -
      - -

      Returns a string representation (like you would find it in the whiteboard)

      - - - -
      -
      -# File lib/glsamaker/bugs.rb, line 137
      -def to_s
      -  @status.to_s + (@overdue ? "+" : "") + (@pending ? "?" : "") + (@blocked ? " blocked" : "")
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Glsamaker/Bugs/StatusMixin.html b/doc/app/Glsamaker/Bugs/StatusMixin.html deleted file mode 100644 index fabab8c..0000000 --- a/doc/app/Glsamaker/Bugs/StatusMixin.html +++ /dev/null @@ -1,320 +0,0 @@ - - - - - - - Module: Glsamaker::Bugs::StatusMixin - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      -
      - -
      -
      - - -
      - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      Glsamaker::Bugs::StatusMixin

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - secbug_status() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File lib/glsamaker/bugs.rb, line 18
      -def secbug_status
      -  if whiteboard =~ /([A-C~?][0-4?]\??)\s+\[(.*?)\]\s*?(.*?)$/
      -    st = []
      -    
      -    $2.split("/").each do |status|
      -      st << Status.new(status)
      -    end
      -    
      -    return st
      -  else
      -    [Status.new('?')]
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Glsamaker/Diff.html b/doc/app/Glsamaker/Diff.html deleted file mode 100644 index 1e3fd06..0000000 --- a/doc/app/Glsamaker/Diff.html +++ /dev/null @@ -1,338 +0,0 @@ - - - - - - - Module: Glsamaker::Diff - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      -
      - -
      -
      - - -
      - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      Glsamaker::Diff

      - -
      - -

      Module providing diff support

      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - diff(str_old, str_new, format = :unified, context_lines = 3) - click to toggle source -
      - - -
      - -

      Returns a unified diff for two strings Adapted from the O’Reilly Ruby -Cookbook

      - - - -
      -
      -# File lib/glsamaker/diff.rb, line 23
      -def diff(str_old, str_new, format = :unified, context_lines = 3)
      -  str_old = str_old.split(/\r?\n/).map! { |l| l.chomp }
      -  str_new = str_new.split(/\r?\n/).map! { |l| l.chomp }
      -
      -  output = ""
      -  diffs = ::Diff::LCS.diff(str_old, str_new)
      -  return output if diffs.empty?
      -
      -  oldhunk = hunk = nil
      -  file_length_difference = 0
      -  diffs.each do |piece|
      -    begin
      -      hunk = ::Diff::LCS::Hunk.new(str_old, str_new, piece, context_lines, file_length_difference)
      -      next unless oldhunk
      -
      -      if (context_lines > 0) and hunk.overlaps?(oldhunk)
      -        hunk.unshift(oldhunk)
      -      else
      -        output << oldhunk.diff(format)
      -      end
      -    ensure
      -      oldhunk = hunk
      -      output << "\n"
      -    end
      -  end
      -
      -  output << oldhunk.diff(format) << "\n"
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Glsamaker/HTTP.html b/doc/app/Glsamaker/HTTP.html deleted file mode 100644 index 6600379..0000000 --- a/doc/app/Glsamaker/HTTP.html +++ /dev/null @@ -1,323 +0,0 @@ - - - - - - - Module: Glsamaker::HTTP - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      -
      - -
      -
      - - -
      - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      Glsamaker::HTTP

      - -
      - -

      GLSAMaker HTTP utilities

      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Class Methods

      - - -
      - - - -
      - get(url) - click to toggle source -
      - - -
      - -

      Tries to fetch url via HTTP GET, sending a -GLSAMaker custom User-Agent header. The body part is returned.

      - - - -
      -
      -# File lib/glsamaker/http.rb, line 21
      -def get(url)
      -  uri = URI.parse(url)
      -  
      -  http = Net::HTTP.new(uri.host, uri.port)
      -  http.use_ssl = true if uri.scheme == "https"
      -  res = http.start {
      -    http.request_get(uri.request_uri, {'User-Agent' => "GLSAMaker/#{GLSAMAKER_VERSION} (http://security.gentoo.org/)"})
      -  }
      -        
      -  # Raises an exception if HTTP status suggests something went wrong
      -  res.value
      -  res.body
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Glsamaker/Helper.html b/doc/app/Glsamaker/Helper.html deleted file mode 100644 index 96d0c97..0000000 --- a/doc/app/Glsamaker/Helper.html +++ /dev/null @@ -1,285 +0,0 @@ - - - - - - - Class: Glsamaker::Helper - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - - - -
      -

      Included Modules

      - -
      - -
      - - -
      - -
      -

      Glsamaker::Helper

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Glsamaker/Mail.html b/doc/app/Glsamaker/Mail.html deleted file mode 100644 index 1bdaf3b..0000000 --- a/doc/app/Glsamaker/Mail.html +++ /dev/null @@ -1,498 +0,0 @@ - - - - - - - Module: Glsamaker::Mail - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      -
      - -
      -
      - - -
      - -
      - - - - - - - - - - - - -
      - - -
      - -
      -

      Glsamaker::Mail

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - approval_notification(glsa) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File lib/glsamaker/mail.rb, line 59
      -def approval_notification(glsa)
      -  if GLSAMAKER_NO_EMAIL
      -    Rails.logger.info "Not sending email."
      -    return false
      -  end
      -
      -  rcpt = glsa.submitter
      -  return unless rcpt.can_access? glsa
      -
      -  unless rcpt.get_pref_category(:mail)[:comment] == false
      -    GlsaMailer.approval(rcpt, glsa).deliver
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - comment_notification(glsa, comment, user) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File lib/glsamaker/mail.rb, line 44
      -def comment_notification(glsa, comment, user)
      -  if GLSAMAKER_NO_EMAIL
      -    Rails.logger.info "Not sending email."
      -    return false
      -  end
      -
      -  rcpt = glsa.submitter
      -  return unless rcpt.can_access? glsa
      -  return if rcpt == user
      -
      -  unless rcpt.get_pref_category(:mail)[:comment] == false
      -    GlsaMailer.comment(rcpt, glsa, comment, user).deliver
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - edit_notification(glsa, diff, user) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File lib/glsamaker/mail.rb, line 14
      -def edit_notification(glsa, diff, user)
      -  if GLSAMAKER_NO_EMAIL
      -    Rails.logger.info "Not sending email."
      -    return false
      -  end
      -  
      -  User.find(:all, :conditions => 'id > 0').each do |rcpt|
      -    next unless rcpt.can_access? glsa
      -    
      -    unless rcpt.get_pref_category(:mail)[:edit] == false
      -      GlsaMailer.edit(rcpt, glsa, diff, user).deliver
      -    end
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - request_notification(glsa, user) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File lib/glsamaker/mail.rb, line 29
      -def request_notification(glsa, user)
      -  if GLSAMAKER_NO_EMAIL
      -    Rails.logger.info "Not sending email."
      -    return false
      -  end
      -  
      -  User.find(:all, :conditions => 'id > 0').each do |rcpt|
      -    next unless rcpt.can_access? glsa        
      -    
      -    unless rcpt.get_pref_category(:mail)[:request] == false
      -      GlsaMailer.new_request(rcpt, glsa, user).deliver
      -    end
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - send_text(text, subject, user, footer = true) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File lib/glsamaker/mail.rb, line 73
      -def send_text(text, subject, user, footer = true)
      -  if GLSAMAKER_NO_EMAIL
      -    Rails.logger.info "Not sending email."
      -    return false
      -  end
      -
      -  GlsaMailer.deliver_text(user, subject, text, footer)
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Glsamaker/Portage.html b/doc/app/Glsamaker/Portage.html deleted file mode 100644 index 1a3f76a..0000000 --- a/doc/app/Glsamaker/Portage.html +++ /dev/null @@ -1,567 +0,0 @@ - - - - - - - Module: Glsamaker::Portage - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - - - - - -
      -

      Namespace

      - -
      - - - - - - - - -
      - - -
      - -
      -

      Glsamaker::Portage

      - -
      - -

      Helper functions for Portage tree interaction

      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - find_packages(re) - click to toggle source -
      - - -
      - -

      Returns package atoms that match re

      - - - -
      -
      -# File lib/glsamaker/portage.rb, line 78
      -def find_packages(re)
      -  results = []
      -  
      -  Dir.chdir(portdir) do
      -    Dir.glob('*-*') do |cat|
      -      Dir.chdir(cat) do
      -        Dir.glob("*") do |pkg|
      -          pkg =~ re and results << "#{cat}/#{pkg}"
      -        end
      -      end
      -    end
      -  end
      -  
      -  results
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - get_description(atom) - click to toggle source -
      - - -
      - -

      Gets a description

      - - - -
      -
      -# File lib/glsamaker/portage.rb, line 69
      -def get_description(atom)
      -  Description.eix(atom) ||
      -  Description.ebuild(atom) ||
      -  Description.pgo(atom) ||
      -  Description.google(atom) ||
      -  "[could not get a description]"
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - get_maintainers(atom) - click to toggle source -
      - - -
      - -

      Returns an array of maintainer email addresses for the package -atom

      - - - -
      -
      -# File lib/glsamaker/portage.rb, line 95
      -def get_maintainers(atom)
      -  raise(ArgumentError, "Invalid package atom") unless Portage.valid_atom?(atom)
      -  raise(ArgumentError, "Cannot find metadata") unless File.exist? File.join(portdir, atom, 'metadata.xml')
      -  
      -  x = Nokogiri::XML(File.read(File.join(portdir, atom, 'metadata.xml')))
      -  
      -  herds = []
      -  maintainers = []
      -  
      -  x.xpath('/pkgmetadata/herd').each {|h| herds << h.content }
      -  x.xpath('/pkgmetadata/maintainer/email').each {|m| maintainers << m.content }
      -  
      -  unless herds.first == "no-herd"
      -    herds_xml = Nokogiri::XML(File.read(File.join(portdir, 'metadata', 'herds.xml')))
      -    herds_email = herds.map {|h| herds_xml.xpath("/herds/herd/name[text()='#{h}']").first.parent.xpath("./email").first.content }
      -    
      -    (maintainers + herds_email).uniq
      -  else
      -    maintainers
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - get_metadata(atom, version = :latest, what = []) - click to toggle source -
      - - -
      - -

      Returns information from the portage metadata cache Values: :depend, -:rdepend, :slot, :src_uri, :restrict, :homepage, :license, :description, -:keywords, :inherited, :iuse, :required_use, :pdepend, :provide, :eapi, -:properties, :defined_phases as per portage/pym/portage/cache/metadata.py -(database.auxdbkey_order)

      - - - -
      -
      -# File lib/glsamaker/portage.rb, line 122
      -def get_metadata(atom, version = :latest, what = [])
      -  raise(ArgumentError, "Invalid package atom") unless Portage.valid_atom?(atom)
      -  raise(ArgumentError, "Invalid version string") if version.to_s.include? '..'
      -  return {} if what == []
      -  
      -  lines = [nil, :depend, :rdepend, :slot, :src_uri, :restrict, :homepage,
      -           :license, :description, :keywords, :inherited, :iuse, :required_use,
      -           :pdepend, :provide, :eapi, :properties, :defined_phases]
      -  cat, pkg = atom.split('/', 2)
      -  result = {}
      -  
      -  Dir.chdir(File.join(Glsamaker::Portage.portdir, 'metadata', 'cache', cat)) do
      -    if version == :latest
      -      f = File.open(Dir.glob("#{pkg}-[0-9]*").last, 'r')
      -    else
      -      f = File.open(File.join("#{pkg}-#{version}"), 'r')
      -    end
      -    
      -    while f.gets
      -      if what.include?(lines[$.])
      -        result[lines[$.]] = $_.chomp
      -      end
      -    end
      -    
      -    f.close
      -  end
      -  result
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - portdir() - click to toggle source -
      - - -
      - -

      Returns the location of the portage dir, or raises an exception if it -cannot be found

      - - - -
      -
      -# File lib/glsamaker/portage.rb, line 55
      -def portdir
      -  unless File.directory? GLSAMAKER_PORTDIR
      -    raise "GLSAMAKER_PORTDIR is not a directory"
      -  end
      -  
      -  GLSAMAKER_PORTDIR
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - valid_atom?(atom) - click to toggle source -
      - - -
      - -

      Validates the atom atom

      - - - -
      -
      -# File lib/glsamaker/portage.rb, line 64
      -def valid_atom?(atom)
      -  atom =~ /[a-zA-Z0-9_-]\/[a-zA-Z0-9_-]/
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Glsamaker/Portage/Description.html b/doc/app/Glsamaker/Portage/Description.html deleted file mode 100644 index 50ec53a..0000000 --- a/doc/app/Glsamaker/Portage/Description.html +++ /dev/null @@ -1,436 +0,0 @@ - - - - - - - Class: Glsamaker::Portage::Description - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      Glsamaker::Portage::Description

      - -
      - -

      Package description helper

      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Class Methods

      - - -
      - - - -
      - ebuild(atom) - click to toggle source -
      - - -
      - -

      Tries to fetch the description for the package atom from an -ebuild’s entry (works if running on Gentoo)

      - - - -
      -
      -# File lib/glsamaker/portage.rb, line 23
      -def ebuild(atom)
      -  raise(ArgumentError, "Invalid package atom") unless Portage.valid_atom?(atom)
      -  nil
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - eix(atom) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File lib/glsamaker/portage.rb, line 28
      -def eix(atom)
      -  nil
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - google(atom) - click to toggle source -
      - - -
      - -

      Loads a description for atom from Google

      - - - -
      -
      -# File lib/glsamaker/portage.rb, line 47
      -def google(atom)
      -  nil
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - pgo(atom) - click to toggle source -
      - - -
      - -

      Loads a description for atom from packages.gentoo.org

      - - - -
      -
      -# File lib/glsamaker/portage.rb, line 33
      -def pgo(atom)
      -  raise(ArgumentError, "Invalid package atom") unless Portage.valid_atom?(atom)
      -
      -  n = Nokogiri::XML(Glsamaker::HTTP.get("http://packages.gentoo.org/package/#{atom}"))
      -
      -  node = n.css('p.description').first.children.first
      -  if node.type == Nokogiri::XML::Node::TEXT_NODE
      -    node.to_s
      -  else
      -    raise ArgumentError, "XML parse error"
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Glsamaker/XML.html b/doc/app/Glsamaker/XML.html deleted file mode 100644 index 66e4f6b..0000000 --- a/doc/app/Glsamaker/XML.html +++ /dev/null @@ -1,323 +0,0 @@ - - - - - - - Module: Glsamaker::XML - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      -
      - -
      -
      - - -
      - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      Glsamaker::XML

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - indent(xml, options = {:indent => 2}) - click to toggle source -
      - - -
      - - - - - -
      -
      -# File lib/glsamaker/xml.rb, line 14
      -def indent(xml, options = {:indent => 2})
      -  command = GLSAMAKER_XMLINDENT
      -  raise "xmlindent either does not exist or is not executable." unless File.executable? command.split(' ', 2)[0]
      -  
      -  command += " -i#{Integer options[:indent]}" if options.has_key? :indent
      -  command += " -l#{Integer options[:maxcols]}" if options.has_key? :maxcols
      -
      -  # \r\n will make problems while converting
      -  xml.gsub!("\r", "")
      -
      -  IO.popen(command, 'r+') do |io|
      -    io.write xml
      -    io.close_write
      -    io.read
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/IndexController.html b/doc/app/IndexController.html deleted file mode 100644 index 4040caa..0000000 --- a/doc/app/IndexController.html +++ /dev/null @@ -1,487 +0,0 @@ - - - - - - - Class: IndexController - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      IndexController

      - -
      - -

      Index controller

      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - about() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/index_controller.rb, line 32
      -def about
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - error() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/index_controller.rb, line 20
      -def error
      -  if params[:type] == "user"
      -    render :template => 'index/error-user', :layout => 'notice'
      -  elsif params[:type] == "disabled"
      -    render :template => 'index/error-disabled', :layout => 'notice'
      -  elsif params[:type] == "access"
      -    render :template => 'index/error-access', :layout => 'notice'
      -  else
      -    render :template => 'index/error-system', :layout => 'notice'
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - index() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/index_controller.rb, line 16
      -def index
      -  @my_drafts = Glsa.where(:status => 'draft', :submitter => current_user.id).order("updated_at DESC").limit(10)
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - profile() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/index_controller.rb, line 35
      -def profile
      -  @user = current_user
      -  @prefs = @user.preferences
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - update() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/index_controller.rb, line 40
      -def update
      -  @user = current_user
      -  @prefs = @user.preferences
      -
      -  preferences = {:own_ready => false, :own_comment => false, :edit => false, :new_req => false, :not_me => false}
      -
      -  unless params[:preferences] == nil
      -    ]own_ready own_comment edit new_req not_me].each do |notification|
      -      preferences[notification.to_sym] = params[:preferences][notification] == '1'
      -    end
      -  end
      -  
      -  @user.preferences[:mail] ||= {}
      -  @user.preferences[:mail] = preferences
      -  if @user.save
      -    flash[:notice] = "Successfully updated your profile"
      -    redirect_to :action => "index"
      -  else
      -    flash[:error] = "Could not update your profile"
      -    render :action => "profile"
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/IndexHelper.html b/doc/app/IndexHelper.html deleted file mode 100644 index 7590c64..0000000 --- a/doc/app/IndexHelper.html +++ /dev/null @@ -1,263 +0,0 @@ - - - - - - - Module: IndexHelper - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - - - - - - - - -
      - - -
      - -
      -

      IndexHelper

      - -
      - -

      Index Helper

      - -
      - - - - -
      - - - - - - - - - - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Package.html b/doc/app/Package.html deleted file mode 100644 index c3a080e..0000000 --- a/doc/app/Package.html +++ /dev/null @@ -1,332 +0,0 @@ - - - - - - - Class: Package - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      -
      - -
      -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      Package

      - -
      - -

      Package model

      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - xml_comp() - click to toggle source -
      - - -
      - -

      Returns the comparator in the format needed for the XML

      - - - -
      -
      -# File app/models/package.rb, line 17
      -def xml_comp
      -  comps = {
      -    '>=' => 'ge',
      -    '>'  => 'gt',
      -    '='  => 'eq',
      -    '<=' => 'le',
      -    '<'  => 'lt',
      -    '*<' => 'rlt',
      -    '*<=' => 'rle',
      -    '*>' => 'rgt',
      -    '*>=' => 'rge'
      -  }
      -
      -  comps[self.comp]
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Reference.html b/doc/app/Reference.html deleted file mode 100644 index 839fa87..0000000 --- a/doc/app/Reference.html +++ /dev/null @@ -1,271 +0,0 @@ - - - - - - - Class: Reference - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - - -
      - - -
      - -
      -

      Reference

      - -
      - -

      Reference model

      - -
      - - - - -
      - - - - - - - - - - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Revision.html b/doc/app/Revision.html deleted file mode 100644 index a8d7364..0000000 --- a/doc/app/Revision.html +++ /dev/null @@ -1,524 +0,0 @@ - - - - - - - Class: Revision - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - - - - - -
      - - -
      - -
      -

      Revision

      - -
      - -

      Revision model

      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - bug_ready?() - click to toggle source -
      - - -
      - -

      Checks all assigned bugs for bug ready status

      - - - -
      -
      -# File app/models/revision.rb, line 56
      -def bug_ready?
      -  self.bugs.each do |b|
      -    return false unless b.bug_ready?
      -  end
      -  
      -  return true
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - deep_copy() - click to toggle source -
      - - -
      - -

      Creates a deep copy of a previous revision, copying all bugs, references -and packages, incrementing the revision ID by one. The caller must take -care of deleting this revision again in case any error occurs later.

      - - - -
      -
      -# File app/models/revision.rb, line 74
      -def deep_copy
      -  new_rev = dup
      -  new_rev.revid = glsa.next_revid
      -  
      -  references.each {|reference| new_rev.references << reference.dup }
      -  packages.each {|package| new_rev.packages << package.dup }
      -  bugs.each {|bug| new_rev.bugs << bug.dup }
      -  
      -  new_rev.save!
      -  new_rev
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - get_linked_bugs() - click to toggle source -
      - - -
      - -

      Returns an Array of Integers of the bugs linked to this revision

      - - - -
      -
      -# File app/models/revision.rb, line 49
      -def get_linked_bugs
      -  self.bugs.map do |bug|
      -    bug.bug_id.to_i
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - packages_by_atom() - click to toggle source -
      - - -
      - -

      Returns the packages linked to this revision grouped by atoms

      - - - -
      -
      -# File app/models/revision.rb, line 87
      -def packages_by_atom
      -  packages_list = {}
      -  self.packages.each do |p|
      -    packages_list[p[:atom]] ||= {}
      -    (packages_list[p[:atom]][p[:my_type]] ||= []) << p
      -  end
      -  
      -  packages_list
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - to_s() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/models/revision.rb, line 97
      -def to_s
      -  s = "r#{self.revid}"
      -  if self.is_release?
      -    s << " (release #{self.release_revision})"
      -  end
      -
      -  s
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - update_cached_bug_metadata() - click to toggle source -
      - - -
      - -

      Updates the cached metadata of all assigned bugs

      - - - -
      -
      -# File app/models/revision.rb, line 65
      -def update_cached_bug_metadata
      -  self.bugs.each do |b|
      -    b.update_cached_metadata
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/SearchController.html b/doc/app/SearchController.html deleted file mode 100644 index 0c68917..0000000 --- a/doc/app/SearchController.html +++ /dev/null @@ -1,378 +0,0 @@ - - - - - - - Class: SearchController - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      SearchController

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - index() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/search_controller.rb, line 2
      -def index
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - results() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/search_controller.rb, line 5
      -def results
      -  search = ThinkingSphinx.search params[:q], :max_matches => 1000, :per_page => 1000
      -  
      -  @results = {}
      -  search.each do |result|
      -    klass = result.class.to_s
      -    @results[klass] = [] unless @results.include? klass
      -    @results[klass] << result
      -  end
      -  
      -  if @results.include? 'Revision'
      -    @results['Glsa'] = [] unless @results['Glsa']
      -    
      -    @results['Revision'].each do |rev|
      -      @results['Glsa'] << rev.glsa
      -    end
      -    
      -    @results['Glsa'].uniq!
      -  end
      -
      -  # Filter search results
      -  if @results.include? 'Glsa'
      -    @results['Glsa'].delete_if do |result|
      -      not check_object_access(result)
      -    end
      -  end
      -rescue Riddle::ConnectionError => e
      -  @error = true
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/SearchHelper.html b/doc/app/SearchHelper.html deleted file mode 100644 index f928d82..0000000 --- a/doc/app/SearchHelper.html +++ /dev/null @@ -1,261 +0,0 @@ - - - - - - - Module: SearchHelper - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - - - - - - - - -
      - - -
      - -
      -

      SearchHelper

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/String.html b/doc/app/String.html deleted file mode 100644 index 1123444..0000000 --- a/doc/app/String.html +++ /dev/null @@ -1,435 +0,0 @@ - - - - - - - Class: String - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      -
      - -
      -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      String

      - -
      - -

      GLSAMaker v2

      - -
      Copyright (C) 2009-2011 Alex Legler <a3li@gentoo.org>
      -Copyright (C) 2009 Pierre-Yves Rofes <py@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - bold() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File lib/tasks/utils.rb, line 26
      -def bold
      -  ansi 1
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - green() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File lib/tasks/utils.rb, line 22
      -def green
      -  ansi 32
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - purple() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File lib/tasks/utils.rb, line 14
      -def purple
      -  ansi 35
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - red() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File lib/tasks/utils.rb, line 18
      -def red
      -  ansi 31
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/Template.html b/doc/app/Template.html deleted file mode 100644 index 4f809ee..0000000 --- a/doc/app/Template.html +++ /dev/null @@ -1,269 +0,0 @@ - - - - - - - Class: Template - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - - -
      - - -
      - -
      -

      Template

      - -
      - -
      - - - - -
      - - - - - - - - - - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/ToolsController.html b/doc/app/ToolsController.html deleted file mode 100644 index 5c1c478..0000000 --- a/doc/app/ToolsController.html +++ /dev/null @@ -1,448 +0,0 @@ - - - - - - - Class: ToolsController - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      ToolsController

      - -
      - -

      Tools controller

      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - background() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/tools_controller.rb, line 69
      -def background
      -  render :layout => false
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - bugs_ajax_info() - click to toggle source -
      - - -
      - -

      Provides information for the ‘file new request’ page

      - - - -
      -
      -# File app/controllers/tools_controller.rb, line 17
      -def bugs_ajax_info
      -  if params[:bugs] == nil
      -    render :text => "No bug given", :status => 500
      -    return
      -  end
      -  
      -  bug_ids = Bugzilla::Bug.str2bugIDs(params[:bugs])
      -  
      -  @bugs = []
      -  bug_ids.each do |bug_id|
      -    begin
      -      @bugs << Bugzilla::Bug.load_from_id(bug_id.to_i)
      -    rescue Exception => e
      -      @bugs << "Ignoring #{bug_id} #{e.message}"
      -    end
      -  end
      -  
      -  buginfo = render_to_string :template => 'tools/ajaxbugs', :layout => false
      -  
      -  # Generating a description
      -  @bugs.delete_if {|i| i.is_a? String}
      -  suggestion = nil
      -  
      -  if @bugs.length == 1
      -    @text = @bugs[0].summary
      -    suggestion = render_to_string :template => 'tools/ajaxdescr', :layout => false
      -  else
      -    @atoms = []
      -    @bugs.each do |bug|
      -      matchdata = /([\w-]+)\/([\w-]+)(-([\w.]+))?/.match(bug.summary)
      -      
      -      unless matchdata.nil?
      -        category = matchdata[1]
      -        package = matchdata[2].gsub(/-+?$/, '')
      -      
      -        @atoms << "#{category}/#{package}"
      -      end
      -    end
      -    
      -    @atoms.uniq!
      -    
      -    if @atoms.length > 0
      -      @text = @atoms.join(', ') + ": Multiple vulnerabilities"
      -      suggestion = render_to_string :template => 'tools/ajaxdescr', :layout => false
      -    end
      -  end
      -  
      -  suggestion ||= "(no suggestion available)"
      -  
      -  render :json => {"buginfo" => buginfo, "title" => suggestion}
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - template() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/controllers/tools_controller.rb, line 73
      -def template
      -  @target = params[:template][:target]
      -
      -  if GLSAMAKER_TEMPLATE_TARGETS.include? @target
      -    begin
      -      @template = Template.find(params[:template][:id])
      -    rescue ActiveRecord::RecordNotFound
      -      @error = "Cannot find template"
      -    end
      -  else
      -    @error = "Invalid target"
      -  end
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/ToolsHelper.html b/doc/app/ToolsHelper.html deleted file mode 100644 index 37a60fd..0000000 --- a/doc/app/ToolsHelper.html +++ /dev/null @@ -1,263 +0,0 @@ - - - - - - - Module: ToolsHelper - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      - -
      - - -
      - -
      - - - - - - - - - -
      - - -
      - -
      -

      ToolsHelper

      - -
      - -

      Tools helper

      - -
      - - - - -
      - - - - - - - - - - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/User.html b/doc/app/User.html deleted file mode 100644 index eff1570..0000000 --- a/doc/app/User.html +++ /dev/null @@ -1,444 +0,0 @@ - - - - - - - Class: User - - - - - - - - - - - -
      -
      -
      -

      - Home - Classes - Methods -

      -
      -
      - -
      -
      -

      In Files

      -
      - -
      -
      - - -
      - -
      - - -
      -

      Parent

      - - - -
      - - - - - - - - -
      -

      Methods

      - -
      - - - -
      - - -
      - -
      -

      User

      - -
      - -

      Access levels

      -
      0 (Contributor)
      -
      -

      Can see own drafts, can fill in requests

      -
      1 (Padawan)
      -
      -

      all of the above, plus see and edit all drafts

      -
      2 (Full member)
      -
      -

      all of the above, plus voting

      -
      3 (Confidential member)
      -
      -

      all of the above, including restricted drafts

      -
      - -
      - - - - -
      - - - - - - - - - - -
      -

      Public Instance Methods

      - - -
      - - - -
      - can_access?(glsa) - click to toggle source -
      - - -
      - -

      Checks access to a given GLSA

      - - - -
      -
      -# File app/models/user.rb, line 44
      -def can_access?(glsa)
      -  return false if access == 0 and not glsa.is_owner? self
      -  return false if access < 3 and glsa.restricted
      -  
      -  true
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - get_pref_category(category) - click to toggle source -
      - - -
      - -

      Returns a certain category form the user’s preferences or an empty hash -if that category does not exist

      - - - -
      -
      -# File app/models/user.rb, line 57
      -def get_pref_category(category)
      -  return {} if self.preferences == nil or self.preferences[category] == nil
      -  
      -  self.preferences[category]
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - is_el_jefe?() - click to toggle source -
      - - -
      - -

      Is the user an admin? ;)

      - - - -
      -
      -# File app/models/user.rb, line 39
      -def is_el_jefe?
      -  self.jefe
      -end
      -
      - -
      - - - - -
      - - -
      - - - -
      - to_s() - click to toggle source -
      - - -
      - - - - - -
      -
      -# File app/models/user.rb, line 51
      -def to_s
      -  "#{name} (#{login})"
      -end
      -
      - -
      - - - - -
      - - -
      - -
      - - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - - diff --git a/doc/app/app/controllers/admin/index_controller_rb.html b/doc/app/app/controllers/admin/index_controller_rb.html deleted file mode 100644 index f67d077..0000000 --- a/doc/app/app/controllers/admin/index_controller_rb.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - File: index_controller.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Mon Aug 29 14:56:39 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -
      - -
      - - - diff --git a/doc/app/app/controllers/admin/templates_controller_rb.html b/doc/app/app/controllers/admin/templates_controller_rb.html deleted file mode 100644 index 28fc938..0000000 --- a/doc/app/app/controllers/admin/templates_controller_rb.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - File: templates_controller.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Mon Aug 29 14:56:39 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -
      - -
      - - - diff --git a/doc/app/app/controllers/admin/users_controller_rb.html b/doc/app/app/controllers/admin/users_controller_rb.html deleted file mode 100644 index 90174b6..0000000 --- a/doc/app/app/controllers/admin/users_controller_rb.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - File: users_controller.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Mon Aug 29 14:56:39 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -
      - -
      - - - diff --git a/doc/app/app/controllers/application_controller_rb.html b/doc/app/app/controllers/application_controller_rb.html deleted file mode 100644 index 5d26309..0000000 --- a/doc/app/app/controllers/application_controller_rb.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - File: application_controller.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Thu Sep 01 20:06:30 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2009-2011 Alex Legler <a3li@gentoo.org>
      -Copyright (C) 2009 Pierre-Yves Rofes <py@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/app/controllers/bug_controller_rb.html b/doc/app/app/controllers/bug_controller_rb.html deleted file mode 100644 index dfff5bd..0000000 --- a/doc/app/app/controllers/bug_controller_rb.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - File: bug_controller.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Sun Aug 14 14:43:15 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2009-2011 Alex Legler <a3li@gentoo.org>
      -Copyright (C) 2009 Pierre-Yves Rofes <py@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/app/controllers/bugs_controller_rb.html b/doc/app/app/controllers/bugs_controller_rb.html deleted file mode 100644 index 7ed9419..0000000 --- a/doc/app/app/controllers/bugs_controller_rb.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - File: bugs_controller.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Thu Sep 01 20:06:58 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2011 Alex Legler <a3li@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/app/controllers/comments_controller_rb.html b/doc/app/app/controllers/comments_controller_rb.html deleted file mode 100644 index 4c9c812..0000000 --- a/doc/app/app/controllers/comments_controller_rb.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - File: comments_controller.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Sun Sep 04 14:49:11 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2011 Alex Legler <a3li@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/app/controllers/cve_controller_rb.html b/doc/app/app/controllers/cve_controller_rb.html deleted file mode 100644 index 413121f..0000000 --- a/doc/app/app/controllers/cve_controller_rb.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - File: cve_controller.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Mon Aug 29 14:56:39 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -
      - -
      - - - diff --git a/doc/app/app/controllers/glsa_controller_rb.html b/doc/app/app/controllers/glsa_controller_rb.html deleted file mode 100644 index 91d7860..0000000 --- a/doc/app/app/controllers/glsa_controller_rb.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - File: glsa_controller.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Sun Sep 04 00:52:07 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2010-11 Alex Legler <a3li@gentoo.org>
      -Copyright (C) 2009 Pierre-Yves Rofes <py@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/app/controllers/index_controller_rb.html b/doc/app/app/controllers/index_controller_rb.html deleted file mode 100644 index 47199fe..0000000 --- a/doc/app/app/controllers/index_controller_rb.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - File: index_controller.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Mon Aug 29 20:18:29 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2009-2011 Alex Legler <a3li@gentoo.org>
      -Copyright (C) 2009 Pierre-Yves Rofes <py@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/app/controllers/search_controller_rb.html b/doc/app/app/controllers/search_controller_rb.html deleted file mode 100644 index be6f4e9..0000000 --- a/doc/app/app/controllers/search_controller_rb.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - File: search_controller.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Thu Sep 01 20:00:53 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -
      - -
      - - - diff --git a/doc/app/app/controllers/tools_controller_rb.html b/doc/app/app/controllers/tools_controller_rb.html deleted file mode 100644 index 1ce2ac1..0000000 --- a/doc/app/app/controllers/tools_controller_rb.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - File: tools_controller.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Mon Aug 29 19:16:21 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2009-2011 Alex Legler <a3li@gentoo.org>
      -Copyright (C) 2009 Pierre-Yves Rofes <py@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/app/helpers/admin/index_helper_rb.html b/doc/app/app/helpers/admin/index_helper_rb.html deleted file mode 100644 index 3f09817..0000000 --- a/doc/app/app/helpers/admin/index_helper_rb.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - File: index_helper.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Sun Aug 14 14:43:15 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -
      - -
      - - - diff --git a/doc/app/app/helpers/admin/templates_helper_rb.html b/doc/app/app/helpers/admin/templates_helper_rb.html deleted file mode 100644 index 14d63e2..0000000 --- a/doc/app/app/helpers/admin/templates_helper_rb.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - File: templates_helper.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Mon Aug 29 14:56:39 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -
      - -
      - - - diff --git a/doc/app/app/helpers/admin/users_helper_rb.html b/doc/app/app/helpers/admin/users_helper_rb.html deleted file mode 100644 index 04875e2..0000000 --- a/doc/app/app/helpers/admin/users_helper_rb.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - File: users_helper.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Sun Aug 14 14:43:15 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -
      - -
      - - - diff --git a/doc/app/app/helpers/application_helper_rb.html b/doc/app/app/helpers/application_helper_rb.html deleted file mode 100644 index 8dfd4e7..0000000 --- a/doc/app/app/helpers/application_helper_rb.html +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - File: application_helper.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Tue Aug 30 18:13:21 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2009-11 Alex Legler <a3li@gentoo.org>
      -Copyright (C) 2006-07 Jean-Philippe Lang
      -Copyright (C) 2008 Robert Buchholz <rbu@gentoo.org> and Tobias Heinlein <keytoaster@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/app/helpers/bug_helper_rb.html b/doc/app/app/helpers/bug_helper_rb.html deleted file mode 100644 index f6efc2b..0000000 --- a/doc/app/app/helpers/bug_helper_rb.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - File: bug_helper.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Sun Aug 14 14:43:15 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -
      - -
      - - - diff --git a/doc/app/app/helpers/bugs_helper_rb.html b/doc/app/app/helpers/bugs_helper_rb.html deleted file mode 100644 index 9fb0d4a..0000000 --- a/doc/app/app/helpers/bugs_helper_rb.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - File: bugs_helper.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Mon Aug 29 14:56:39 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -
      - -
      - - - diff --git a/doc/app/app/helpers/comments_helper_rb.html b/doc/app/app/helpers/comments_helper_rb.html deleted file mode 100644 index 5e3f03f..0000000 --- a/doc/app/app/helpers/comments_helper_rb.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - File: comments_helper.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Mon Aug 29 14:56:39 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -
      - -
      - - - diff --git a/doc/app/app/helpers/cve_helper_rb.html b/doc/app/app/helpers/cve_helper_rb.html deleted file mode 100644 index 536b23c..0000000 --- a/doc/app/app/helpers/cve_helper_rb.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - File: cve_helper.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Mon Aug 22 23:12:58 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -
      - -
      - - - diff --git a/doc/app/app/helpers/glsa_helper_rb.html b/doc/app/app/helpers/glsa_helper_rb.html deleted file mode 100644 index 3d3e6fa..0000000 --- a/doc/app/app/helpers/glsa_helper_rb.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - File: glsa_helper.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Mon Aug 29 19:02:21 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2009-2011 Alex Legler <a3li@gentoo.org>
      -Copyright (C) 2009 Pierre-Yves Rofes <py@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/app/helpers/index_helper_rb.html b/doc/app/app/helpers/index_helper_rb.html deleted file mode 100644 index f737cd6..0000000 --- a/doc/app/app/helpers/index_helper_rb.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - File: index_helper.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Sun Aug 14 14:43:15 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2009-2011 Alex Legler <a3li@gentoo.org>
      -Copyright (C) 2009 Pierre-Yves Rofes <py@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/app/helpers/search_helper_rb.html b/doc/app/app/helpers/search_helper_rb.html deleted file mode 100644 index ede1014..0000000 --- a/doc/app/app/helpers/search_helper_rb.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - File: search_helper.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Tue Aug 30 15:17:23 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -
      - -
      - - - diff --git a/doc/app/app/helpers/tools_helper_rb.html b/doc/app/app/helpers/tools_helper_rb.html deleted file mode 100644 index 26e2e42..0000000 --- a/doc/app/app/helpers/tools_helper_rb.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - File: tools_helper.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Sun Aug 14 14:43:15 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2009-2011 Alex Legler <a3li@gentoo.org>
      -Copyright (C) 2009 Pierre-Yves Rofes <py@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/app/mailers/glsa_mailer_rb.html b/doc/app/app/mailers/glsa_mailer_rb.html deleted file mode 100644 index 43cd59d..0000000 --- a/doc/app/app/mailers/glsa_mailer_rb.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - File: glsa_mailer.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Mon Aug 29 14:56:39 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -
      - -
      - - - diff --git a/doc/app/app/models/bug_rb.html b/doc/app/app/models/bug_rb.html deleted file mode 100644 index 01d0e8e..0000000 --- a/doc/app/app/models/bug_rb.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - File: bug.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Tue Aug 30 15:17:23 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2009-2011 Alex Legler <a3li@gentoo.org>
      -Copyright (C) 2009 Pierre-Yves Rofes <py@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/app/models/comment_rb.html b/doc/app/app/models/comment_rb.html deleted file mode 100644 index 7c05461..0000000 --- a/doc/app/app/models/comment_rb.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - File: comment.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Sun Sep 04 15:03:52 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2009-2011 Alex Legler <a3li@gentoo.org>
      -Copyright (C) 2009 Pierre-Yves Rofes <py@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/app/models/cpe_rb.html b/doc/app/app/models/cpe_rb.html deleted file mode 100644 index 12e0670..0000000 --- a/doc/app/app/models/cpe_rb.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - File: cpe.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Mon Aug 29 14:56:39 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2010 Alex Legler <a3li@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/app/models/cve_assignment_rb.html b/doc/app/app/models/cve_assignment_rb.html deleted file mode 100644 index b8d9d20..0000000 --- a/doc/app/app/models/cve_assignment_rb.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - File: cve_assignment.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Mon Aug 29 14:56:39 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -
      - -
      - - - diff --git a/doc/app/app/models/cve_change_rb.html b/doc/app/app/models/cve_change_rb.html deleted file mode 100644 index 0b6b21c..0000000 --- a/doc/app/app/models/cve_change_rb.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - File: cve_change.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Mon Aug 29 14:56:39 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -
      - -
      - - - diff --git a/doc/app/app/models/cve_comment_rb.html b/doc/app/app/models/cve_comment_rb.html deleted file mode 100644 index b2a0d50..0000000 --- a/doc/app/app/models/cve_comment_rb.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - File: cve_comment.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Tue Aug 30 15:17:23 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -
      - -
      - - - diff --git a/doc/app/app/models/cve_rb.html b/doc/app/app/models/cve_rb.html deleted file mode 100644 index 6aae252..0000000 --- a/doc/app/app/models/cve_rb.html +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - File: cve.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Tue Aug 30 15:17:23 +0200 2011
      - - -
      Requires
      -
      -
        - -
      • glsamaker/helpers
      • - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2010 Alex Legler <a3li@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/app/models/cve_reference_rb.html b/doc/app/app/models/cve_reference_rb.html deleted file mode 100644 index 5e57e0e..0000000 --- a/doc/app/app/models/cve_reference_rb.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - File: cve_reference.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Mon Aug 29 14:56:39 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -
      - -
      - - - diff --git a/doc/app/app/models/glsa_rb.html b/doc/app/app/models/glsa_rb.html deleted file mode 100644 index 51ca649..0000000 --- a/doc/app/app/models/glsa_rb.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - File: glsa.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Sun Sep 04 14:42:42 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2009-2011 Alex Legler <a3li@gentoo.org>
      -Copyright (C) 2009 Pierre-Yves Rofes <py@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/app/models/package_rb.html b/doc/app/app/models/package_rb.html deleted file mode 100644 index 64e10d4..0000000 --- a/doc/app/app/models/package_rb.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - File: package.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Sun Aug 14 14:43:15 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2009-2011 Alex Legler <a3li@gentoo.org>
      -Copyright (C) 2009 Pierre-Yves Rofes <py@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/app/models/reference_rb.html b/doc/app/app/models/reference_rb.html deleted file mode 100644 index 6e7ad5b..0000000 --- a/doc/app/app/models/reference_rb.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - File: reference.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Sun Aug 14 14:43:15 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2009-2011 Alex Legler <a3li@gentoo.org>
      -Copyright (C) 2009 Pierre-Yves Rofes <py@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/app/models/revision_rb.html b/doc/app/app/models/revision_rb.html deleted file mode 100644 index 4d756da..0000000 --- a/doc/app/app/models/revision_rb.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - File: revision.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Tue Aug 30 15:17:23 +0200 2011
      - - -
      Requires
      -
      -
        - -
      • rexml/document
      • - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2009-2011 Alex Legler <a3li@gentoo.org>
      -Copyright (C) 2009 Pierre-Yves Rofes <py@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/app/models/template_rb.html b/doc/app/app/models/template_rb.html deleted file mode 100644 index 2e25072..0000000 --- a/doc/app/app/models/template_rb.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - File: template.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Mon Aug 29 14:56:39 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -
      - -
      - - - diff --git a/doc/app/app/models/user_rb.html b/doc/app/app/models/user_rb.html deleted file mode 100644 index 958fac4..0000000 --- a/doc/app/app/models/user_rb.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - File: user.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Mon Aug 29 14:56:39 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2009-2011 Alex Legler <a3li@gentoo.org>
      -Copyright (C) 2009 Pierre-Yves Rofes <py@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/created.rid b/doc/app/created.rid deleted file mode 100644 index 07ced90..0000000 --- a/doc/app/created.rid +++ /dev/null @@ -1,56 +0,0 @@ -Sun, 04 Sep 2011 22:29:19 +0200 -app/helpers/application_helper.rb Tue, 30 Aug 2011 18:13:21 +0200 -app/helpers/tools_helper.rb Sun, 14 Aug 2011 14:43:15 +0200 -app/models/comment.rb Sun, 04 Sep 2011 15:03:52 +0200 -lib/glsamaker/portage.rb Sun, 14 Aug 2011 14:43:15 +0200 -app/helpers/admin/users_helper.rb Sun, 14 Aug 2011 14:43:15 +0200 -app/helpers/bugs_helper.rb Mon, 29 Aug 2011 14:56:39 +0200 -app/models/reference.rb Sun, 14 Aug 2011 14:43:15 +0200 -app/models/cve_reference.rb Mon, 29 Aug 2011 14:56:39 +0200 -app/models/bug.rb Tue, 30 Aug 2011 15:17:23 +0200 -lib/bugzilla.rb Thu, 01 Sep 2011 20:47:04 +0200 -lib/tasks/utils.rb Sun, 14 Aug 2011 14:43:15 +0200 -app/controllers/admin/templates_controller.rb Mon, 29 Aug 2011 14:56:39 +0200 -app/helpers/index_helper.rb Sun, 14 Aug 2011 14:43:15 +0200 -app/helpers/admin/index_helper.rb Sun, 14 Aug 2011 14:43:15 +0200 -app/helpers/cve_helper.rb Mon, 22 Aug 2011 23:12:58 +0200 -app/models/cve_assignment.rb Mon, 29 Aug 2011 14:56:39 +0200 -app/models/glsa.rb Sun, 04 Sep 2011 14:42:42 +0200 -lib/glsamaker/helpers.rb Sun, 14 Aug 2011 14:43:15 +0200 -app/models/cve_comment.rb Tue, 30 Aug 2011 15:17:23 +0200 -app/models/cve.rb Tue, 30 Aug 2011 15:17:23 +0200 -app/controllers/admin/index_controller.rb Mon, 29 Aug 2011 14:56:39 +0200 -app/controllers/tools_controller.rb Mon, 29 Aug 2011 19:16:21 +0200 -app/helpers/bug_helper.rb Sun, 14 Aug 2011 14:43:15 +0200 -app/models/user.rb Mon, 29 Aug 2011 14:56:39 +0200 -lib/glsamaker.rb Sun, 14 Aug 2011 14:43:15 +0200 -lib/glsamaker/http.rb Sun, 14 Aug 2011 14:43:15 +0200 -app/models/revision.rb Tue, 30 Aug 2011 15:17:23 +0200 -lib/bugzilla/bug.rb Mon, 29 Aug 2011 14:56:39 +0200 -app/controllers/application_controller.rb Thu, 01 Sep 2011 20:06:30 +0200 -app/controllers/index_controller.rb Mon, 29 Aug 2011 20:18:29 +0200 -app/controllers/search_controller.rb Thu, 01 Sep 2011 20:00:53 +0200 -app/controllers/cve_controller.rb Mon, 29 Aug 2011 14:56:39 +0200 -app/mailers/glsa_mailer.rb Mon, 29 Aug 2011 14:56:39 +0200 -app/models/package.rb Sun, 14 Aug 2011 14:43:15 +0200 -app/models/template.rb Mon, 29 Aug 2011 14:56:39 +0200 -lib/glsamaker/bugs.rb Sun, 14 Aug 2011 14:43:15 +0200 -app/controllers/admin/users_controller.rb Mon, 29 Aug 2011 14:56:39 +0200 -lib/bugzilla/comment.rb Sun, 14 Aug 2011 14:43:15 +0200 -lib/bugzilla/history.rb Mon, 29 Aug 2011 14:56:39 +0200 -lib/authorization.rb Sun, 04 Sep 2011 11:11:44 +0200 -lib/authentication.rb Mon, 29 Aug 2011 14:56:39 +0200 -lib/glsamaker/diff.rb Sun, 14 Aug 2011 14:43:15 +0200 -lib/glsamaker/xml.rb Sun, 14 Aug 2011 14:43:15 +0200 -app/controllers/bug_controller.rb Sun, 14 Aug 2011 14:43:15 +0200 -app/controllers/glsa_controller.rb Sun, 04 Sep 2011 00:52:07 +0200 -app/helpers/glsa_helper.rb Mon, 29 Aug 2011 19:02:21 +0200 -doc/README_FOR_APP Sun, 04 Sep 2011 22:27:27 +0200 -lib/glsamaker/mail.rb Mon, 29 Aug 2011 14:56:39 +0200 -app/controllers/comments_controller.rb Sun, 04 Sep 2011 14:49:11 +0200 -app/helpers/comments_helper.rb Mon, 29 Aug 2011 14:56:39 +0200 -app/helpers/admin/templates_helper.rb Mon, 29 Aug 2011 14:56:39 +0200 -app/models/cpe.rb Mon, 29 Aug 2011 14:56:39 +0200 -app/controllers/bugs_controller.rb Thu, 01 Sep 2011 20:06:58 +0200 -app/helpers/search_helper.rb Tue, 30 Aug 2011 15:17:23 +0200 -app/models/cve_change.rb Mon, 29 Aug 2011 14:56:39 +0200 diff --git a/doc/app/doc/README_FOR_APP.html b/doc/app/doc/README_FOR_APP.html deleted file mode 100644 index ffbe146..0000000 --- a/doc/app/doc/README_FOR_APP.html +++ /dev/null @@ -1,260 +0,0 @@ - - - - - - - - File: README_FOR_APP [GLSAMaker 2] - - - - - - - - - - - - -
      - -

      GLSAMaker v2

      - -

      GLSAMaker is a core tool for the Gentoo Security Team. It is used to track, -create, edit and review Security announcements and drafts.

      - -

      Project website: redmine.a3li.li/projects/glsamaker2

      - -

      Needed libraries

      -
      • -

        Rails 3.1

        -
      • -

        Nokogiri

        -
      • -

        FasterCSV

        -
      • -

        JSON

        -
      • -

        Mechanize

        -
      • -

        Rcov

        -
      • -

        text-format

        -
      • -

        xmlindent

        -
      • -

        Sphinx

        -
      • -

        Sparklines

        -
      - -

      Copyright

      - -
      Copyright (C) 2009-2011 Alex Legler <a3li@gentoo.org>
      -Copyright (C) 2009 Pierre-Yves Rofes <py@gentoo.org>
      -Portions Copyright (C) 2006-2007 Jean-Philippe Lang
      - -

      License

      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - - diff --git a/doc/app/images/brick.png b/doc/app/images/brick.png deleted file mode 100644 index 7851cf3..0000000 Binary files a/doc/app/images/brick.png and /dev/null differ diff --git a/doc/app/images/brick_link.png b/doc/app/images/brick_link.png deleted file mode 100644 index 9ebf013..0000000 Binary files a/doc/app/images/brick_link.png and /dev/null differ diff --git a/doc/app/images/bug.png b/doc/app/images/bug.png deleted file mode 100644 index 2d5fb90..0000000 Binary files a/doc/app/images/bug.png and /dev/null differ diff --git a/doc/app/images/bullet_black.png b/doc/app/images/bullet_black.png deleted file mode 100644 index 5761970..0000000 Binary files a/doc/app/images/bullet_black.png and /dev/null differ diff --git a/doc/app/images/bullet_toggle_minus.png b/doc/app/images/bullet_toggle_minus.png deleted file mode 100644 index b47ce55..0000000 Binary files a/doc/app/images/bullet_toggle_minus.png and /dev/null differ diff --git a/doc/app/images/bullet_toggle_plus.png b/doc/app/images/bullet_toggle_plus.png deleted file mode 100644 index 9ab4a89..0000000 Binary files a/doc/app/images/bullet_toggle_plus.png and /dev/null differ diff --git a/doc/app/images/date.png b/doc/app/images/date.png deleted file mode 100644 index 783c833..0000000 Binary files a/doc/app/images/date.png and /dev/null differ diff --git a/doc/app/images/find.png b/doc/app/images/find.png deleted file mode 100644 index 1547479..0000000 Binary files a/doc/app/images/find.png and /dev/null differ diff --git a/doc/app/images/loadingAnimation.gif b/doc/app/images/loadingAnimation.gif deleted file mode 100644 index 82290f4..0000000 Binary files a/doc/app/images/loadingAnimation.gif and /dev/null differ diff --git a/doc/app/images/macFFBgHack.png b/doc/app/images/macFFBgHack.png deleted file mode 100644 index c6473b3..0000000 Binary files a/doc/app/images/macFFBgHack.png and /dev/null differ diff --git a/doc/app/images/package.png b/doc/app/images/package.png deleted file mode 100644 index da3c2a2..0000000 Binary files a/doc/app/images/package.png and /dev/null differ diff --git a/doc/app/images/page_green.png b/doc/app/images/page_green.png deleted file mode 100644 index de8e003..0000000 Binary files a/doc/app/images/page_green.png and /dev/null differ diff --git a/doc/app/images/page_white_text.png b/doc/app/images/page_white_text.png deleted file mode 100644 index 813f712..0000000 Binary files a/doc/app/images/page_white_text.png and /dev/null differ diff --git a/doc/app/images/page_white_width.png b/doc/app/images/page_white_width.png deleted file mode 100644 index 1eb8809..0000000 Binary files a/doc/app/images/page_white_width.png and /dev/null differ diff --git a/doc/app/images/plugin.png b/doc/app/images/plugin.png deleted file mode 100644 index 6187b15..0000000 Binary files a/doc/app/images/plugin.png and /dev/null differ diff --git a/doc/app/images/ruby.png b/doc/app/images/ruby.png deleted file mode 100644 index f763a16..0000000 Binary files a/doc/app/images/ruby.png and /dev/null differ diff --git a/doc/app/images/tag_green.png b/doc/app/images/tag_green.png deleted file mode 100644 index 83ec984..0000000 Binary files a/doc/app/images/tag_green.png and /dev/null differ diff --git a/doc/app/images/wrench.png b/doc/app/images/wrench.png deleted file mode 100644 index 5c8213f..0000000 Binary files a/doc/app/images/wrench.png and /dev/null differ diff --git a/doc/app/images/wrench_orange.png b/doc/app/images/wrench_orange.png deleted file mode 100644 index 565a933..0000000 Binary files a/doc/app/images/wrench_orange.png and /dev/null differ diff --git a/doc/app/images/zoom.png b/doc/app/images/zoom.png deleted file mode 100644 index 908612e..0000000 Binary files a/doc/app/images/zoom.png and /dev/null differ diff --git a/doc/app/index.html b/doc/app/index.html deleted file mode 100644 index 97d1bec..0000000 --- a/doc/app/index.html +++ /dev/null @@ -1,612 +0,0 @@ - - - - - - - - GLSAMaker 2 - - - - - - - - - - - - -

      GLSAMaker 2

      - - -

      This is the API documentation for 'GLSAMaker 2'.

      - - - - -

      Files

      - - - -

      Classes/Modules

      - - -

      Methods

      - - -
      -

      [Validate]

      -

      Generated with the Darkfish - Rdoc Generator 2.

      -
      - - diff --git a/doc/app/js/darkfish.js b/doc/app/js/darkfish.js deleted file mode 100644 index 84565c1..0000000 --- a/doc/app/js/darkfish.js +++ /dev/null @@ -1,116 +0,0 @@ -/** - * - * Darkfish Page Functions - * $Id: darkfish.js 53 2009-01-07 02:52:03Z deveiant $ - * - * Author: Michael Granger - * - */ - -/* Provide console simulation for firebug-less environments */ -if (!("console" in window) || !("firebug" in console)) { - var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", - "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"]; - - window.console = {}; - for (var i = 0; i < names.length; ++i) - window.console[names[i]] = function() {}; -}; - - -/** - * Unwrap the first element that matches the given @expr@ from the targets and return them. - */ -$.fn.unwrap = function( expr ) { - return this.each( function() { - $(this).parents( expr ).eq( 0 ).after( this ).remove(); - }); -}; - - -function showSource( e ) { - var target = e.target; - var codeSections = $(target). - parents('.method-detail'). - find('.method-source-code'); - - $(target). - parents('.method-detail'). - find('.method-source-code'). - slideToggle(); -}; - -function hookSourceViews() { - $('.method-description,.method-heading').click( showSource ); -}; - -function toggleDebuggingSection() { - $('.debugging-section').slideToggle(); -}; - -function hookDebuggingToggle() { - $('#debugging-toggle img').click( toggleDebuggingSection ); -}; - -function hookQuickSearch() { - $('.quicksearch-field').each( function() { - var searchElems = $(this).parents('.section').find( 'li' ); - var toggle = $(this).parents('.section').find('h3 .search-toggle'); - // console.debug( "Toggle is: %o", toggle ); - var qsbox = $(this).parents('form').get( 0 ); - - $(this).quicksearch( this, searchElems, { - noSearchResultsIndicator: 'no-class-search-results', - focusOnLoad: false - }); - $(toggle).click( function() { - // console.debug( "Toggling qsbox: %o", qsbox ); - $(qsbox).toggle(); - }); - }); -}; - -function highlightTarget( anchor ) { - console.debug( "Highlighting target '%s'.", anchor ); - - $("a[name=" + anchor + "]").each( function() { - if ( !$(this).parent().parent().hasClass('target-section') ) { - console.debug( "Wrapping the target-section" ); - $('div.method-detail').unwrap( 'div.target-section' ); - $(this).parent().wrap( '
      ' ); - } else { - console.debug( "Already wrapped." ); - } - }); -}; - -function highlightLocationTarget() { - console.debug( "Location hash: %s", window.location.hash ); - if ( ! window.location.hash || window.location.hash.length == 0 ) return; - - var anchor = window.location.hash.substring(1); - console.debug( "Found anchor: %s; matching %s", anchor, "a[name=" + anchor + "]" ); - - highlightTarget( anchor ); -}; - -function highlightClickTarget( event ) { - console.debug( "Highlighting click target for event %o", event.target ); - try { - var anchor = $(event.target).attr( 'href' ).substring(1); - console.debug( "Found target anchor: %s", anchor ); - highlightTarget( anchor ); - } catch ( err ) { - console.error( "Exception while highlighting: %o", err ); - }; -}; - - -$(document).ready( function() { - hookSourceViews(); - hookDebuggingToggle(); - hookQuickSearch(); - highlightLocationTarget(); - - $('ul.link-list a').bind( "click", highlightClickTarget ); -}); diff --git a/doc/app/js/jquery.js b/doc/app/js/jquery.js deleted file mode 100644 index afe9e74..0000000 --- a/doc/app/js/jquery.js +++ /dev/null @@ -1,32 +0,0 @@ -/* - * jQuery 1.2.6 - New Wave Javascript - * - * Copyright (c) 2008 John Resig (jquery.com) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * $Date: 2008-09-25 09:50:52 -0700 (Thu, 25 Sep 2008) $ - * $Rev: 38 $ - */ -(function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else -return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else -return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else -selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else -this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else -return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else -jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else -jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("",""]||!tags.indexOf("",""]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
      "]||!tags.indexOf("",""]||(!tags.indexOf("",""]||!tags.indexOf("",""]||jQuery.browser.msie&&[1,"div
      ","
      "]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf(""&&tags.indexOf("=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else -ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&¬xml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&¬xml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&¬xml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else -while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return im[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else -for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("
      ").append(res.responseText.replace(//g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else -xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else -jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else -for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else -s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else -e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;ithis.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})(); \ No newline at end of file diff --git a/doc/app/js/quicksearch.js b/doc/app/js/quicksearch.js deleted file mode 100644 index 70dbd33..0000000 --- a/doc/app/js/quicksearch.js +++ /dev/null @@ -1,114 +0,0 @@ -/** - * - * JQuery QuickSearch - Hook up a form field to hide non-matching elements. - * $Id: quicksearch.js 53 2009-01-07 02:52:03Z deveiant $ - * - * Author: Michael Granger - * - */ -jQuery.fn.quicksearch = function( target, searchElems, options ) { - // console.debug( "Quicksearch fn" ); - - var settings = { - delay: 250, - clearButton: false, - highlightMatches: false, - focusOnLoad: false, - noSearchResultsIndicator: null - }; - if ( options ) $.extend( settings, options ); - - return jQuery(this).each( function() { - // console.debug( "Creating a new quicksearch on %o for %o", this, searchElems ); - new jQuery.quicksearch( this, searchElems, settings ); - }); -}; - - -jQuery.quicksearch = function( searchBox, searchElems, settings ) { - var timeout; - var boxdiv = $(searchBox).parents('div').eq(0); - - function init() { - setupKeyEventHandlers(); - focusOnLoad(); - }; - - function setupKeyEventHandlers() { - // console.debug( "Hooking up the 'keypress' event to %o", searchBox ); - $(searchBox). - unbind( 'keyup' ). - keyup( function(e) { return onSearchKey( e.keyCode ); }); - $(searchBox). - unbind( 'keypress' ). - keypress( function(e) { - switch( e.which ) { - // Execute the search on Enter, Tab, or Newline - case 9: - case 13: - case 10: - clearTimeout( timeout ); - e.preventDefault(); - doQuickSearch(); - break; - - // Allow backspace - case 8: - return true; - break; - - // Only allow valid search characters - default: - return validQSChar( e.charCode ); - } - }); - }; - - function focusOnLoad() { - if ( !settings.focusOnLoad ) return false; - $(searchBox).focus(); - }; - - function onSearchKey ( code ) { - clearTimeout( timeout ); - // console.debug( "...scheduling search." ); - timeout = setTimeout( doQuickSearch, settings.delay ); - }; - - function validQSChar( code ) { - var c = String.fromCharCode( code ); - return ( - (c == ':') || - (c >= 'a' && c <= 'z') || - (c >= 'A' && c <= 'Z') - ); - }; - - function doQuickSearch() { - var searchText = searchBox.value; - var pat = new RegExp( searchText, "im" ); - var shownCount = 0; - - if ( settings.noSearchResultsIndicator ) { - $('#' + settings.noSearchResultsIndicator).hide(); - } - - // All elements start out hidden - $(searchElems).each( function(index) { - var str = $(this).text(); - - if ( pat.test(str) ) { - shownCount += 1; - $(this).fadeIn(); - } else { - $(this).hide(); - } - }); - - if ( shownCount == 0 && settings.noSearchResultsIndicator ) { - $('#' + settings.noSearchResultsIndicator).slideDown(); - } - }; - - init(); -}; diff --git a/doc/app/js/thickbox-compressed.js b/doc/app/js/thickbox-compressed.js deleted file mode 100644 index 3a3fdae..0000000 --- a/doc/app/js/thickbox-compressed.js +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Thickbox 3 - One Box To Rule Them All. - * By Cody Lindley (http://www.codylindley.com) - * Copyright (c) 2007 cody lindley - * Licensed under the MIT License: http://www.opensource.org/licenses/mit-license.php -*/ - -var tb_pathToImage = "../images/loadingAnimation.gif"; - -eval(function(p,a,c,k,e,r){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('$(o).2S(9(){1u(\'a.18, 3n.18, 3i.18\');1w=1p 1t();1w.L=2H});9 1u(b){$(b).s(9(){6 t=X.Q||X.1v||M;6 a=X.u||X.23;6 g=X.1N||P;19(t,a,g);X.2E();H P})}9 19(d,f,g){3m{3(2t o.v.J.2i==="2g"){$("v","11").r({A:"28%",z:"28%"});$("11").r("22","2Z");3(o.1Y("1F")===M){$("v").q("<4 5=\'B\'><4 5=\'8\'>");$("#B").s(G)}}n{3(o.1Y("B")===M){$("v").q("<4 5=\'B\'><4 5=\'8\'>");$("#B").s(G)}}3(1K()){$("#B").1J("2B")}n{$("#B").1J("2z")}3(d===M){d=""}$("v").q("<4 5=\'K\'><1I L=\'"+1w.L+"\' />");$(\'#K\').2y();6 h;3(f.O("?")!==-1){h=f.3l(0,f.O("?"))}n{h=f}6 i=/\\.2s$|\\.2q$|\\.2m$|\\.2l$|\\.2k$/;6 j=h.1C().2h(i);3(j==\'.2s\'||j==\'.2q\'||j==\'.2m\'||j==\'.2l\'||j==\'.2k\'){1D="";1G="";14="";1z="";1x="";R="";1n="";1r=P;3(g){E=$("a[@1N="+g+"]").36();25(D=0;((D&1d;&1d;2T &2R;"}n{1D=E[D].Q;1G=E[D].u;14="<1e 5=\'1U\'>&1d;&1d;&2O; 2N"}}n{1r=1b;1n="1t "+(D+1)+" 2L "+(E.1c)}}}S=1p 1t();S.1g=9(){S.1g=M;6 a=2x();6 x=a[0]-1M;6 y=a[1]-1M;6 b=S.z;6 c=S.A;3(b>x){c=c*(x/b);b=x;3(c>y){b=b*(y/c);c=y}}n 3(c>y){b=b*(y/c);c=y;3(b>x){c=c*(x/b);b=x}}13=b+30;1a=c+2G;$("#8").q("<1I 5=\'2F\' L=\'"+f+"\' z=\'"+b+"\' A=\'"+c+"\' 23=\'"+d+"\'/>"+"<4 5=\'2D\'>"+d+"<4 5=\'2C\'>"+1n+14+R+"<4 5=\'2A\'>1l 1k 1j 1s");$("#Z").s(G);3(!(14==="")){9 12(){3($(o).N("s",12)){$(o).N("s",12)}$("#8").C();$("v").q("<4 5=\'8\'>");19(1D,1G,g);H P}$("#1U").s(12)}3(!(R==="")){9 1i(){$("#8").C();$("v").q("<4 5=\'8\'>");19(1z,1x,g);H P}$("#1X").s(1i)}o.1h=9(e){3(e==M){I=2w.2v}n{I=e.2u}3(I==27){G()}n 3(I==3k){3(!(R=="")){o.1h="";1i()}}n 3(I==3j){3(!(14=="")){o.1h="";12()}}};16();$("#K").C();$("#1L").s(G);$("#8").r({Y:"T"})};S.L=f}n{6 l=f.2r(/^[^\\?]+\\??/,\'\');6 m=2p(l);13=(m[\'z\']*1)+30||3h;1a=(m[\'A\']*1)+3g||3f;W=13-30;V=1a-3e;3(f.O(\'2j\')!=-1){1E=f.1B(\'3d\');$("#15").C();3(m[\'1A\']!="1b"){$("#8").q("<4 5=\'2f\'><4 5=\'1H\'>"+d+"<4 5=\'2e\'>1l 1k 1j 1s ")}n{$("#B").N();$("#8").q(" ")}}n{3($("#8").r("Y")!="T"){3(m[\'1A\']!="1b"){$("#8").q("<4 5=\'2f\'><4 5=\'1H\'>"+d+"<4 5=\'2e\'>1l 1k 1j 1s<4 5=\'F\' J=\'z:"+W+"p;A:"+V+"p\'>")}n{$("#B").N();$("#8").q("<4 5=\'F\' 3c=\'3b\' J=\'z:"+W+"p;A:"+V+"p;\'>")}}n{$("#F")[0].J.z=W+"p";$("#F")[0].J.A=V+"p";$("#F")[0].3a=0;$("#1H").11(d)}}$("#Z").s(G);3(f.O(\'37\')!=-1){$("#F").q($(\'#\'+m[\'26\']).1T());$("#8").24(9(){$(\'#\'+m[\'26\']).q($("#F").1T())});16();$("#K").C();$("#8").r({Y:"T"})}n 3(f.O(\'2j\')!=-1){16();3($.1q.35){$("#K").C();$("#8").r({Y:"T"})}}n{$("#F").34(f+="&1y="+(1p 33().32()),9(){16();$("#K").C();1u("#F a.18");$("#8").r({Y:"T"})})}}3(!m[\'1A\']){o.21=9(e){3(e==M){I=2w.2v}n{I=e.2u}3(I==27){G()}}}}31(e){}}9 1m(){$("#K").C();$("#8").r({Y:"T"})}9 G(){$("#2Y").N("s");$("#Z").N("s");$("#8").2X("2W",9(){$(\'#8,#B,#1F\').2V("24").N().C()});$("#K").C();3(2t o.v.J.2i=="2g"){$("v","11").r({A:"1Z",z:"1Z"});$("11").r("22","")}o.1h="";o.21="";H P}9 16(){$("#8").r({2U:\'-\'+20((13/2),10)+\'p\',z:13+\'p\'});3(!(1V.1q.2Q&&1V.1q.2P<7)){$("#8").r({38:\'-\'+20((1a/2),10)+\'p\'})}}9 2p(a){6 b={};3(!a){H b}6 c=a.1B(/[;&]/);25(6 i=0;i - - - - - - - File: authentication.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Mon Aug 29 14:56:39 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2009-2011 Alex Legler <a3li@gentoo.org>
      -Copyright (C) 2009 Pierre-Yves Rofes <py@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/lib/authorization_rb.html b/doc/app/lib/authorization_rb.html deleted file mode 100644 index 8222750..0000000 --- a/doc/app/lib/authorization_rb.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - File: authorization.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Sun Sep 04 11:11:44 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2011 Alex Legler <a3li@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/lib/bugzilla/bug_rb.html b/doc/app/lib/bugzilla/bug_rb.html deleted file mode 100644 index ad18c96..0000000 --- a/doc/app/lib/bugzilla/bug_rb.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - File: bug.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Mon Aug 29 14:56:39 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2010 Alex Legler <a3li@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/lib/bugzilla/comment_rb.html b/doc/app/lib/bugzilla/comment_rb.html deleted file mode 100644 index 2baf141..0000000 --- a/doc/app/lib/bugzilla/comment_rb.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - File: comment.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Sun Aug 14 14:43:15 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2010 Alex Legler <a3li@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/lib/bugzilla/history_rb.html b/doc/app/lib/bugzilla/history_rb.html deleted file mode 100644 index 76ba5e4..0000000 --- a/doc/app/lib/bugzilla/history_rb.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - File: history.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Mon Aug 29 14:56:39 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      Encapsulates a bug’s history

      - -
      - -
      - - - diff --git a/doc/app/lib/bugzilla_rb.html b/doc/app/lib/bugzilla_rb.html deleted file mode 100644 index bb45e7b..0000000 --- a/doc/app/lib/bugzilla_rb.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - File: bugzilla.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Thu Sep 01 20:47:04 +0200 2011
      - - -
      Requires
      -
      -
        - -
      • nokogiri
      • - -
      • fastercsv
      • - -
      • fileutils
      • - -
      • xmlrpc/client
      • - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2009-2011 Alex Legler <a3li@gentoo.org>
      -Copyright (C) 2009 Pierre-Yves Rofes <py@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/lib/glsamaker/bugs_rb.html b/doc/app/lib/glsamaker/bugs_rb.html deleted file mode 100644 index 134ea71..0000000 --- a/doc/app/lib/glsamaker/bugs_rb.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - File: bugs.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Sun Aug 14 14:43:15 +0200 2011
      - - -
      Requires
      -
      -
        - -
      • bugzilla
      • - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2009-2011 Alex Legler <a3li@gentoo.org>
      -Copyright (C) 2009 Pierre-Yves Rofes <py@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/lib/glsamaker/diff_rb.html b/doc/app/lib/glsamaker/diff_rb.html deleted file mode 100644 index 540bf62..0000000 --- a/doc/app/lib/glsamaker/diff_rb.html +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - File: diff.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Sun Aug 14 14:43:15 +0200 2011
      - - -
      Requires
      -
      -
        - -
      • diff/lcs
      • - -
      • diff/lcs/hunk
      • - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2009-2011 Alex Legler <a3li@gentoo.org>
      -Copyright (C) 2009 Pierre-Yves Rofes <py@gentoo.org>
      -Copyright (C) 2006-2007 Jean-Philippe Lang
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/lib/glsamaker/helpers_rb.html b/doc/app/lib/glsamaker/helpers_rb.html deleted file mode 100644 index 6653b3f..0000000 --- a/doc/app/lib/glsamaker/helpers_rb.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - File: helpers.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Sun Aug 14 14:43:15 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2010 Alex Legler <a3li@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/lib/glsamaker/http_rb.html b/doc/app/lib/glsamaker/http_rb.html deleted file mode 100644 index c05c5cb..0000000 --- a/doc/app/lib/glsamaker/http_rb.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - File: http.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Sun Aug 14 14:43:15 +0200 2011
      - - -
      Requires
      -
      -
        - -
      • net/http
      • - -
      • net/https
      • - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2009-2011 Alex Legler <a3li@gentoo.org>
      -Copyright (C) 2009 Pierre-Yves Rofes <py@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/lib/glsamaker/mail_rb.html b/doc/app/lib/glsamaker/mail_rb.html deleted file mode 100644 index a16f0ba..0000000 --- a/doc/app/lib/glsamaker/mail_rb.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - File: mail.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Mon Aug 29 14:56:39 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2010-11 Alex Legler <a3li@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/lib/glsamaker/portage_rb.html b/doc/app/lib/glsamaker/portage_rb.html deleted file mode 100644 index d81a4e6..0000000 --- a/doc/app/lib/glsamaker/portage_rb.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - File: portage.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Sun Aug 14 14:43:15 +0200 2011
      - - -
      Requires
      -
      -
        - -
      • nokogiri
      • - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2009-2011 Alex Legler <a3li@gentoo.org>
      -Copyright (C) 2009 Pierre-Yves Rofes <py@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/lib/glsamaker/xml_rb.html b/doc/app/lib/glsamaker/xml_rb.html deleted file mode 100644 index 20be518..0000000 --- a/doc/app/lib/glsamaker/xml_rb.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - File: xml.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Sun Aug 14 14:43:15 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2010 Alex Legler <a3li@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/lib/glsamaker_rb.html b/doc/app/lib/glsamaker_rb.html deleted file mode 100644 index f5cdde0..0000000 --- a/doc/app/lib/glsamaker_rb.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - File: glsamaker.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Sun Aug 14 14:43:15 +0200 2011
      - - -
      Requires
      -
      -
        - -
      • glsamaker/http
      • - -
      • glsamaker/portage
      • - -
      • glsamaker/diff
      • - -
      • glsamaker/xml
      • - -
      • glsamaker/bugs
      • - -
      • glsamaker/mail
      • - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2009-2011 Alex Legler <a3li@gentoo.org>
      -Copyright (C) 2009 Pierre-Yves Rofes <py@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/lib/tasks/utils_rb.html b/doc/app/lib/tasks/utils_rb.html deleted file mode 100644 index 045a833..0000000 --- a/doc/app/lib/tasks/utils_rb.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - File: utils.rb [GLSAMaker 2] - - - - - - - - - - -
      -
      -
      Last Modified
      -
      Sun Aug 14 14:43:15 +0200 2011
      - - -
      Requires
      -
      -
        - -
      -
      - - - -
      -
      - -
      - -
      -

      Description

      - -

      GLSAMaker v2

      - -
      Copyright (C) 2009-2011 Alex Legler <a3li@gentoo.org>
      -Copyright (C) 2009 Pierre-Yves Rofes <py@gentoo.org>
      - -

      This program is free software: you can redistribute it and/or modify it -under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at your -option) any later version.

      - -

      For more information, see the LICENSE file.

      - -
      - -
      - - - diff --git a/doc/app/rdoc.css b/doc/app/rdoc.css deleted file mode 100644 index ea91421..0000000 --- a/doc/app/rdoc.css +++ /dev/null @@ -1,763 +0,0 @@ -/* - * "Darkfish" Rdoc CSS - * $Id: rdoc.css 54 2009-01-27 01:09:48Z deveiant $ - * - * Author: Michael Granger - * - */ - -/* Base Green is: #6C8C22 */ - -*{ padding: 0; margin: 0; } - -body { - background: #efefef; - font: 14px "Helvetica Neue", Helvetica, Tahoma, sans-serif; -} -body.class, body.module, body.file { - margin-left: 40px; -} -body.file-popup { - font-size: 90%; - margin-left: 0; -} - -h1 { - font-size: 300%; - text-shadow: rgba(135,145,135,0.65) 2px 2px 3px; - color: #6C8C22; -} -h2,h3,h4 { margin-top: 1.5em; } - -:link, -:visited { - color: #6C8C22; - text-decoration: none; -} -:link:hover, -:visited:hover { - border-bottom: 1px dotted #6C8C22; -} - -pre { - background: #ddd; - padding: 0.5em 0; -} - - -/* @group Generic Classes */ - -.initially-hidden { - display: none; -} - -.quicksearch-field { - width: 98%; - background: #ddd; - border: 1px solid #aaa; - height: 1.5em; - -webkit-border-radius: 4px; -} -.quicksearch-field:focus { - background: #f1edba; -} - -.missing-docs { - font-size: 120%; - background: white url(images/wrench_orange.png) no-repeat 4px center; - color: #ccc; - line-height: 2em; - border: 1px solid #d00; - opacity: 1; - padding-left: 20px; - text-indent: 24px; - letter-spacing: 3px; - font-weight: bold; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; -} - -.target-section { - border: 2px solid #dcce90; - border-left-width: 8px; - padding: 0 1em; - background: #fff3c2; -} - -/* @end */ - - -/* @group Index Page, Standalone file pages */ -body.indexpage { - margin: 1em 3em; -} -body.indexpage p, -body.indexpage div, -body.file p { - margin: 1em 0; -} - -.indexpage .rdoc-list p, .file .rdoc-list p { - margin: 0em 0; -} - -.indexpage ol, -.file #documentation ol { - line-height: 160%; -} - -.indexpage ul, -.file #documentation ul { - line-height: 160%; - list-style: none; -} -.indexpage ul :link, -.indexpage ul :visited { - font-size: 16px; -} - -.indexpage li, -.file #documentation li { - padding-left: 20px; -} - -.indexpage ol, -.file #documentation ol { - margin-left: 20px; -} - -.indexpage ol > li, -.file #documentation ol > li { - padding-left: 0; -} - -.indexpage ul > li, -.file #documentation ul > li { - background: url(images/bullet_black.png) no-repeat left 4px; -} -.indexpage li.module { - background: url(images/package.png) no-repeat left 4px; -} -.indexpage li.class { - background: url(images/ruby.png) no-repeat left 4px; -} -.indexpage li.file { - background: url(images/page_white_text.png) no-repeat left 4px; -} -.file li p, -.indexpage li p { - margin: 0 0; -} - -/* @end */ - -/* @group Top-Level Structure */ - -.class #metadata, -.file #metadata, -.module #metadata { - float: left; - width: 260px; -} - -.class #documentation, -.file #documentation, -.module #documentation { - margin: 2em 1em 5em 300px; - min-width: 340px; -} - -.file #metadata { - margin: 0.8em; -} - -#validator-badges { - clear: both; - margin: 1em 1em 2em; -} - -/* @end */ - -/* @group Metadata Section */ -#metadata .section { - background-color: #dedede; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - border: 1px solid #aaa; - margin: 0 8px 16px; - font-size: 90%; - overflow: hidden; -} -#metadata h3.section-header { - margin: 0; - padding: 2px 8px; - background: #ccc; - color: #666; - -moz-border-radius-topleft: 4px; - -moz-border-radius-topright: 4px; - -webkit-border-top-left-radius: 4px; - -webkit-border-top-right-radius: 4px; - border-bottom: 1px solid #aaa; -} -#metadata #home-section h3.section-header { - border-bottom: 0; -} - -#metadata ul, -#metadata dl, -#metadata p { - padding: 8px; - list-style: none; -} - -#file-metadata ul { - padding-left: 28px; - list-style-image: url(images/page_green.png); -} - -dl.svninfo { - color: #666; - margin: 0; -} -dl.svninfo dt { - font-weight: bold; -} - -ul.link-list li { - white-space: nowrap; -} -ul.link-list .type { - font-size: 8px; - text-transform: uppercase; - color: white; - background: #969696; - padding: 2px 4px; - -webkit-border-radius: 5px; -} - -/* @end */ - - -/* @group Project Metadata Section */ -#project-metadata { - margin-top: 3em; -} - -.file #project-metadata { - margin-top: 0em; -} - -#project-metadata .section { - border: 1px solid #aaa; -} -#project-metadata h3.section-header { - border-bottom: 1px solid #aaa; - position: relative; -} -#project-metadata h3.section-header .search-toggle { - position: absolute; - right: 5px; -} - - -#project-metadata form { - color: #777; - background: #ccc; - padding: 8px 8px 16px; - border-bottom: 1px solid #bbb; -} -#project-metadata fieldset { - border: 0; -} - -#no-class-search-results { - margin: 0 auto 1em; - text-align: center; - font-size: 14px; - font-weight: bold; - color: #aaa; -} - -/* @end */ - - -/* @group Documentation Section */ -.description { - font-size: 100%; - color: #333; -} - -.description p { - margin: 1em 0.4em; -} - -.description li p { - margin: 0; -} - -.description ul { - margin-left: 1.5em; -} -.description ul li { - line-height: 1.4em; -} - -.description dl, -#documentation dl { - margin: 8px 1.5em; - border: 1px solid #ccc; -} -.description dl { - font-size: 14px; -} - -.description dt, -#documentation dt { - padding: 2px 4px; - font-weight: bold; - background: #ddd; -} -.description dd, -#documentation dd { - padding: 2px 12px; -} -.description dd + dt, -#documentation dd + dt { - margin-top: 0.7em; -} - -#documentation .section { - font-size: 90%; -} - -#documentation h2.section-header { - margin-top: 2em; - padding: 0.75em 0.5em; - background: #ccc; - color: #333; - font-size: 175%; - border: 1px solid #bbb; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; -} - -#documentation h3.section-header { - margin-top: 2em; - padding: 0.25em 0.5em; - background-color: #dedede; - color: #333; - font-size: 150%; - border: 1px solid #bbb; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; -} - -#constants-list > dl, -#attributes-list > dl { - margin: 1em 0 2em; - border: 0; -} -#constants-list > dl dt, -#attributes-list > dl dt { - padding-left: 0; - font-weight: bold; - font-family: Monaco, "Andale Mono"; - background: inherit; -} -#constants-list > dl dt a, -#attributes-list > dl dt a { - color: inherit; -} -#constants-list > dl dd, -#attributes-list > dl dd { - margin: 0 0 1em 0; - padding: 0; - color: #666; -} - -.documentation-section h2 { - position: relative; -} - -.documentation-section h2 a { - position: absolute; - top: 8px; - right: 10px; - font-size: 12px; - color: #9b9877; - visibility: hidden; -} - -.documentation-section h2:hover a { - visibility: visible; -} - -/* @group Method Details */ - -#documentation .method-source-code { - display: none; -} - -#documentation .method-detail { - margin: 0.5em 0; - padding: 0.5em 0; - cursor: pointer; -} -#documentation .method-detail:hover { - background-color: #f1edba; -} -#documentation .method-heading { - position: relative; - padding: 2px 4px 0 20px; - font-size: 125%; - font-weight: bold; - color: #333; - background: url(images/brick.png) no-repeat left bottom; -} -#documentation .method-heading :link, -#documentation .method-heading :visited { - color: inherit; -} -#documentation .method-click-advice { - position: absolute; - top: 2px; - right: 5px; - font-size: 10px; - color: #9b9877; - visibility: hidden; - padding-right: 20px; - line-height: 20px; - background: url(images/zoom.png) no-repeat right top; -} -#documentation .method-detail:hover .method-click-advice { - visibility: visible; -} - -#documentation .method-alias .method-heading { - color: #666; - background: url(images/brick_link.png) no-repeat left bottom; -} - -#documentation .method-description, -#documentation .aliases { - margin: 0 20px; - color: #666; -} - -#documentation .method-description p, -#documentation .aliases p { - line-height: 1.2em; -} - -#documentation .aliases { - padding-top: 4px; - font-style: italic; - cursor: default; -} -#documentation .method-description p { - padding: 0; -} -#documentation .method-description p + p { - margin-bottom: 0.5em; -} -#documentation .method-description ul { - margin-left: 1.5em; -} - -#documentation .attribute-method-heading { - background: url(images/tag_green.png) no-repeat left bottom; -} -#documentation #attribute-method-details .method-detail:hover { - background-color: transparent; - cursor: default; -} -#documentation .attribute-access-type { - font-size: 60%; - text-transform: uppercase; - vertical-align: super; - padding: 0 2px; -} -/* @end */ - -/* @end */ - - - -/* @group Source Code */ - -div.method-source-code { - background: #262626; - color: #efefef; - margin: 1em; - padding: 0.5em; - border: 1px dashed #999; - overflow: hidden; -} - -div.method-source-code pre { - background: inherit; - padding: 0; - color: white; - overflow: auto; -} - -/* @group Ruby keyword styles */ - -.ruby-constant { color: #7fffd4; background: transparent; } -.ruby-keyword { color: #00ffff; background: transparent; } -.ruby-ivar { color: #eedd82; background: transparent; } -.ruby-operator { color: #00ffee; background: transparent; } -.ruby-identifier { color: #ffdead; background: transparent; } -.ruby-node { color: #ffa07a; background: transparent; } -.ruby-comment { color: #b22222; font-weight: bold; background: transparent; } -.ruby-regexp { color: #ffa07a; background: transparent; } -.ruby-value { color: #7fffd4; background: transparent; } - -/* @end */ -/* @end */ - - -/* @group File Popup Contents */ - -.file #metadata, -.file-popup #metadata { -} - -.file-popup dl { - font-size: 80%; - padding: 0.75em; - background-color: #dedede; - color: #333; - border: 1px solid #bbb; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; -} -.file dt { - font-weight: bold; - padding-left: 22px; - line-height: 20px; - background: url(images/page_white_width.png) no-repeat left top; -} -.file dt.modified-date { - background: url(images/date.png) no-repeat left top; -} -.file dt.requires { - background: url(images/plugin.png) no-repeat left top; -} -.file dt.scs-url { - background: url(images/wrench.png) no-repeat left top; -} - -.file dl dd { - margin: 0 0 1em 0; -} -.file #metadata dl dd ul { - list-style: circle; - margin-left: 20px; - padding-top: 0; -} -.file #metadata dl dd ul li { -} - - -.file h2 { - margin-top: 2em; - padding: 0.75em 0.5em; - background-color: #dedede; - color: #333; - font-size: 120%; - border: 1px solid #bbb; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; -} - -/* @end */ - - - - -/* @group ThickBox Styles */ -#TB_window { - font: 12px Arial, Helvetica, sans-serif; - color: #333333; -} - -#TB_secondLine { - font: 10px Arial, Helvetica, sans-serif; - color:#666666; -} - -#TB_window :link, -#TB_window :visited { color: #666666; } -#TB_window :link:hover, -#TB_window :visited:hover { color: #000; } -#TB_window :link:active, -#TB_window :visited:active { color: #666666; } -#TB_window :link:focus, -#TB_window :visited:focus { color: #666666; } - -#TB_overlay { - position: fixed; - z-index:100; - top: 0px; - left: 0px; - height:100%; - width:100%; -} - -.TB_overlayMacFFBGHack {background: url(images/macFFBgHack.png) repeat;} -.TB_overlayBG { - background-color:#000; - filter:alpha(opacity=75); - -moz-opacity: 0.75; - opacity: 0.75; -} - -* html #TB_overlay { /* ie6 hack */ - position: absolute; - height: expression(document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + 'px'); -} - -#TB_window { - position: fixed; - background: #ffffff; - z-index: 102; - color:#000000; - display:none; - border: 4px solid #525252; - text-align:left; - top:50%; - left:50%; -} - -* html #TB_window { /* ie6 hack */ - position: absolute; - margin-top: expression(0 - parseInt(this.offsetHeight / 2) + (TBWindowMargin = document.documentElement && document.documentElement.scrollTop || document.body.scrollTop) + 'px'); -} - -#TB_window img#TB_Image { - display:block; - margin: 15px 0 0 15px; - border-right: 1px solid #ccc; - border-bottom: 1px solid #ccc; - border-top: 1px solid #666; - border-left: 1px solid #666; -} - -#TB_caption{ - height:25px; - padding:7px 30px 10px 25px; - float:left; -} - -#TB_closeWindow{ - height:25px; - padding:11px 25px 10px 0; - float:right; -} - -#TB_closeAjaxWindow{ - padding:7px 10px 5px 0; - margin-bottom:1px; - text-align:right; - float:right; -} - -#TB_ajaxWindowTitle{ - float:left; - padding:7px 0 5px 10px; - margin-bottom:1px; - font-size: 22px; -} - -#TB_title{ - background-color: #6C8C22; - color: #dedede; - height:40px; -} -#TB_title :link, -#TB_title :visited { - color: white !important; - border-bottom: 1px dotted #dedede; -} - -#TB_ajaxContent{ - clear:both; - padding:2px 15px 15px 15px; - overflow:auto; - text-align:left; - line-height:1.4em; -} - -#TB_ajaxContent.TB_modal{ - padding:15px; -} - -#TB_ajaxContent p{ - padding:5px 0px 5px 0px; -} - -#TB_load{ - position: fixed; - display:none; - height:13px; - width:208px; - z-index:103; - top: 50%; - left: 50%; - margin: -6px 0 0 -104px; /* -height/2 0 0 -width/2 */ -} - -* html #TB_load { /* ie6 hack */ - position: absolute; - margin-top: expression(0 - parseInt(this.offsetHeight / 2) + (TBWindowMargin = document.documentElement && document.documentElement.scrollTop || document.body.scrollTop) + 'px'); -} - -#TB_HideSelect{ - z-index:99; - position:fixed; - top: 0; - left: 0; - background-color:#fff; - border:none; - filter:alpha(opacity=0); - -moz-opacity: 0; - opacity: 0; - height:100%; - width:100%; -} - -* html #TB_HideSelect { /* ie6 hack */ - position: absolute; - height: expression(document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + 'px'); -} - -#TB_iframeContent{ - clear:both; - border:none; - margin-bottom:-1px; - margin-top:1px; - _margin-bottom:1px; -} - -/* @end */ - -/* @group Debugging Section */ - -#debugging-toggle { - text-align: center; -} -#debugging-toggle img { - cursor: pointer; -} - -#rdoc-debugging-section-dump { - display: none; - margin: 0 2em 2em; - background: #ccc; - border: 1px solid #999; -} - - - -/* @end */ diff --git a/doc/diagrams/models.dot b/doc/diagrams/models.dot deleted file mode 100644 index 75607f6..0000000 --- a/doc/diagrams/models.dot +++ /dev/null @@ -1,18 +0,0 @@ -digraph models_diagram { - graph[overlap=false, splines=true] - "Bug" [shape=Mrecord, label="{Bug|title :text\lcreated_at :datetime\lupdated_at :datetime\l}"] - "Comment" [shape=Mrecord, label="{Comment|text :text\lread :boolean\lcreated_at :datetime\lupdated_at :datetime\l}"] - "Glsa" [shape=Mrecord, label="{Glsa|requester :integer\lsubmitter :integer\lbugreadymaker :integer\lstatus :string\lrestricted :boolean\lcreated_at :datetime\lupdated_at :datetime\l}"] - "Reference" [shape=Mrecord, label="{Reference|title :text\lurl :text\lcreated_at :datetime\lupdated_at :datetime\l}"] - "Revision" [shape=Mrecord, label="{Revision|revid :integer\ltitle :string\laccess :string\lproduct :string\lcategory :string\lseverity :string\lsynopsis :text\lbackground :text\ldescription :text\limpact :text\lworkaround :text\lresolution :text\lcreated_at :datetime\lupdated_at :datetime\l}"] - "User" [shape=Mrecord, label="{User|login :string\lname :string\lemail :string\ldisabled :boolean\lpreferences :text\laccess :integer\lcreated_at :datetime\lupdated_at :datetime\l}"] - "Glsa" -> "Comment" [arrowtail=crow, arrowhead=dot, dir=both] - "Glsa" -> "Revision" [arrowtail=crow, arrowhead=dot, dir=both] - "Revision" -> "Bug" [arrowtail=crow, arrowhead=dot, dir=both] - "Revision" -> "Reference" [arrowtail=crow, arrowhead=dot, dir=both] - "User" -> "Glsa" [label="requested_glsas", arrowtail=crow, arrowhead=dot, dir=both] - "User" -> "Revision" [arrowtail=crow, arrowhead=dot, dir=both] - "User" -> "Glsa" [label="bugreadymade_glsas", arrowtail=crow, arrowhead=dot, dir=both] - "User" -> "Permission" [arrowtail=crow, arrowhead=crow, dir=both] - "User" -> "Glsa" [label="submitted_glsas", arrowtail=crow, arrowhead=dot, dir=both] -} diff --git a/doc/diagrams/models.png b/doc/diagrams/models.png deleted file mode 100644 index bec604c..0000000 Binary files a/doc/diagrams/models.png and /dev/null differ diff --git a/docker-compose.override.yml b/docker-compose.override.yml new file mode 100644 index 0000000..601cf97 --- /dev/null +++ b/docker-compose.override.yml @@ -0,0 +1,60 @@ +version: '3.7' + +services: + http-serving: + build: + context: . + dockerfile: Dockerfile.dev + volumes: + - type: "bind" + source: "/var/log/glsamaker" + target: "/var/log/glsamaker" + - type: "bind" + source: "." + target: "/go/src/glsamaker" + environment: + GLSAMAKER_LOG_FILE: '/var/log/glsamaker/web.log' + ports: + - 127.0.0.1:5000:5000 + command: "tail -f /dev/null" + depends_on: + - db + updater: + build: + context: . + dockerfile: Dockerfile.dev + volumes: + - type: "bind" + source: "." + target: "/go/src/glsamaker" + - type: "bind" + source: "/var/log/glsamaker" + target: "/var/log/glsamaker" + environment: + GLSAMAKER_LOG_FILE: '/var/log/glsamaker/updater.log' + command: "tail -f /dev/null" + depends_on: + - db + db: + image: postgres:12 + restart: always + environment: + POSTGRES_USER: ${GLSAMAKER_POSTGRES_USER:-root} + POSTGRES_PASSWORD: ${GLSAMAKER_POSTGRES_PASSWORD:-root} + POSTGRES_DB: ${GLSAMAKER_POSTGRES_DB:-glsamaker} + volumes: + - pgdata:/var/lib/postgresql/data + pgadmin: + image: dpage/pgadmin4 + environment: + PGADMIN_DEFAULT_EMAIL: admin@admin.org + PGADMIN_DEFAULT_PASSWORD: admin + volumes: + - pgadmin:/root/.pgadmin + ports: + - "5050:80" + restart: unless-stopped + +volumes: + pgdata: + pgadmin: diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..4ce6b2b --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,55 @@ +version: '3.7' + +services: + http-serving: + image: ${GLSAMAKER_IMAGE:-gentoo/glsamaker:latest} + volumes: + - type: "bind" + source: "/var/log/glsamaker" + target: "/var/log/glsamaker" + ports: + - 127.0.0.1:5000:5000 + labels: + com.centurylinklabs.watchtower.enable: "true" + restart: always + environment: + GLSAMAKER_LOG_FILE: '/var/log/glsamaker/web.log' + command: "/go/src/glsamaker/bin/glsamaker --serve" + depends_on: + - db + updater: + image: ${GLSAMAKER_IMAGE:-gentoo/glsamaker:latest} + volumes: + - type: "bind" + source: "/var/log/glsamaker" + target: "/var/log/glsamaker" + labels: + com.centurylinklabs.watchtower.enable: "true" + environment: + GLSAMAKER_LOG_FILE: '/var/log/glsamaker/updater.log' + command: "/go/src/glsamaker/bin/glsamaker --full-update" + depends_on: + - db + db: + image: postgres:12 + restart: always + environment: + POSTGRES_USER: ${GLSAMAKER_POSTGRES_USER:-root} + POSTGRES_PASSWORD: ${GLSAMAKER_POSTGRES_PASSWORD:-root} + POSTGRES_DB: ${GLSAMAKER_POSTGRES_DB:-glsamaker} + volumes: + - ${GLSAMAKER_POSTGRES_DATA_PATH:-/var/lib/postgresql/data}:/var/lib/postgresql/data + watchtower: + image: containrrr/watchtower:0.3.10 + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - /root/.docker/config.json:/config.json + command: --label-enable + pgadmin: + image: dpage/pgadmin4 + environment: + PGADMIN_DEFAULT_EMAIL: admin@admin.org + PGADMIN_DEFAULT_PASSWORD: admin + ports: + - "5050:80" + restart: unless-stopped diff --git a/glsamaker.go b/glsamaker.go new file mode 100644 index 0000000..5c7f6ec --- /dev/null +++ b/glsamaker.go @@ -0,0 +1,60 @@ +package main + +import ( + "glsamaker/pkg/app" + "glsamaker/pkg/config" + "glsamaker/pkg/cveimport" + "glsamaker/pkg/logger" + "fmt" + "io" + "io/ioutil" + "os" + "time" +) + +func printHelp() { + fmt.Println("Please specific one of the following options:") + fmt.Println(" glsamaker --update -- incrementally import cve's and update the database") + fmt.Println(" glsamaker --full-update -- import all cve's and update the database") + fmt.Println(" glsamaker --serve -- serve the application") +} + +func isCommand(command string) bool { + return len(os.Args) > 1 && os.Args[1] == command +} + +func main() { + + waitForPostgres() + + errorLogFile := logger.CreateLogFile(config.LogFile()) + defer errorLogFile.Close() + initLoggers(os.Stdout, errorLogFile) + + if isCommand("--serve") { + app.Serve() + } else if isCommand("--full-update") { + cveimport.FullUpdate() + } else if isCommand("--update") { + cveimport.Update() + } else { + printHelp() + } + +} + +// initialize the loggers depending on whether +// config.debug is set to true +func initLoggers(infoHandler io.Writer, errorHandler io.Writer) { + if config.Debug() == "true" { + logger.Init(os.Stdout, infoHandler, errorHandler) + } else { + logger.Init(ioutil.Discard, infoHandler, errorHandler) + } +} + +// TODO this has to be solved differently +// wait for postgres to come up +func waitForPostgres() { + time.Sleep(5 * time.Second) +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..fa4821f --- /dev/null +++ b/go.mod @@ -0,0 +1,13 @@ +module glsamaker + +go 1.13 + +require ( + github.com/duo-labs/webauthn v0.0.0-20200131223046-0864f70a0509 + github.com/duo-labs/webauthn.io v0.0.0-20191119211219-328048ff6814 + github.com/go-pg/pg/v9 v9.1.3 + github.com/google/uuid v1.1.1 + github.com/pquerna/otp v1.2.0 + github.com/skip2/go-qrcode v0.0.0-20191027152451-9434209cb086 + golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..61ce03c --- /dev/null +++ b/go.sum @@ -0,0 +1,739 @@ +bitbucket.org/liamstask/goose v0.0.0-20150115234039-8488cc47d90c/go.mod h1:hSVuE3qU7grINVSwrmzHfpg9k87ALBk+XaualNyUzI4= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +contrib.go.opencensus.io/exporter/stackdriver v0.12.1/go.mod h1:iwB6wGarfphGGe/e5CWqyUk/cLzKnWsOKPVW3no6OTw= +contrib.go.opencensus.io/resource v0.1.1/go.mod h1:F361eGI91LCmW1I/Saf+rX0+OFcigGlFvXwEGEnkRLA= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= +github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OpenPeeDeeP/depguard v1.0.0/go.mod h1:7/4sitnI9YlQgTLLk734QlzXT8DuHVnAyztLplQjk+o= +github.com/OpenPeeDeeP/depguard v1.0.1 h1:VlW4R6jmBIv3/u1JNlawEvJMM4J+dPORPaZasQee8Us= +github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412/go.mod h1:WPjqKcmVOxf0XSf3YxCJs6N6AOSrOx3obionmG7T0y0= +github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/aws/aws-sdk-go v1.19.18/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bombsimon/wsl v1.2.5/go.mod h1:43lEF/i0kpXbLCeDXL9LMT8c92HyBywXb0AsgMHYngM= +github.com/bombsimon/wsl v1.2.8 h1:b+E/W7koicKBZDU+vEsw/hnQTN8026Gv1eMZDLUU/Wc= +github.com/bombsimon/wsl v1.2.8/go.mod h1:43lEF/i0kpXbLCeDXL9LMT8c92HyBywXb0AsgMHYngM= +github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc h1:biVzkmvwrH8WK8raXaxBx6fRVTlJILwEwQGL1I/ByEI= +github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/certifi/gocertifi v0.0.0-20180118203423-deb3ae2ef261/go.mod h1:GJKEexRPVJrBSOjoqN5VNOIKJ5Q3RViH6eu3puDRwx4= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tjxl5dIMyVM= +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/backoff v0.0.0-20161212185259-647f3cdfc87a/go.mod h1:rzgs2ZOiguV6/NpiDgADjRLPNyZlApIWxKpkT+X8SdY= +github.com/cloudflare/cfssl v0.0.0-20190726000631-633726f6bcb7 h1:Puu1hUwfps3+1CUzYdAZXijuvLuRMirgiXdf3zsM2Ig= +github.com/cloudflare/cfssl v0.0.0-20190726000631-633726f6bcb7/go.mod h1:yMWuSON2oQp+43nFtAV/uvKQIFpSPerB57DCt9t8sSA= +github.com/cloudflare/cfssl v1.4.1 h1:vScfU2DrIUI9VPHBVeeAQ0q5A+9yshO1Gz+3QoUQiKw= +github.com/cloudflare/cfssl v1.4.1/go.mod h1:KManx/OJPb5QY+y0+o/898AMcM128sF0bURvoVUSjTo= +github.com/cloudflare/go-metrics v0.0.0-20151117154305-6a9aea36fb41/go.mod h1:eaZPlJWD+G9wseg1BuRXlHnjntPMrywMsyxf+LTOdP4= +github.com/cloudflare/redoctober v0.0.0-20171127175943-746a508df14c/go.mod h1:6Se34jNoqrd8bTxrmJB2Bg2aoZ2CdSXonils9NsiNgo= +github.com/codemodus/kace v0.5.1 h1:4OCsBlE2c/rSJo375ggfnucv9eRzge/U5LrrOZd47HA= +github.com/codemodus/kace v0.5.1/go.mod h1:coddaHoX1ku1YFSe4Ip0mL9kQjJvKkzb9CfIdG1YR04= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/bbolt v1.3.3 h1:n6AiVyVRKQFNb6mJlwESEvvLoDyiTzXX7ORAUlkeBdY= +github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.17+incompatible h1:f/Z3EoDSx1yjaIjLQGo1diYUlQYSBrrAQ5vP8NjwXwo= +github.com/coreos/etcd v3.3.17+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CLnGVd57E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisenkom/go-mssqldb v0.0.0-20190515213511-eb9f6a1743f3/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/duo-labs/webauthn v0.0.0-20191119193225-4bf9a0f776d4/go.mod h1:KR2KScxcZAWdZGOUnsPGjD3ow0cvNfv3WHXC/Xz+d9g= +github.com/duo-labs/webauthn v0.0.0-20200131223046-0864f70a0509 h1:XlqpA/EJNuSPkp6/yl2fCXcsQ/y5uw4GKkVBYmebdnE= +github.com/duo-labs/webauthn v0.0.0-20200131223046-0864f70a0509/go.mod h1:lLEqCfy8LnwEbRr1SrxujNtHadF3cEGY7MmR3vo0s3A= +github.com/duo-labs/webauthn.io v0.0.0-20191119211219-328048ff6814 h1:vlNyR3D4/kNWWD2fQ6Q7WhrB6UwbPivuheitHcPPP1I= +github.com/duo-labs/webauthn.io v0.0.0-20191119211219-328048ff6814/go.mod h1:fAQEHOngvfrn+T6HvMoB/AJ8CMVcCqvk3Ue3JYJshsA= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= +github.com/fatih/color v1.6.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/getsentry/raven-go v0.0.0-20180121060056-563b81fc02b7/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-critic/go-critic v0.3.5-0.20190526074819-1df300866540/go.mod h1:+sE8vrLDS2M0pZkBk0wy6+nLdKexVDrl/jBqQOTDThA= +github.com/go-critic/go-critic v0.3.5-0.20190904082202-d79a9f0c64db h1:GYXWx7Vr3+zv833u+8IoXbNnQY0AdXsxAgI0kX7xcwA= +github.com/go-critic/go-critic v0.3.5-0.20190904082202-d79a9f0c64db/go.mod h1:+sE8vrLDS2M0pZkBk0wy6+nLdKexVDrl/jBqQOTDThA= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-lintpack/lintpack v0.5.2 h1:DI5mA3+eKdWeJ40nU4d6Wc26qmdG8RCi/btYq0TuRN0= +github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= +github.com/go-pg/pg/v9 v9.0.0-beta.14/go.mod h1:T2Sr6bpTCOr2lUqOUMiXLMJqZHSUBKk1LdgSqjwhZfA= +github.com/go-pg/pg/v9 v9.0.3/go.mod h1:Tm/Q3Vt6gdQOH6TTN1H/xLlIXc+Qrka7TZ6uREtu/eA= +github.com/go-pg/pg/v9 v9.1.3 h1:gmE7k5ib45+NcRJBGUDPD/keJGCMqhH7TPqbd9xbdz4= +github.com/go-pg/pg/v9 v9.1.3/go.mod h1:QM13HBLkdml4zcKOfUfGLymM6hb72aKTJLrmaH8rsFg= +github.com/go-pg/urlstruct v0.1.0/go.mod h1:2Nag+BIny6G/KYCkdt++ZnqU/VinzimGapKfs4kwlN0= +github.com/go-pg/urlstruct v0.2.6/go.mod h1:dxENwVISWSOX+k87hDt0ueEJadD+gZWv3tHzwfmZPu8= +github.com/go-pg/urlstruct v0.3.0 h1:ORiTb205uT7v7lvq4VUOQ4ddJ5TjFRlVRWqWsMBgek4= +github.com/go-pg/urlstruct v0.3.0/go.mod h1:/XKyiUOUUS3onjF+LJxbfmSywYAdl6qMfVbX33Q8rgg= +github.com/go-pg/zerochecker v0.1.1 h1:av77Qe7Gs+1oYGGh51k0sbZ0bUaxJEdeP0r8YE64Dco= +github.com/go-pg/zerochecker v0.1.1/go.mod h1:NJZ4wKL0NmTtz0GKCoJ8kym6Xn/EQzXRl2OnAe7MmDo= +github.com/go-sql-driver/mysql v1.3.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g= +github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= +github.com/go-toolsmith/astcopy v1.0.0 h1:OMgl1b1MEpjFQ1m5ztEO06rz5CUd3oBv9RF7+DyvdG8= +github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= +github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astequal v1.0.0 h1:4zxD8j3JRFNyLN46lodQuqz3xdKSrur7U/sr0SDS/gQ= +github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086/go.mod h1:mP93XdblcopXwlyN4X4uodxXQhldPGZbcEJIimQHrkg= +github.com/go-toolsmith/astfmt v1.0.0 h1:A0vDDXt+vsvLEdbMFJAUBI/uTbRw1ffOPnxsILnFL6k= +github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= +github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= +github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30/go.mod h1:SV2ur98SGypH1UjcPpCatrV5hPazG6+IfNHbkDXBRrk= +github.com/go-toolsmith/astp v1.0.0 h1:alXE75TXgcmupDsMK1fRAy0YUzLzqPVvBKoyWV+KPXg= +github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= +github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks= +github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= +github.com/go-toolsmith/strparse v1.0.0 h1:Vcw78DnpCAKlM20kSbAyO4mPfJn/lyYA4BJUDxe2Jb4= +github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= +github.com/go-toolsmith/typep v1.0.0 h1:zKymWyA1TRYvqYrYDrfEMZULyrhcnGY3x7LDKU2XQaA= +github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/gofrs/flock v0.0.0-20190320160742-5135e617513b h1:ekuhfTjngPhisSjOJ0QWKpPQE8/rbknHaes6WVJj5Hw= +github.com/gofrs/flock v0.0.0-20190320160742-5135e617513b/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9 h1:uHTyIjqVhYRhLbJ8nIiOJHkEZZ+5YoOsAbD3sk82NiE= +github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.0.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= +github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= +github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6 h1:YYWNAGTKWhKpcLLt7aSj/odlKrSrelQwlovBpDuf19w= +github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0= +github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613 h1:9kfjN3AdxcbsZBf8NjltjWihK2QfBBBZuv91cMFfDHw= +github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= +github.com/golangci/go-tools v0.0.0-20190318055746-e32c54105b7c/go.mod h1:unzUULGw35sjyOYjUt0jMTXqHlZPpPc6e+xfO4cd6mM= +github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3 h1:pe9JHs3cHHDQgOFXJJdYkK6fLz2PWyYtP4hthoCMvs8= +github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o= +github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= +github.com/golangci/gocyclo v0.0.0-20180528144436-0a533e8fa43d h1:pXTK/gkVNs7Zyy7WKgLXmpQ5bHTrq5GDsp8R9Qs67g0= +github.com/golangci/gocyclo v0.0.0-20180528144436-0a533e8fa43d/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= +github.com/golangci/gofmt v0.0.0-20181222123516-0b8337e80d98/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= +github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a h1:iR3fYXUjHCR97qWS8ch1y9zPNsgXThGwjKPrYfqMPks= +github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= +github.com/golangci/golangci-lint v1.17.2-0.20190910081718-bad04bb7378f/go.mod h1:kaqo8l0OZKYPtjNmG4z4HrWLgcYNIJ9B9q3LWri9uLg= +github.com/golangci/golangci-lint v1.21.0 h1:HxAxpR8Z0M8omihvQdsD3PF0qPjlqYqp2vMJzstoKeI= +github.com/golangci/golangci-lint v1.21.0/go.mod h1:phxpHK52q7SE+5KpPnti4oZTdFCEsn/tKN+nFvCKXfk= +github.com/golangci/gosec v0.0.0-20190211064107-66fb7fc33547/go.mod h1:0qUabqiIQgfmlAmulqxyiGkkyF6/tOGSnY2cnPVwrzU= +github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc h1:gLLhTLMk2/SutryVJ6D4VZCU3CUqr8YloG7FPIBWFpI= +github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU= +github.com/golangci/lint-1 v0.0.0-20190420132249-ee948d087217/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= +github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 h1:MfyDlzVjl1hoaPzPD4Gpb/QgoRfSBR0jdhwGyAWwMSA= +github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= +github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770 h1:EL/O5HGrF7Jaq0yNhBLucz9hTuRzj2LdwGBOaENgxIk= +github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21 h1:leSNB7iYzLYSSx3J/s5sVf4Drkc68W2wm4Ixh/mr0us= +github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI= +github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= +github.com/golangci/revgrep v0.0.0-20180812185044-276a5c0a1039 h1:XQKc8IYQOeRwVs36tDrEmTgDgP88d5iEURwpmtiAlOM= +github.com/golangci/revgrep v0.0.0-20180812185044-276a5c0a1039/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= +github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys= +github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/certificate-transparency-go v1.0.21 h1:Yf1aXowfZ2nuboBsg7iYGLmwsOARdV86pfH3g95wXmE= +github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= +github.com/google/certificate-transparency-go v1.1.0 h1:10MlrYzh5wfkToxWI4yJzffsxLfxcEDlOATMx/V9Kzw= +github.com/google/certificate-transparency-go v1.1.0/go.mod h1:i+Q7XY+ArBveOUT36jiHGfuSK1fHICIg6sUkRxPAbCs= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/monologue v0.0.0-20190606152607-4b11a32b5934/go.mod h1:6NTfaQoUpg5QmPsCUWLR3ig33FHrKXhTtWzF0DVdmuk= +github.com/google/monologue v0.0.0-20191105172128-0324c8b45f6f h1:i0EUsaZHmQOp6gNaLUa2Xjh540lSHm9g+FN/TqyJIN4= +github.com/google/monologue v0.0.0-20191105172128-0324c8b45f6f/go.mod h1:6NTfaQoUpg5QmPsCUWLR3ig33FHrKXhTtWzF0DVdmuk= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/trillian v1.2.2-0.20190612132142-05461f4df60a/go.mod h1:YPmUVn5NGwgnDUgqlVyFGMTgaWlnSvH7W5p+NdOG8UA= +github.com/google/trillian-examples v0.0.0-20190603134952-4e75ba15216c/go.mod h1:WgL3XZ3pA8/9cm7yxqWrZE6iZkESB2ItGxy5Fo6k2lk= +github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.2.0 h1:S7P+1Hm5V/AT9cjEcUD5uDaQSX0OE577aCXgoaKpYbQ= +github.com/gorilla/sessions v1.2.0/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/gostaticanalysis/analysisutil v0.0.3 h1:iwp+5/UAyzQSFgQ4uR2sni99sJ8Eo9DEacKWM5pekIg= +github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 h1:THDBEeQ9xZ8JEaCLyLQqXMMdRqNr0QAUJTIkQAUtFjg= +github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.12.1 h1:zCy2xE9ablevUOrUZc3Dl72Dt+ya2FNAvC2yLYMHzi4= +github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jinzhu/gorm v1.9.11/go.mod h1:bu/pK8szGZ2puuErfU0RwyeNdsf3e6nCX/noXaVxkfw= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmhodges/clock v0.0.0-20160418191101-880ee4c33548/go.mod h1:hGT6jSUVzF6no3QaDSMLGLEHtHSBSefs+MgcDWnmhmo= +github.com/jmoiron/sqlx v0.0.0-20180124204410-05cef0741ade/go.mod h1:IiEW3SEiiErVyFdH8NTuWjSifiEQKUoyK3LNqr2kCHU= +github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/katzenpost/core v0.0.7/go.mod h1:UXMLmMXlBHrhMXhWTy4DvCXqwTRLOh4DP/mR1Cm1sR8= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/gotool v0.0.0-20161130080628-0de1eaf82fa3/go.mod h1:jxZFDH7ILpTPQTk+E2s+z4CUas9lVNjIuKR4c5/zKgM= +github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kisielk/sqlstruct v0.0.0-20150923205031-648daed35d49/go.mod h1:yyMNCyc/Ib3bDTKd379tNMpB/7/H5TjM2Y9QJ5THLbE= +github.com/kisom/goutils v1.1.0/go.mod h1:+UBTfd78habUYWFbNWTJNG+jNG/i/lGURakr4A/yNRw= +github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kylelemons/go-gypsy v0.0.0-20160905020020-08cad365cd28/go.mod h1:T/T7jsxVqf9k/zYOqbgNAsANsjxTd1Yq3htjDhQ1H0c= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/letsencrypt/pkcs11key v2.0.1-0.20170608213348-396559074696+incompatible/go.mod h1:iGYXKqDXt0cpBthCHdr9ZdsQwyGlYFh/+8xa4WzIQ34= +github.com/lib/pq v0.0.0-20180201184707-88edab080323/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/magiconair/properties v1.7.6/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb h1:RHba4YImhrUVQDHUCe2BNSOz4tVy2yGyXhvYDvxGgeE= +github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10 h1:qxFzApOv4WsAL965uUPIsXzAKCZxN2p9UqdhFS4ZW10= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.6 h1:V2iyH+aX9C5fsYCpK60U8BYIvmhqxuOL3JZcqc1NB7k= +github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v1.12.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-ps v0.0.0-20170309133038-4fdf99ab2936/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk= +github.com/mitchellh/go-ps v0.0.0-20190716172923-621e5597135b/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk= +github.com/mitchellh/mapstructure v0.0.0-20180220230111-00c29f56e238/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/mozilla/tls-observatory v0.0.0-20180409132520-8791a200eb40/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= +github.com/mozilla/tls-observatory v0.0.0-20190404164649-a3c1b6cfecfd/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= +github.com/mreiferson/go-httpclient v0.0.0-20160630210159-31f0106b4474/go.mod h1:OQA4XLvDbMgS8P0CevmM4m9Q3Jq4phKUzcocxuGJ5m8= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nbutton23/zxcvbn-go v0.0.0-20160627004424-a22cb81b2ecd/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= +github.com/nbutton23/zxcvbn-go v0.0.0-20171102151520-eafdab6b0663/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= +github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d h1:AREM5mwr4u1ORQBMvzfzBgpsctsbQikCVpvC+tX285E= +github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= +github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.2 h1:sq53g+DWf0J6/ceFUHpQ0nAEb6WgM++fq16MZ91cS6o= +github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/pelletier/go-toml v1.1.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.6.0 h1:aetoXYr0Tv7xRU/V4B4IZJ2QcbtMUFoNb3ORp7TzIK4= +github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pquerna/otp v1.2.0 h1:/A3+Jn+cagqayeR3iHs/L62m5ue7710D35zl1zJ1kok= +github.com/pquerna/otp v1.2.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v0.9.4/go.mod h1:oCXIBxdI62A4cR6aTRJCgetEjecSIYzOEaeAn4iYEpM= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.2.1 h1:JnMpQc6ppsNgw9QPAGF6Dod479itz7lvlsMzzNayLOI= +github.com/prometheus/client_golang v1.2.1/go.mod h1:XMU6Z2MjaRKVu/dC1qupJI9SiNkDYzz3xecMgSW/F+U= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.7.0 h1:L+1lyG48J1zAQXA3RBX/nG/B3gjlHq0zTt2tlbJLyCY= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.7 h1:RS5GAlMbnkWkhs4+bPocMTmGjYkuCY5djjqEDdXOhcQ= +github.com/prometheus/procfs v0.0.7/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= +github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/securego/gosec v0.0.0-20191002120514-e680875ea14d/go.mod h1:w5+eXa0mYznDkHaMCXA4XYffjlH+cy1oyKbfzJXa2Do= +github.com/securego/gosec v0.0.0-20191119104125-df484bfa9e9f h1:1egnuKwFhkqg8hXU5huGkxz9iPFu4dLINWRSIPjAM+M= +github.com/securego/gosec v0.0.0-20191119104125-df484bfa9e9f/go.mod h1:H5UrtKXL5BGF4FgRa7p2fyqU/lddaTSCLjexYIfS0Bk= +github.com/segmentio/encoding v0.1.10 h1:0b8dva47cSuNQR5ZcU3d0pfi9EnPpSK6q7y5ZGEW36Q= +github.com/segmentio/encoding v0.1.10/go.mod h1:RWhr02uzMB9gQC1x+MfYxedtmBibb9cZ6Vv9VxRSSbw= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shirou/gopsutil v0.0.0-20180427012116-c95755e4bcd7/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc= +github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/skip2/go-qrcode v0.0.0-20191027152451-9434209cb086 h1:RYiqpb2ii2Z6J4x0wxK46kvPBbFuZcdhS+CIztmYgZs= +github.com/skip2/go-qrcode v0.0.0-20191027152451-9434209cb086/go.mod h1:PLPIyL7ikehBD1OAjmKKiOEhbvWyHGaNDjquXMcYABo= +github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sourcegraph/go-diff v0.5.1 h1:gO6i5zugwzo1RVTvgvfwCOSVegNuvnNi6bAD1QCmkHs= +github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.0/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/cast v1.2.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= +github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.2/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v0.0.0-20180109140146-7c0cea34c8ec/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.0.2/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.5.0 h1:GpsTwfsQ27oS/Aha/6d1oD7tpKIqWnOA6tgOX9HHkt4= +github.com/spf13/viper v1.5.0/go.mod h1:AkYRkVJF8TkSG/xet6PzXX+l39KhhXa2pdqVSxnTcn4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/timakin/bodyclose v0.0.0-20190721030226-87058b9bfcec/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= +github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e h1:RumXZ56IrCj4CL+g1b9OL/oH0QnsF976bC8xQFYUD5Q= +github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/ultraware/funlen v0.0.1/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= +github.com/ultraware/funlen v0.0.2 h1:Av96YVBwwNSe4MLR7iI/BIa3VyI7/djnto/pK3Uxbdo= +github.com/ultraware/funlen v0.0.2/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= +github.com/ultraware/whitespace v0.0.4 h1:If7Va4cM03mpgrNH9k49/VOicWpGoG70XPBFFODYDsg= +github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/uudashr/gocognit v0.0.0-20190926065955-1655d0de0517/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM= +github.com/uudashr/gocognit v1.0.0 h1:NST9SQhYHpFiyKdXn8UAiogdB1xkt5RnA1/rR/oBcGw= +github.com/uudashr/gocognit v1.0.0/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/quicktemplate v1.1.1/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4= +github.com/valyala/quicktemplate v1.2.0/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/vmihailenco/bufpool v0.1.5 h1:mEO/biwhAgiY97yPMmAdH4PvaIu63C6uGBdfSdoMo/I= +github.com/vmihailenco/bufpool v0.1.5/go.mod h1:fL9i/PRTuS7AELqAHwSU1Zf1c70xhkhGe/cD5ud9pJk= +github.com/vmihailenco/msgpack/v4 v4.3.5/go.mod h1:DuaveEe48abshDmz5UBKyZ+yDugvaeFk5ayfrewUOaw= +github.com/vmihailenco/msgpack/v4 v4.3.7 h1:Aj4eMY2qXTRfWRwHKJ2n/CWKVy15pCYN327QMJ/OUVs= +github.com/vmihailenco/msgpack/v4 v4.3.7/go.mod h1:Ii+PksJlvFT5ZRcB/4YLAInMIp6a0WOCm0L3BU0aNG4= +github.com/vmihailenco/tagparser v0.1.0/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/vmihailenco/tagparser v0.1.1 h1:quXMXlA39OCbd2wAdTsGDlK9RkOk6Wuw+x37wVyIuWY= +github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/weppos/publicsuffix-go v0.4.0/go.mod h1:z3LCPQ38eedDQSwmsSRW4Y7t2L8Ln16JPQ02lHAdn5k= +github.com/weppos/publicsuffix-go v0.5.0/go.mod h1:z3LCPQ38eedDQSwmsSRW4Y7t2L8Ln16JPQ02lHAdn5k= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= +github.com/zmap/rc2 v0.0.0-20131011165748-24b9757f5521/go.mod h1:3YZ9o3WnatTIZhuOtot4IcUfzoKVjUHqu6WALIyI0nE= +github.com/zmap/zcertificate v0.0.0-20180516150559-0e3d58b1bac4/go.mod h1:5iU54tB79AMBcySS0R2XIyZBAVmeHranShAFELYx7is= +github.com/zmap/zcrypto v0.0.0-20190729165852-9051775e6a2e/go.mod h1:w7kd3qXHh8FNaczNjslXqvFQiv5mMWRXlL9klTUAHc8= +github.com/zmap/zlint v0.0.0-20190806154020-fd021b4cfbeb/go.mod h1:29UiAJNsiVdvTBFCJW8e3q6dcDbOoPkhMgttOSCIMMY= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/etcd v3.3.13+incompatible/go.mod h1:yaeTdrJi5lOmYerz05bd8+V7KubZs8YSFZfzsF9A6aI= +go.etcd.io/etcd v3.3.17+incompatible h1:g8iRku1SID8QAW8cDlV0L/PkZlw63LSiYEHYHoE6j/s= +go.etcd.io/etcd v3.3.17+incompatible/go.mod h1:yaeTdrJi5lOmYerz05bd8+V7KubZs8YSFZfzsF9A6aI= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0 h1:OI5t8sDa1Or+q8AeE+yKeB/SDYioSHAgcVljj9JIETY= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.4.0 h1:f3WCSC2KzAcBXGATIxAB1E2XuCpNU255wNKZ505qi3E= +go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0 h1:nR6NoDBgAf67s68NhaXbsojM+2gxp3S1hWkHDl27pVU= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180910181607-0e37d006457b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20191029031824-8986dd9e96cf/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20191117063200-497ca9f6d64f/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20191128160524-b544559bb6d1/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d h1:1ZiEyfaQIg3Qh0EoqpwAakHVhecoE5wlSg5GjnafJGw= +golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/net v0.0.0-20170915142106-8351a756f30f/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191119073136-fc4aabc6c914/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222033325-078779b8f2d8 h1:4l6HGmcZuPkox4Zl1b7SZQfYo8KIKvPe+5VG6ibuUEg= +golang.org/x/net v0.0.0-20200222033325-078779b8f2d8/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20171026204733-164713f0dfce/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191119060738-e882bf8e40c2 h1:wAW1U21MfVN0sUipAD8952TBjGXMRHFKQugDlQ9RwwE= +golang.org/x/sys v0.0.0-20191119060738-e882bf8e40c2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.0.0-20170915090833-1cbadb444a80/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20170915040203-e531a2a1c15f/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190121143147-24cd39ecf745/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190521203540-521d6ed310dd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190719005602-e377ae9d6386/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20190909030654-5b82db07426d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911151314-feee8acb394c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190930201159-7c411dea38b0/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191101200257-8dbcdeb83d3f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119175705-11e13f1c3fd7 h1:RyLBY/sJ/JwgAsmjUkGy/spRidXrmMj9uK4V6eiBypg= +golang.org/x/tools v0.0.0-20191119175705-11e13f1c3fd7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.5.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.6.0/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190605220351-eb0b1bdb6ae6/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191115221424-83cc0476cb11 h1:51D++eCgOHufw5VfDE9Uzqyyc+OyQIjb9hkYy9LN5Fk= +google.golang.org/genproto v0.0.0-20191115221424-83cc0476cb11/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.25.1 h1:wdKvqQk7IttEw92GoRyKG2IDrUIpgpj6H6m81yfeMW0= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/cheggaaa/pb.v1 v1.0.28 h1:n1tBJnnK2r7g9OW2btFH91V92STTUevLXYFb8gy9EMk= +gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.6 h1:97YCGUei5WVbkKfogoJQsLwUJ17cWvpLrgNvlcbxikE= +gopkg.in/yaml.v2 v2.2.6/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +mellium.im/sasl v0.2.1 h1:nspKSRg7/SyO0cRGY71OkfHab8tf9kCts6a6oTDut0w= +mellium.im/sasl v0.2.1/go.mod h1:ROaEDLQNuf9vjKqE1SrAfnsobm2YKXT1gnN1uDp1PjQ= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= +mvdan.cc/unparam v0.0.0-20190209190245-fbb59629db34/go.mod h1:H6SUd1XjIs+qQCyskXg5OFSrilMRUkD8ePJpHKDPaeY= +mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw= +mvdan.cc/unparam v0.0.0-20191111180625-960b1ec0f2c2 h1:K7wru2CfJGumS5hkiguQ0Rb9ebKM2Jo8s5d4Jm9lFaM= +mvdan.cc/unparam v0.0.0-20191111180625-960b1ec0f2c2/go.mod h1:rCqoQrfAmpTX/h2APczwM7UymU/uvaOluiVPIYCSY/k= +sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= +sourcegraph.com/sqs/pbtypes v1.0.0 h1:f7lAwqviDEGvON4kRv0o5V7FT/IQK+tbkF664XMbP3o= +sourcegraph.com/sqs/pbtypes v1.0.0/go.mod h1:3AciMUv4qUuRHRHhOG4TZOB+72GdPVz5k+c648qsFS4= diff --git a/lib/assets/.gitkeep b/lib/assets/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/lib/authentication.rb b/lib/authentication.rb deleted file mode 100644 index 6f162e3..0000000 --- a/lib/authentication.rb +++ /dev/null @@ -1,111 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2009-2011 Alex Legler -# Copyright (C) 2009 Pierre-Yves Rofes -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -# Authentication module -module Authentication - protected - # Login filter to be applied to *all* pages on GLSAMaker - def login_required - # Production authentication via REMOTE_USER - if Rails.env.production? or GLSAMAKER_FORCE_PRODUCTION_AUTH - # REMOTE_USER should be there in FCGI or Passenger - env_user_name = user_name - - # Autentication system most likely broken - if env_user_name.nil? - logger.warn "Neither REMOTE_USER nor HTTP_AUTHORIZATION set in environment." - redirect_to :controller => 'index', :action => 'error', :type => 'system' - return - end - - user = User.find_by_login(env_user_name) - - # User not known to GLSAMaker - if user == nil - logger.warn "Unknown user #{env_user_name} tried to log in from #{request.remote_ip}" - redirect_to :controller => 'index', :action => 'error', :type => 'user' - return - end - - # User is marked as disabled in the DB - if user.disabled - logger.warn "Disabled user #{env_user_name} tried to log in from #{request.remote_ip}" - redirect_to :controller => 'index', :action => 'error', :type => 'disabled' - return - end - - # Auth is fine now. - logger.debug "Environment username: #{env_user_name}" - - # For all other environments request, HTTP auth by ourselves - # The password can be set in config/initializers/glsamaker.rb - else - authenticate_or_request_with_http_basic("GLSAMaker testing environment") do |username, password| - logger.debug "Environment username: #{username}" - check_auth(username, password) - end - end - end - - # Filter for admin pages - def admin_access_required - unless current_user.is_el_jefe? - deny_access "Admin interface" - false - end - end - - # Returns the ActiveRecord object of the currently logged in user - def current_user - User.find_by_login(user_name) - end - - # Populate user to views, shamelessly stolen from restful auth. ;) - def self.included(base) - base.send :helper_method, :current_user if base.respond_to? :helper_method - end - - private - # Tries to find out the user name used for HTTP auth from two sources - def user_name - if request.env.include?('REMOTE_USER') then - u = request.env['REMOTE_USER'] - return u unless u.nil? - else - auth = http_authorization_data - return auth[0] unless auth.nil? - end - return nil - end - - def check_auth(username, password) - user = User.find_by_login(username) - - return false if user.nil? - return false if user.disabled - - password == GLSAMAKER_DEVEL_PASSWORD - end - - def http_authorization_data - return nil unless request.env.include?('HTTP_AUTHORIZATION') - return nil if request.env['HTTP_AUTHORIZATION'].nil? - - auth_info = request.env['HTTP_AUTHORIZATION'].split - - if auth_info[0] == "Basic" - auth_info[1].unpack("m*").first.split(/:/, 2) - else - logger.fatal "Non-Basic HTTP authentication given. I can't process that" - raise RuntimeError, "Cannot process this type of HTTP authentication" - end - end -end diff --git a/lib/authorization.rb b/lib/authorization.rb deleted file mode 100644 index 5341709..0000000 --- a/lib/authorization.rb +++ /dev/null @@ -1,49 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2011 Alex Legler -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -# Authorization module -module Authorization - # Checks access to a given GLSA - def check_object_access(glsa) - # Contributor, no foreign drafts - if current_user.access == 0 - unless glsa.is_owner? current_user - return false - end - elsif current_user.access < 3 - if glsa.restricted - return false - end - end - - true - end - - # Checks access to a given GLSA, and aborts the request if the user does not have sufficient permissions - def check_object_access!(glsa) - unless check_object_access(glsa) - deny_access "Access to restricted GLSA #{glsa.id} (#{params[:action]})" - return false - end - - true - end - - # Redirects the user to a 'Access Denied' screen and logs the incident - def deny_access(msg) - log_unauthorized_access msg - redirect_to :controller => '/index', :action => 'error', :type => 'access' - end - - # Logs an unauthorized access attempt - def log_unauthorized_access(msg) - logger.warn "[#{Time.now.rfc2822}] UNAUTHORIZED ACCESS by #{current_user.login} from #{request.remote_ip} to #{request.url}: #{msg}" - end -end diff --git a/lib/bugzilla.rb b/lib/bugzilla.rb deleted file mode 100644 index d6af1b3..0000000 --- a/lib/bugzilla.rb +++ /dev/null @@ -1,195 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2009-2011 Alex Legler -# Copyright (C) 2009 Pierre-Yves Rofes -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -require 'nokogiri' -require 'fileutils' -require 'xmlrpc/client' - -module Bugzilla ; end - -%w[ comment history bug ].each {|lib| require File.join(File.dirname(__FILE__), "bugzilla/#{lib}")} - -# Bugzilla module -module Bugzilla - module_function - # Adds a comment to a bug. Returns the comment id on success, raises an exception on failure. - def add_comment(bug, comment) - if GLSAMAKER_BUGZIE_SKIP - Rails.logger.info 'Skipped Bugzilla.add_comment' - return - end - - Rails.logger.debug 'Called Bugzilla.add_comment' - did_retry = false - - begin - client, token = xmlrpc_client - - result = client.call('Bug.add_comment', { - 'id' => bug.to_i, - 'comment' => comment, - 'Bugzilla_token' => token, - }) - result['id'] - rescue XMLRPC::FaultException => e - if did_retry - raise "Could not add the comment: #{e.faultString} (code #{e.faultCode})" - end - - # If we need to log in first - if e.faultCode == 410 - Rails.logger.debug "Not logged in, doing that now." - log_in - did_retry = true - retry - else - raise "Could not add the comment: #{e.faultString} (code #{e.faultCode})" - end - end - - end - - # Updates a bug. Returns an array of changes that were done on the bug. - def update_bug(bug, changes = {}) - if GLSAMAKER_BUGZIE_SKIP - Rails.logger.info 'Skipped Bugzilla.update_bug' - return - end - - Rails.logger.debug 'Called Bugzilla.update_bug' - did_retry = false - - begin - client, token = xmlrpc_client - - rpc_data = {} - rpc_data['ids'] = [bug] - rpc_data['component'] = changes[:component] if changes.has_key?(:component) - rpc_data['product'] = changes[:product] if changes.has_key?(:product) - rpc_data['summary'] = changes[:summary] if changes.has_key?(:summary) - rpc_data['version'] = changes[:version] if changes.has_key?(:version) - rpc_data['comment'] = {'body' => changes[:comment]} if changes.has_key?(:comment) - rpc_data['priority'] = changes[:priority] if changes.has_key?(:priority) - rpc_data['severity'] = changes[:severity] if changes.has_key?(:severity) - rpc_data['alias'] = changes[:alias] if changes.has_key?(:alias) - rpc_data['assigned_to'] = changes[:assignee] if changes.has_key?(:assignee) - #rpc_data['cc'] = changes[:cc].to_a if changes.has_key?(:cc) TODO: add and remove - rpc_data['status'] = changes[:status] if changes.has_key?(:status) - rpc_data['whiteboard'] = changes[:whiteboard] if changes.has_key?(:whiteboard) - rpc_data['url'] = changes[:url] if changes.has_key?(:url) - rpc_data['resolution'] = changes[:resolution] if changes.has_key?(:resolution) - rpc_data['Bugzilla_token'] = token - - result = client.call('Bug.update', rpc_data) - result['bugs'].first - rescue XMLRPC::FaultException => e - if did_retry - raise "Could not file the bug: #{e.faultString} (code #{e.faultCode})" - end - - # If we need to log in first - if e.faultCode == 410 - Rails.logger.debug "Not logged in, doing that now." - log_in - did_retry = true - retry - else - raise "Could not file the bug: #{e.faultString} (code #{e.faultCode})" - end - end - end - - # Files a bug, and returns the id of the filed bug - def file_bug(data) - if GLSAMAKER_BUGZIE_SKIP - Rails.logger.info 'Skipped Bugzilla.file_bug' - return - end - - Rails.logger.debug 'Called Bugzilla.file_bug' - did_retry = false - - begin - client, token = xmlrpc_client - - rpc_data = {} - rpc_data['component'] = data[:component] if data.has_key?(:component) - rpc_data['product'] = data[:product] if data.has_key?(:product) - rpc_data['summary'] = data[:summary] if data.has_key?(:summary) - rpc_data['version'] = data[:version] if data.has_key?(:version) - rpc_data['description'] = data[:comment] if data.has_key?(:comment) - rpc_data['priority'] = data[:priority] if data.has_key?(:priority) - rpc_data['severity'] = data[:severity] if data.has_key?(:severity) - rpc_data['alias'] = data[:alias] if data.has_key?(:alias) - rpc_data['assigned_to'] = data[:assignee] if data.has_key?(:assignee) - rpc_data['cc'] = data[:cc].to_a if data.has_key?(:cc) - rpc_data['status'] = data[:status] if data.has_key?(:status) - rpc_data['Bugzilla_token'] = token - - result = client.call('Bug.create', rpc_data) - result['id'] - rescue XMLRPC::FaultException => e - if did_retry - raise "Could not file the bug: #{e.faultString} (code #{e.faultCode})" - end - - # If we need to log in first - if e.faultCode == 410 - Rails.logger.debug "Not logged in, doing that now." - log_in - did_retry = true - retry - else - raise "Could not file the bug: #{e.faultString} (code #{e.faultCode})" - end - end - end - - def log_in - Rails.logger.debug "Called Bugzilla.log_in" - raise unless GLSAMAKER_BUGZIE_USER and GLSAMAKER_BUGZIE_PW - - client, token = xmlrpc_client - - begin - result = client.call('User.login', { - 'login' => GLSAMAKER_BUGZIE_USER, - 'password' => GLSAMAKER_BUGZIE_PW - }) - - Rails.logger.debug "Successfully logged in. UID: #{result['id']}" - - token_file = File.join(Rails.root, 'tmp', 'bugzie-token.txt') - FileUtils.rm(token_file) if File.exist?(token_file) - FileUtils.touch(token_file) - File.chmod(0600, token_file) - File.open(token_file, 'w') {|f| f.write result['token'] } - - return true - rescue XMLRPC::FaultException => e - Rails.logger.warn "Failure logging in: #{e.message}" - return false - end - end - - def xmlrpc_client - client = XMLRPC::Client.new(GLSAMAKER_BUGZIE_HOST, '/xmlrpc.cgi', 443, nil, nil, nil, nil, true) - client.http_header_extra = {'User-Agent' => "GLSAMaker/#{GLSAMAKER_VERSION} (https://security.gentoo.org/)"} - - token = '' - token_file = File.join(Rails.root, 'tmp', 'bugzie-token.txt') - if File.readable? token_file - token = File.read(token_file) - end - - [client, token] - end -end diff --git a/lib/bugzilla/bug.rb b/lib/bugzilla/bug.rb deleted file mode 100644 index 7f6b20b..0000000 --- a/lib/bugzilla/bug.rb +++ /dev/null @@ -1,143 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2010 Alex Legler -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -# Encapsulates a Bugzilla Bug -module Bugzilla - class Bug - attr_reader :summary, :created_at, :reporter, :alias, :assigned_to, :cc, :status_whiteboard, - :product, :component, :status, :resolution, :url, :comments, :bug_id, :restricted, - :severity, :priority, :depends, :blocks - - alias :title :summary - - # Creates a new +Bug+ object from the Gentoo bug referenced as #+bugid+ - def self.load_from_id(bugid) - begin - id = Integer(bugid) - - raise ArgumentError if id == 0 - rescue ArgumentError => e - raise ArgumentError, "Invalid Bug ID" - end - - begin - xml = Nokogiri::XML(Glsamaker::HTTP.get("https://#{GLSAMAKER_BUGZIE_HOST}/show_bug.cgi?ctype=xml&id=#{id}")) - rescue SocketError => e - raise SocketError, "Bugzilla is unreachable: #{e.message}" - rescue Exception => e - raise ArgumentError, "Couldn't load bug: #{e.message}" - end - - self.new(xml.root.xpath("bug").first, bugid) - end - - # Returns the URL for the bug, set +secure+ to false to get a http:-URL - def url(secure = true) - if secure - "https://#{GLSAMAKER_BUGZIE_HOST}/show_bug.cgi?id=#{@bug_id}" - else - "http://#{GLSAMAKER_BUGZIE_HOST}/show_bug.cgi?id=#{@bug_id}" - end - end - - def history() - @history ||= History.new(self) - end - - def initialize(bug, id) - unless bug.is_a? Nokogiri::XML::Element - raise ArgumentError, "Nokogiri failure" - end - - if bug["error"] == "NotFound" - raise ArgumentError, "Bug not found" - elsif bug["error"] == "NotPermitted" - @bug_id = id - @restricted = true - return - end - - @restricted = false - @cc = [] - @depends = [] - @blocks = [] - @comments = [] - - bug.children.each do |node| - # Ignore whitespace - next if node.type == Nokogiri::XML::Node::TEXT_NODE - # Ignore empty nodes - next if node.children.size == 0 - - case node.name - when "bug_id" then - @bug_id = content_in node - when "short_desc" then - @summary = content_in node - when "creation_ts" then - @created_at = Time.parse(content_in(node)) - when "reporter" then - @reporter = content_in node - when "alias" then - @alias = content_in node - when "assigned_to" then - @assigned_to = content_in node - when "cc" then - @cc << content_in(node) - when "status_whiteboard" then - @status_whiteboard = content_in node - when "product" then - @product = content_in node - when "component" then - @component = content_in node - when "bug_status" then - @status = content_in node - when "resolution" then - @resolution = content_in node - when "bug_file_loc" then - @url = content_in node - when "bug_severity" then - @severity = content_in node - when "priority" then - @priority = content_in node - when "dependson" then - @depends << content_in(node) - when "blocked" then - @blocks << content_in(node) - when "long_desc" then - @comments << Bugzilla::Comment.new( - node.xpath("who").first.children.first.to_s, - node.xpath("thetext").first.children.first.to_s, - node.xpath("bug_when").first.children.first.to_s - ) - end - end - end - - # Returns the initial bug description - def description - @comments.first.text - end - - # Splits a String +str+ into an array of valid bug IDs - def self.str2bugIDs(str) - bug_ids = str.split(/,\s*/) - - bug_ids.map do |bug| - bug.gsub(/\D/, '') - end - end - - private - def content_in(node) - node.children.first.content.strip - end - end -end diff --git a/lib/bugzilla/comment.rb b/lib/bugzilla/comment.rb deleted file mode 100644 index 2cd9236..0000000 --- a/lib/bugzilla/comment.rb +++ /dev/null @@ -1,22 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2010 Alex Legler -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -# Encapsulates a comment to a Bug -module Bugzilla - class Comment - attr_reader :author, :text, :date - - def initialize(by, text, date) - @author = by - @text = text - @date = Time.parse(date) - end - end -end diff --git a/lib/bugzilla/history.rb b/lib/bugzilla/history.rb deleted file mode 100644 index 04188e4..0000000 --- a/lib/bugzilla/history.rb +++ /dev/null @@ -1,104 +0,0 @@ -# Encapsulates a bug's history -module Bugzilla - class History - attr_reader :changes - - # Creates a new History for the Bug object +bug+. - def initialize(bug) - unless bug.respond_to? :bug_id - raise ArgumentError, "Need a bug (or something that at least looks like a bug)" - end - - begin - html = Nokogiri::HTML(Glsamaker::HTTP.get("https://bugs.gentoo.org/show_activity.cgi?id=#{bug.bug_id}")) - rescue Exception => e - raise ArgumentError, "Couldn't load the bug history: #{e.message}" - end - - @changes = [] - change_cache = nil - - html.xpath("/html/body/table/tr").each do |change| - # ignore header line - next if change.children.first.name == "th" - - # First line in a multi-change set - unless (chcount = change.children.first["rowspan"]) == nil - change_cache = Change.new(change.children.first.content.strip, change.children[2].content.strip) - - change_cache.add_change( - change.children[4].content.strip.downcase.to_sym, - change.children[6].content.strip, - change.children[8].content.strip - ) - - @changes << change_cache - else - change_cache.add_change( - change.children[0].content.strip.downcase.to_sym, - change.children[2].content.strip, - change.children[4].content.strip - ) - end - end - end - - # Returns an Array of Changes made to the field +field+ - def by_field(field) - raise(ArgumentError, "Symbol expected") unless field.is_a? Symbol - - changes = [] - - @changes.each do |change| - if change.changes.has_key?(field) - changes << change - end - end - - changes - end - - # Returns an Array of Changes made by the user +user+ - def by_user(user) - changes = [] - - @changes.each do |change| - if change.user == user - changes << change - end - end - - changes - end - end - - # This represents a single Change made to a Bug - class Bugzilla::Change - attr_reader :user, :time, :changes - - # Creates a new Change made by +user+ at +time+. - def initialize(user, time) - @user = user || "" - @time = Time.parse(time) - @changes = {} - end - - # Adds a changed +field+ to the Change object. +removed+ denotes the removed text - # and +added+ is the new text - def add_change(field, removed, added) - raise(ArgumentError, "field has to be a symbol") unless field.is_a? Symbol - - if @changes.has_key?(field) - @changes[field][0] += " #{removed}" - @changes[field][1] += " #{added}" - else - @changes[field] = [removed, added] - end - end - - # Returns a string representation - def to_s - "#{@user} changed at #{@time.to_s}: #{@changes.inspect}" - end - end -end diff --git a/lib/glsamaker.rb b/lib/glsamaker.rb deleted file mode 100644 index fdc93d8..0000000 --- a/lib/glsamaker.rb +++ /dev/null @@ -1,23 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2009-2011 Alex Legler -# Copyright (C) 2009 Pierre-Yves Rofes -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -require 'glsamaker/http' -require 'glsamaker/portage' -require 'glsamaker/diff' -require 'glsamaker/xml' -require 'glsamaker/bugs' -require 'glsamaker/mail' - -#FIXME: spelling module is developed with dead 'runspell' gem. -# -#require 'glsamaker/spelling' - -# require 'glsamaker/helpers' DO NOT REQUIRE or else the rake tasks will blow up diff --git a/lib/glsamaker/bugs.rb b/lib/glsamaker/bugs.rb deleted file mode 100644 index 567624e..0000000 --- a/lib/glsamaker/bugs.rb +++ /dev/null @@ -1,182 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2009-2011 Alex Legler -# Copyright (C) 2009 Pierre-Yves Rofes -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -require 'bugzilla' - -module Glsamaker - module Bugs - - module StatusMixin - def secbug_status - if whiteboard =~ /([A-C~?][0-4?]\??)\s+\[(.*?)\]\s*?(.*?)$/ - st = [] - - $2.split("/").each do |status| - st << Status.new(status) - end - - return st - else - [Status.new('?')] - end - end - end - - module ArchesMixin - # Returns an array of all arch teams in CC - def arch_cc - @arch_cc ||= _arch_cc - end - - private - def _arch_cc - ccd_arches = [] - our_arches = %w[ alpha@gentoo.org amd64@gentoo.org arm@gentoo.org bsd@gentoo.org hppa@gentoo.org - ia64@gentoo.org m68k@gentoo.org mips@gentoo.org ppc64@gentoo.org ppc@gentoo.org release@gentoo.org - s390@gentoo.org sh@gentoo.org sparc@gentoo.org x86@gentoo.org ] - - if cc.is_a? String - _cc = cc.split(/,\s*/) - elsif cc.nil? - _cc = [] - else - _cc = cc - end - - _cc.each do |cc_member| - if our_arches.include? cc_member - ccd_arches << cc_member - end - end - - ccd_arches - end - end - - module BugReadyMixin - # Indicates whether this bug has been handled and is in the correct - # state for sending a GLSA assigned to it. - def bug_ready? - secbug_status.each do |s| - return false unless s.status == :glsa and not s.pending? - end - - return arch_cc == [] - rescue Exception => e - return false - end - end - - # Extends Bugzilla::Bug with the Status and Arches functionality - class Bug < Bugzilla::Bug - def whiteboard - @status_whiteboard - end - - def cc - @cc - end - - # Returns the Gentoo Bugzilla URI for the bug. - # Set +secure+ to false to get a HTTP instead of a HTTPS URI - def bug_url(secure = true) - if secure - "https://#{GLSAMAKER_BUGZIE_HOST}/show_bug.cgi?id=#{self.bug_id}" - else - "http://#{GLSAMAKER_BUGZIE_HOST}/show_bug.cgi?id=#{self.bug_id}" - end - end - - include StatusMixin - include ArchesMixin - include BugReadyMixin - end - - # This baby is a bug status, one of the things you see in squared brackets in whiteboards. - class Status - include Comparable - - attr_reader :status - - # Creates a new Status object by parsing +str+ as a single status string - def initialize(str) - if str == '?' - @status = '?'.to_sym - @blocked = @overdue = @pending = false - return - end - - cmp = str.strip.split(/\s+/) - - if cmp.length == 2 - @blocked = (cmp[1] == "blocked") - end - - if cmp[0] =~ /^(upstream|ebuild|stable|glsa|noglsa)(\+|\?|\+\?|\?\+)?$/ - @overdue = ($2 != nil and $2.include? "+") - @pending = ($2 != nil and $2.include? "?") - - @status = $1.downcase.to_sym - else - raise ArgumentError, "Malformed Status string: #{str}" - end - end - - # Returns +true+ if the bug is blocked by another (c.f. +'blocked'+ in whiteboards) - def blocked? - @blocked - end - - # Returns +true+ if the bug is overdue (cf. +'+'+ in whiteboards) - def overdue? - @overdue - end - - # Returns +true+ if the bug is pending action (cf. +'?'+ in whiteboards) - def pending? - @pending - end - - # Returns a string representation (like you would find it in the whiteboard) - def to_s - @status.to_s + (@overdue ? "+" : "") + (@pending ? "?" : "") + (@blocked ? " blocked" : "") - end - - # Comparison - def <=>(other) - raise(ArgumentError, "Cannot compare to #{other.class}") unless other.is_a? Status - - s = ['?'.to_sym, :upstream, :ebuild, :stable, :glsa, :noglsa] - - if other.status == @status - if other.pending? == @pending and other.overdue? == @overdue - 0 - else - if other.overdue? and not @overdue - -1 - elsif @overdue and not other.overdue? - 1 - else - if @pending and not other.pending? - -1 - else - 1 - end - end - end - else - (s.index(@status) - s.index(other.status)) < 0 ? -1 : 1 - end - end - - end - end -end diff --git a/lib/glsamaker/diff.rb b/lib/glsamaker/diff.rb deleted file mode 100644 index 18e10f6..0000000 --- a/lib/glsamaker/diff.rb +++ /dev/null @@ -1,53 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2009-2011 Alex Legler -# Copyright (C) 2009 Pierre-Yves Rofes -# Copyright (C) 2006-2007 Jean-Philippe Lang -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -require 'diff/lcs' -require 'diff/lcs/hunk' - -module Glsamaker - # Module providing diff support - module Diff - module_function - - # Returns a unified diff for two strings - # Adapted from the O'Reilly Ruby Cookbook - def diff(str_old, str_new, format = :unified, context_lines = 3) - str_old = str_old.split(/\r?\n/).map! { |l| l.chomp } - str_new = str_new.split(/\r?\n/).map! { |l| l.chomp } - - output = "" - diffs = ::Diff::LCS.diff(str_old, str_new) - return output if diffs.empty? - - oldhunk = hunk = nil - file_length_difference = 0 - diffs.each do |piece| - begin - hunk = ::Diff::LCS::Hunk.new(str_old, str_new, piece, context_lines, file_length_difference) - next unless oldhunk - - if (context_lines > 0) and hunk.overlaps?(oldhunk) - hunk.unshift(oldhunk) - else - output << oldhunk.diff(format) - end - ensure - oldhunk = hunk - output << "\n" - end - end - - output << oldhunk.diff(format) << "\n" - end - - end -end diff --git a/lib/glsamaker/helpers.rb b/lib/glsamaker/helpers.rb deleted file mode 100644 index aca09ab..0000000 --- a/lib/glsamaker/helpers.rb +++ /dev/null @@ -1,21 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2010 Alex Legler -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -module Glsamaker - module_function - def help - Helper.instance - end - - class Helper - include Singleton - include ::ActionView::Helpers::TextHelper - end -end diff --git a/lib/glsamaker/http.rb b/lib/glsamaker/http.rb deleted file mode 100644 index 5f63096..0000000 --- a/lib/glsamaker/http.rb +++ /dev/null @@ -1,37 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2009-2011 Alex Legler -# Copyright (C) 2009 Pierre-Yves Rofes -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -require 'net/http' -require 'net/https' - -# GLSAMaker library -module Glsamaker - # GLSAMaker HTTP utilities - module HTTP - # Tries to fetch +url+ via HTTP GET, sending a GLSAMaker custom User-Agent header. - # The body part is returned. - def get(url) - uri = URI.parse(url) - - http = Net::HTTP.new(uri.host, uri.port) - http.use_ssl = true if uri.scheme == "https" - res = http.start { - http.request_get(uri.request_uri, {'User-Agent' => "GLSAMaker/#{GLSAMAKER_VERSION} (https://security.gentoo.org/)"}) - } - - # Raises an exception if HTTP status suggests something went wrong - res.value - res.body - end - - module_function :get - end -end diff --git a/lib/glsamaker/mail.rb b/lib/glsamaker/mail.rb deleted file mode 100644 index b749193..0000000 --- a/lib/glsamaker/mail.rb +++ /dev/null @@ -1,106 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2010-11 Alex Legler -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -module Glsamaker - module Mail - module_function - def edit_notification(glsa, diff, user) - if GLSAMAKER_NO_EMAIL - Rails.logger.info "Not sending email." - return false - end - - if glsa.restricted - Rails.logger.info "Not sending email, confidential item." - return false - end - - User.active.each do |rcpt| - next unless rcpt.can_access? glsa - - unless rcpt.get_pref_category(:mail)[:edit] == false - GlsaMailer.edit(rcpt, glsa, diff, user).deliver - end - end - end - - def request_notification(glsa, user) - if GLSAMAKER_NO_EMAIL - Rails.logger.info "Not sending email." - return false - end - - if glsa.restricted - Rails.logger.info "Not sending email, confidential item." - return false - end - - User.active.each do |rcpt| - next unless rcpt.can_access? glsa - - unless rcpt.get_pref_category(:mail)[:request] == false - GlsaMailer.new_request(rcpt, glsa, user).deliver - end - end - end - - def comment_notification(glsa, comment, user) - if GLSAMAKER_NO_EMAIL - Rails.logger.info "Not sending email." - return false - end - - # Nothing to do if there's no submitter yet - return if glsa.status == 'request' - - if glsa.restricted - Rails.logger.info "Not sending email, confidential item." - return false - end - - rcpt = glsa.submitter - return unless rcpt.can_access? glsa - return if rcpt == user - - unless rcpt.get_pref_category(:mail)[:comment] == false - GlsaMailer.comment(rcpt, glsa, comment, user).deliver - end - end - - def approval_notification(glsa) - if GLSAMAKER_NO_EMAIL - Rails.logger.info "Not sending email." - return false - end - - if glsa.restricted - Rails.logger.info "Not sending email, confidential item." - return false - end - - rcpt = glsa.submitter - return unless rcpt.can_access? glsa - - unless rcpt.get_pref_category(:mail)[:comment] == false - GlsaMailer.approval(rcpt, glsa).deliver - end - end - - def send_text(text, subject, user, footer = true) - if GLSAMAKER_NO_EMAIL - Rails.logger.info "Not sending email." - return false - end - - GlsaMailer.text(user, subject, text, footer).deliver - end - - end -end diff --git a/lib/glsamaker/portage.rb b/lib/glsamaker/portage.rb deleted file mode 100644 index f49e93e..0000000 --- a/lib/glsamaker/portage.rb +++ /dev/null @@ -1,194 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2009-2011 Alex Legler -# Copyright (C) 2009 Pierre-Yves Rofes -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -require 'nokogiri' - -module Glsamaker - # Helper functions for Portage tree interaction - module Portage - - # Package description helper - class Description - class << self - # Tries to fetch the description for the package +atom+ from - # an ebuild's entry (works if running on Gentoo) - def ebuild(atom) - raise(ArgumentError, "Invalid package atom") unless Portage.valid_atom?(atom) - nil - end - - def eix(atom) - nil - end - - # Loads a description for +atom+ from packages.gentoo.org - def pgo(atom) - raise(ArgumentError, "Invalid package atom") unless Portage.valid_atom?(atom) - - n = Nokogiri::XML(Glsamaker::HTTP.get("https://packages.gentoo.org/package/#{atom}")) - - node = n.css('p.description').first.children.first - if node.type == Nokogiri::XML::Node::TEXT_NODE - node.to_s - else - raise ArgumentError, "XML parse error" - end - end - - # Loads a description for +atom+ from Google - def google(atom) - nil - end - end - end - - module_function - # Returns the location of the portage dir, or raises an exception if it cannot be found - def portdir - unless File.directory? GLSAMAKER_PORTDIR - raise "GLSAMAKER_PORTDIR is not a directory" - end - - GLSAMAKER_PORTDIR - end - - # Validates the atom +atom+ - def valid_atom?(atom) - atom =~ /^[+a-zA-Z0-9_-]+\/[+a-zA-Z0-9_-]+$/ - end - - # Checks if there are any ebuilds for the +atom+ - def has_ebuilds?(atom) - return false unless valid_atom? atom - - Dir.chdir("#{portdir}/#{atom}") do - Dir.glob('*.ebuild') do |ebuild| - return true - end - end - - false - rescue Errno::ENOENT - false - end - - # Gets a description - def get_description(atom) - Description.eix(atom) || - Description.ebuild(atom) || - Description.pgo(atom) || - Description.google(atom) || - "[could not get a description]" - end - - # Returns package atoms that match +re+ - def find_packages(re) - results = [] - - Dir.chdir(portdir) do - Dir.glob('*-*') do |cat| - Dir.chdir(cat) do - Dir.glob("*") do |pkg| - pkg =~ re and results << "#{cat}/#{pkg}" - end - end - end - end - - results - end - - # Returns an array of maintainer email addresses for the package +atom+ - def get_maintainers(atom) - raise(ArgumentError, "Invalid package atom") unless Portage.valid_atom?(atom) - raise(ArgumentError, "Cannot find metadata") unless File.exist? File.join(portdir, atom, 'metadata.xml') - - x = Nokogiri::XML(File.read(File.join(portdir, atom, 'metadata.xml'))) - - maintainers = [] - - x.xpath('/pkgmetadata/maintainer/email').each {|m| maintainers << m.content } - - if maintainers.empty? - if x.path('/pkgmetadata/comment()').text.include? "maintainer-needed" - maintainers = "maintainer-needed@gentoo.org" - else - raise(ArgumentError, "No Maintainer Information Found") - end - end - - maintainers - end - - # Returns information from the portage metadata cache - # Values: :depend, :rdepend, :slot, :src_uri, :restrict, :homepage, - # :license, :description, :keywords, :iuse, :required_use, - # :pdepend, :provide, :eapi, :properties, :defined_phases - # as per portage/pym/portage/cache/metadata.py (database.auxdbkey_order) - # - # @param [String] atom Package atom (without version, see next parameter) - # @param [String] version Desired version, tries to use the last available one (as decided by a rather stupid technique) - # @return [Hash{Symbol => String, Array}] A hash with all available metadata (see above for keys) - def get_metadata(atom, version = :latest) - raise(ArgumentError, "Invalid package atom") unless Portage.valid_atom?(atom) - raise(ArgumentError, "Invalid version string") if version.to_s.include? '..' - - items = { - 'DEFINED_PHASES' => :defined_phases, - 'DEPEND' => :depend, - 'DESCRIPTION' => :description, - 'EAPI' => :eapi, - 'HOMEPAGE' => :homepage, - 'IUSE' => :iuse, - 'KEYWORDS' => :keywords, - 'LICENSE' => :license, - 'PDEPEND' => :pdepend, - 'PROPERTIES' => :properties, - 'RDEPEND' => :rdepend, - 'RESTRICT' => :restrict, - 'REQUIRED_USE' => :required_use, - 'SLOT' => :slot, - 'SRC_URI' => :src_uri - } - - valid_keys = items.keys - - # List of metadata items to split at space - split_keys = ['SRC_URI', 'IUSE', 'KEYWORDS', 'PROPERTIES', 'DEFINED_PHASES'] - - cat, pkg = atom.split('/', 2) - r = Regexp.compile('^(\\w+)=([^\n]*)') - result = {} - - Dir.chdir(File.join(Glsamaker::Portage.portdir, 'metadata', 'md5-cache', cat)) do - if version == :latest - f = File.open(Dir.glob("#{pkg}-[0-9]*").last, 'r') - else - f = File.open(File.join("#{pkg}-#{version}"), 'r') - end - - while f.gets - if (match = r.match($_)) != nil and valid_keys.include? match[1] - if split_keys.include? match[1] - result[items[match[1]]] = match[2].split(' ') - else - result[items[match[1]]] = match[2] - end - end - end - - f.close - end - result - end - end - -end diff --git a/lib/glsamaker/spelling.rb b/lib/glsamaker/spelling.rb deleted file mode 100644 index cc30cc8..0000000 --- a/lib/glsamaker/spelling.rb +++ /dev/null @@ -1,48 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2009-2011 Alex Legler -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -module Glsamaker - class Spelling - class << self - def init - dic = File.join(Rails.root, 'vendor', 'dictionaries', 'en_US.dic') - aff = File.join(Rails.root, 'vendor', 'dictionaries', 'en_US.aff') - - @runspell = Runspell.new(aff, dic) - end - - def check(word) - init if @runspell.nil? - @runspell.check(word) - end - - def suggest(word) - init if @runspell.nil? - @runspell.suggest(word) - end - - # Checks a string for spelling, before_marker and after_maker are put around the misspelled words - def check_string(string, before_marker, after_marker) - result = [] - string.split(/\b/).each do |word| - if word =~ /^[\s,.-:(){}\[\]<>]*$/ - result << word - elsif check(word) - result << word - else - result << before_marker.html_safe + word + after_marker.html_safe - end - end - - result.join - end - end - end -end diff --git a/lib/glsamaker/xml.rb b/lib/glsamaker/xml.rb deleted file mode 100644 index 2b0e375..0000000 --- a/lib/glsamaker/xml.rb +++ /dev/null @@ -1,31 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2010 Alex Legler -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. - -module Glsamaker - module XML - module_function - def indent(xml, options = {:indent => 2}) - command = GLSAMAKER_XMLINDENT - raise "xmlindent either does not exist or is not executable." unless File.executable? command.split(' ', 2)[0] - - command += " -i#{Integer options[:indent]}" if options.has_key? :indent - command += " -l#{Integer options[:maxcols]}" if options.has_key? :maxcols - - # \r\n will make problems while converting - xml.gsub!("\r", "") - - IO.popen(command, 'r+') do |io| - io.write xml - io.close_write - io.read - end - end - end -end diff --git a/lib/kramdown_ext.rb b/lib/kramdown_ext.rb deleted file mode 100644 index e41013e..0000000 --- a/lib/kramdown_ext.rb +++ /dev/null @@ -1,20 +0,0 @@ -module Kramdown - module Converter - class Xml < Html - NOENTITY_MAP = { - :mdash => '---', - :ndash => '--', - :hellip => '...', - :laquo_space => '<< ', - :raquo_space => ' >>', - :laquo => '<', - :raquo => '>' - } - - # Overriding to do nothing. We don't want typographic symbols replaced - def convert_typographic_sym(el, opts) - NOENTITY_MAP[el.value] - end - end - end -end diff --git a/lib/tasks/.gitkeep b/lib/tasks/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/lib/tasks/cve.rake b/lib/tasks/cve.rake deleted file mode 100644 index dbdc7a8..0000000 --- a/lib/tasks/cve.rake +++ /dev/null @@ -1,366 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2010–15 Alex Legler -# Copyright (C) 2020 Max Magorsch -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. -libs = %w( json nokogiri zlib stringio ) -libs << File.join(File.dirname(__FILE__), '..', 'bugzilla') -libs << File.join(File.dirname(__FILE__), '..', 'glsamaker') -libs << File.join(File.dirname(__FILE__), 'utils') - -libs.each { |lib| require lib } - -TMPDIR = File.join(File.dirname(__FILE__), '..', '..', 'tmp') -# What year are the first CVEs from? -YEAR = (ENV['START_YEAR'] || 2004).to_i -BASEURL = 'https://nvd.nist.gov/feeds/json/cve/1.1/nvdcve-1.1-%s.json.gz' - -DEBUG = ENV.key? 'DEBUG' -VERBOSE = (ENV.key?('VERBOSE') || DEBUG) -QUIET = ENV.key? 'QUIET' - -fail "I can't be quiet and verbose at the same time..." if QUIET && VERBOSE - -namespace :cve do - - desc 'Destroy all CVEs and CPEs' - task destroy_all: [:environment, 'db:load_config'] do - CveReference.destroy_all - Cve.destroy_all - Cpe.destroy_all - end - - - desc 'Print all CVEs' - task print_all: [:environment, 'db:load_config'] do - Cve.find_each do |cve| - puts cve.cve_id + ",\"" + cve.summary + "\"," + (cve.cvss || "") + "," + cve.state + "," + cve.published_at.to_formatted_s(:iso8601) + "," + cve.last_changed_at.to_formatted_s(:iso8601) + "," + cve.created_at.to_formatted_s(:iso8601) + "," + cve.updated_at.to_formatted_s(:iso8601) - end - end - - - desc 'Full CVE data import' - task full_import: [:environment, 'db:load_config'] do - Rails.cache.write(CVE_CACHE_LAST_IMPORT, Time.now.utc) - start_ts = Time.now - - (YEAR..Date.today.year).each do |year| - info 'Processing CVEs from '.bold + year.to_s.purple - - jsondata = status 'Downloading' do - gunzip_str Glsamaker::HTTP.get(BASEURL % year) - end - - json = status 'Loading JSON' do - JSON.parse(jsondata) - end - - cves = json["CVE_Items"] - create_cves(cves) - - puts - end - - info 'done'.green - info "(#{Time.now - start_ts} seconds)" - end - - - desc 'Incrementally update last CVEs' - task update: :environment do - Rails.cache.write(CVE_CACHE_LAST_IMPORT, Time.now.utc) - info 'Running incremental CVE data update...' - - jsondata = status 'Downloading' do - gunzip_str Glsamaker::HTTP.get(BASEURL % 'modified') - end - - json = status 'Loading JSON' do - JSON.parse(jsondata) - end - - cves = json["CVE_Items"] - update_cves(cves) - end - - - desc 'Update all CVEs' - task update_all: :environment do - Rails.cache.write(CVE_CACHE_LAST_IMPORT, Time.now.utc) - info 'Running complete CVE data update...' - - (YEAR..Date.today.year).each do |year| - info 'Processing CVEs from '.bold + year.to_s.purple - - jsondata = status 'Downloading' do - gunzip_str Glsamaker::HTTP.get(BASEURL % year) - end - - json = status 'Loading JSON' do - JSON.parse(jsondata) - end - - cves = json["CVE_Items"] - update_cves(cves) - end - end - -end - - -# -# Update the given cve -# -def create_cve(cve) - summary = cve.dig('cve', 'description', 'description_data', 0, 'value') - _cve = Cve.create( - :cve_id => cve.dig('cve', 'CVE_data_meta', 'ID'), - :summary => summary, - :cvss => cve.dig('impact', 'baseMetricV2', 'cvssV2', 'vectorString'), - :published_at => DateTime.parse(cve['publishedDate']), - :last_changed_at => DateTime.parse(cve['lastModifiedDate']), - :state => (summary =~ /^\*\* REJECT \*\*/ ? 'REJECTED' : 'NEW') - ) - - if cve.dig('references', 'reference_data') - cve.dig('references', 'reference_data').each do |ref| - CveReference.create( - :cve => _cve, - :source => ref['refsource'], - :title => ref['name'], - :uri => ref['url'] - ) - end - end - - cve.dig('configurations', 'nodes').each do |node| - if node.key?('cpe_match') - node['cpe_match'].each do |cpe_match| - cpe_str = cpe_match['cpe23Uri'] - - cpe = Cpe.where(:cpe => cpe_str).first - cpe ||= Cpe.create(:cpe => cpe_str) - - _cve.cpes << cpe - end - elsif node.key?('children') - node['children'].each do |child| - if child.key?('cpe_match') - child['cpe_match'].each do |cpe_match| - cpe_str = cpe_match['cpe23Uri'] - - cpe = Cpe.where(:cpe => cpe_str).first - cpe ||= Cpe.create(:cpe => cpe_str) - - _cve.cpes << cpe - end - end - end - end - end -end - - -# -# Create the all given cves -# -def create_cves(cves) - processed_cves = 0 - info "#{cves.size.to_s.purple} CVEs (one dot equals 100, purple dot equals 500)" - - cves.each do |cve| - unless VERBOSE || QUIET - - if processed_cves % 500 == 0 - print '.'.purple - else - print '.' if processed_cves % 100 == 0 - end - end - - puts cve.dig('cve', 'CVE_data_meta', 'ID').to_s.purple if VERBOSE - - begin - create_cve(cve) - rescue ActiveRecord::StatementInvalid => e - # Ignore dupes, ONLY do that for the full db update! - raise e unless e.message =~ /Duplicate entry/ - end - - processed_cves += 1 - STDOUT.flush - end -end - - -# -# Update the all given cves -# -def update_cves(cves) - start_ts = Time.now - processed_cves = created_cves = updated_cves = 0 - - info "#{cves.size.to_s.purple} CVEs (one dot equals 100, purple dot equals 500)" - - cves.each do |cve| - unless VERBOSE || QUIET - if processed_cves % 500 == 0 - print '.'.purple - else - print '.' if processed_cves % 100 == 0 - end - end - - puts cve.dig('cve', 'CVE_data_meta', 'ID').to_s.purple if VERBOSE - - c = Cve.find_by_cve_id cve.dig('cve', 'CVE_data_meta', 'ID') - - if c.nil? - debug 'Creating CVE.' - create_cve(cve) - created_cves += 1 - else - last_changed_at = Time.parse(cve['lastModifiedDate']).utc - - if last_changed_at.to_i > c.last_changed_at.to_i - debug 'Updating CVE. Timestamp changed.' - summary = cve.dig('cve', 'description', 'description_data', 0, 'value') - c.attributes = { - cve_id: cve.dig('cve','CVE_data_meta','ID'), - summary: summary, - cvss: cve.dig('impact', 'baseMetricV2', 'cvssV2', 'vectorString'), - published_at: DateTime.parse(cve['publishedDate']), - last_changed_at: DateTime.parse(cve['lastModifiedDate']), - } - - c.state = 'REJECTED' if summary =~ /^\*\* REJECT \*\*/ - c.save! - - db_references = [] - xml_references = [] - - if cve.dig 'references', 'reference_data' - cve.dig('references', 'reference_data').each do |ref| - xml_references << [ - :source => ref['refsource'], - :title => ref['name'], - :uri => ref['url'] - ] - end - end - - c.references.each do |ref| - db_references << [ref.source, ref.title, ref.uri] - end - - rem = db_references - xml_references - debug "Removing references: #{rem.inspect}" - - rem.each do |item| - ref = c.references.where(['source = ? AND title = ? AND uri = ?', *item]).first - debug ref - c.references.delete(ref) - ref.destroy - end - - add = xml_references - db_references - debug "Ading references: #{add.inspect}" - - add.each do |item| - c.references.create( - source: item[0], - title: item[1], - uri: item[2] - ) - end - - db_cpes = [] - xml_cpes = [] - - cve.dig('configurations', 'nodes').each do |node| - if node.key?('cpe_match') - node['cpe_match'].each do |cpe_match| - xml_cpes << cpe_match['cpe23Uri'] - end - elsif node.key?('children') - node['children'].each do |child| - if child.key?('cpe_match') - child['cpe_match'].each do |cpe_match| - xml_cpes << cpe_match['cpe23Uri'] - end - end - end - end - end - - c.cpes.each do |prod| - db_cpes << prod.cpe - end - - rem = db_cpes - xml_cpes - debug "Removing CPEs: #{rem.inspect}" - - rem.each do |item| - c.cpes.delete(Cpe.find_by_cpe(item)) - end - - add = xml_cpes - db_cpes - debug "Ading CPEs: #{add.inspect}" - - add.each do |item| - cpe = Cpe.where(cpe: item).first - cpe ||= Cpe.create(cpe: item) - - c.cpes << cpe - end - - c.save! - updated_cves += 1 - end - end - - processed_cves += 1 - STDOUT.flush - end - - info '' - - info "(#{Time.now - start_ts} seconds, #{created_cves} new CVE entries, #{updated_cves} updated CVE entries)" -end - - -# -# Run something, and display a status info around it -# -def status(message) - fail ArgumentError, 'I want a block :(' unless block_given? - - print "#{message}....." unless QUIET - STDOUT.flush - - stuff = yield - print "\b" * 5 + ' done.'.green + "\n" unless QUIET - stuff -end - - -def debug(msg) - $stderr.puts msg if DEBUG -end - - -def info(msg) - puts msg unless QUIET -end - -# -# unzip the given string -# -def gunzip_str(str) - Zlib::GzipReader.new(StringIO.new(str)).read -end diff --git a/lib/tasks/import.rake b/lib/tasks/import.rake deleted file mode 100644 index ec34f91..0000000 --- a/lib/tasks/import.rake +++ /dev/null @@ -1,256 +0,0 @@ -require 'rexml/document' -require 'nokogiri' -require 'net/http' -require 'uri' -require 'date' - -namespace :import do - - desc "Import Request Files" - task :requests => :environment do - info "Importing GLSA requests" - - glsa_req_dir = ENV['GLSA_REQ_DIR'] - if glsa_req_dir == nil - puts "Please, set GLSA_REQ_DIR" - exit(-1) - end - - glsa_list = Array.new - Glsa.all.each do |glsa| - glsa_list.push glsa.glsa_id - end - - default_user = User.first - if default_user == nil - raise "No users defined!" - end - - Dir.glob(glsa_req_dir + "/*.xml").each do |filename| - req_f = File.new(filename) - doc = REXML::Document.new req_f - - root = doc.root - glsa_req_id = root.attributes['id'][0..7] - - if not glsa_list.include? glsa_req_id - puts "Processing GLSA Request #{glsa_req_id}" - - glsa = Glsa.new - glsa.glsa_id = glsa_req_id - glsa.status = 'request' - - root.elements.each('metadata') do |meta| - user = meta.text.strip - user = User.where(:login => user) - - if user.length > 0 - user = user[0] - else - user = default_user - end - - glsa.requester = user if meta.attributes['tag'] == 'requester' - - end - - unless glsa.save - raise "Errors occurred while saving the GLSA object: #{glsa.errors.full_messages.join ', '}" - end - - root.elements.each('metadata/metadata/metadata') do |comm| - puts comm.text.strip() - - comment = glsa.comments.new - comment.user_id = glsa.requester - comment.rating = 'neutral' - comment.text = comm.text.strip - - unless comment.save - raise "Error. #{comment.errors.full_messages.join ', '}" - end - end - - #It's time for the revision - revision = glsa.revisions.new - revision.revid = 1 - revision.user = glsa.requester - revision.title = root.elements['title'].text - revision.impact = root.elements['impact'].attributes['type'] - revision.product = root.elements['product'].attributes['type'] - revision.resolution = root.elements['resolution'].text - revision.workaround = root.elements['workaround'].text - revision.description = root.elements['description'].text - revision.is_release = false - revision.severity = root.elements['impact'].attributes['type'] - - unless revision.save - #Clean up - glsa.delete - raise "Errors occurred while saving the Revision object: #{revision.errors.full_messages.join ', '}" - end - - #Let's grab the bugs - root.elements.each('bug') do |bug| - Bug.create( - :bug_id => bug.text, - :revision_id => revision - ) - end - - end - end - end - - desc "Import Advisory Files" - task :advisories => :environment do - info "Importing old GLSAs from www.gentoo.org" - - #Lets grab the IDs we have in the DB, the see - #if we already processed them - glsa_list = Array.new - Glsa.all.each do |glsa| - glsa_list.push glsa.glsa_id - end - - GLSA_URL = "https://www.gentoo.org/rdf/en/glsa-index.rdf" - GLSA_URL_BASE = "https://www.gentoo.org/security/en/glsa/glsa-%s.xml?passthru=1" - - default_user = User.first - if default_user == nil - raise "No users defined!" - end - - #Let's parse the XML and get the advisories ID - index = Nokogiri::XML(Glsamaker::HTTP.get(GLSA_URL)) - index.remove_namespaces! - root_idx = index.root - ids = Array.new - - root_idx.xpath('item').each do |elem| - url = elem.at_xpath('./link').content - elem.at_xpath('./title').content =~ /GLSA\s(\d{6})-(\d{1,3})\s\(.*/ - id = "#{$1}-#{$2}" - ids << id - end - - ids.reverse_each do |id| - #if id no in glsa_list, then process the url - if not glsa_list.include? id - puts "Processing GLSA Advisory #{id}" - - xml = index = Nokogiri::XML(Glsamaker::HTTP.get(GLSA_URL_BASE % id)) - root = xml.root - - #Lets create the GLSA in the DB - glsa = Glsa.new - glsa.glsa_id = id - glsa.status = 'release' - glsa.first_released_at = DateTime.parse(root.at_xpath('./announced').content) - - #Lets take a look at users in Metadata - root.xpath('metadata').each do |meta| - user = meta.content.strip() - user = User.where(:login => user) - - if user.length > 0 - user = user[0] - else - user = default_user - end - - glsa.submitter = user if meta['tag'] == 'submitter' - glsa.requester = user if meta['tag'] == 'requester' - glsa.bugreadymaker = user if meta['tag'] == 'bugReady' - end - - #For old GLSAs with no metadata - if glsa.submitter == nil - glsa.submitter = default_user - end - - if glsa.requester == nil - glsa.requester = default_user - end - - unless glsa.save - raise "Errors occurred while saving the GLSA object: #{glsa.errors.full_messages.join ', '}" - end - - #Lets create the Revision in the DB - revision = Revision.new - - revision.glsa = glsa - revision.user = glsa.submitter - revision.revid = 1 - revision.release_revision = root.at_xpath('./revised').content.split(':')[1].strip.to_i - revision.title = root.at_xpath('./title').content - revision.impact = root.at_xpath('./impact').children.to_xml(:indent => 0) - revision.product = root.at_xpath('./product').content - revision.synopsis = root.at_xpath('./synopsis').children.to_xml(:indent => 0) - revision.resolution = root.at_xpath('./resolution').children.to_xml(:indent => 0) - revision.workaround = root.at_xpath('./workaround').children.to_xml(:indent => 0) - revision.description = root.at_xpath('./description').children.to_xml(:indent => 0) - revision.is_release = true - revision.severity = root.at_xpath('./impact')['type'] - - #Old GLSAs may not have a background tag - begin - revision.background = root.at_xpath('./background').content.strip - rescue - revision.background = nil - end - - #Old GLSAs may not have an access tag - begin - revision.access = root.at_xpath('./access').content.strip - rescue - revision.access = nil - end - - unless revision.save - #Clean up - glsa.delete - raise "Errors occurred while saving the Revision object: #{revision.errors.full_messages.join ', '}" - end - - #Let's grab the bugs - root.xpath('bug').each do |bug| - revision.bugs.create( - :bug_id => bug.content.to_i - ) - end - - #Let's grab the references - root.xpath('references/uri').each do |uri| - revision.references.create( - :url => uri['link'], - :title => uri.content - ) - end - - #Let's grab the packages - root.xpath('affected/package').each do |pkg_info| - pkg_info.children.each do |inner| - if inner.is_a? Nokogiri::XML::Node - auto = true - if inner['auto'] == 'n' - auto = false - end - - revision.packages.create( - :my_type => inner.node_name, - :atom => pkg_info['name'], - :version => inner.content, - :comp => Package.reverse_comp(inner['range']), - :arch => pkg_info['arch'], - :automatic => auto - ) - - end - end - end - end - end - end -end diff --git a/lib/tasks/rcov.rake b/lib/tasks/rcov.rake deleted file mode 100644 index bb602e4..0000000 --- a/lib/tasks/rcov.rake +++ /dev/null @@ -1,81 +0,0 @@ -def run_coverage(files) - rm_f "coverage" - rm_f "coverage.data" - - # turn the files we want to run into a string - if files.empty? - puts "No files were specified for testing" - return - end - - files = files.join(" ") - - if RUBY_PLATFORM =~ /darwin/ - exclude = '--exclude "gems/*" --exclude "Library/Frameworks/*"' - elsif RUBY_PLATFORM =~ /java/ - exclude = '--exclude "rubygems/*,jruby/*,parser*,gemspec*,_DELEGATION*,eval*,recognize_optimized*,yaml,yaml/*,fcntl"' - else - exclude = '--exclude "gems/*"' - end - # rake test:units:rcov SHOW_ONLY=models,controllers,lib,helpers - # rake test:units:rcov SHOW_ONLY=m,c,l,h - if ENV['SHOW_ONLY'] - params = String.new - show_only = ENV['SHOW_ONLY'].to_s.split(',').map{|x|x.strip} - if show_only.any? - reg_exp = [] - for show_type in show_only - reg_exp << case show_type - when 'm', 'models' then 'app\/models' - when 'c', 'controllers' then 'app\/controllers' - when 'h', 'helpers' then 'app\/helpers' - when 'l', 'lib' then 'lib' - else - show_type - end - end - reg_exp.map!{ |m| "(#{m})" } - params << " --exclude \"^(?!#{reg_exp.join('|')})\"" - end - exclude = exclude + params - end - - rcov_bin = RUBY_PLATFORM =~ /java/ ? "jruby -S rcov" : "rcov" - rcov = "#{rcov_bin} --rails -Ilib:test --sort coverage --text-report #{exclude}" - puts - puts - puts "Running tests..." - cmd = "#{rcov} #{files}" - puts cmd - begin - sh cmd - rescue Exception => e - $stderr.puts "#{e.message}" - $stderr.puts "The tests likely failed. Not aborting to not break Hudson builds" - end -end - -namespace :test do - - desc "Measures unit, functional, and integration test coverage" - task :coverage do - run_coverage Dir["test/unit/**/*.rb", "test/functional/**/*.rb", "test/integration/**/*.rb"] - end - - namespace :coverage do - desc "Runs coverage on unit tests" - task :units do - run_coverage Dir["test/unit/**/*.rb"] - end - - desc "Runs coverage on functional tests" - task :functionals do - run_coverage Dir["test/functional/**/*.rb"] - end - - desc "Runs coverage on integration tests" - task :integration do - run_coverage Dir["test/integration/**/*.rb"] - end - end -end diff --git a/lib/tasks/utils.rb b/lib/tasks/utils.rb deleted file mode 100644 index 3e49702..0000000 --- a/lib/tasks/utils.rb +++ /dev/null @@ -1,35 +0,0 @@ -# ===GLSAMaker v2 -# Copyright (C) 2009-2011 Alex Legler -# Copyright (C) 2009 Pierre-Yves Rofes -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# For more information, see the LICENSE file. -# - -class String - def purple - ansi 35 - end - - def red - ansi 31 - end - - def green - ansi 32 - end - - def bold - ansi 1 - end - - private - def ansi(code) - code = Integer(code) - "\033[1;#{code}m#{self}\033[0m" - end -end diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..692cf07 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,8682 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@csstools/convert-colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", + "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==" + }, + "@csstools/sass-import-resolve": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/sass-import-resolve/-/sass-import-resolve-1.0.0.tgz", + "integrity": "sha512-pH4KCsbtBLLe7eqUrw8brcuFO8IZlN36JjdKlOublibVdAIPHCzEnpBWOVUXK5sCf+DpBi8ZtuWtjF0srybdeA==" + }, + "@gentoo/tyrian": { + "version": "git+https://anongit.gentoo.org/git/sites/tyrian-theme.git#5b6b8e70fb7067b54fa4f2fac3966ae74fcb713c", + "from": "git+https://anongit.gentoo.org/git/sites/tyrian-theme.git", + "requires": { + "autoprefixer": "^7.2.4", + "bootstrap": "4.3.1", + "font-awesome": "4.7.0", + "jquery": "^3.3.1", + "popper.js": "1.14.7" + }, + "dependencies": { + "autoprefixer": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz", + "integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==", + "requires": { + "browserslist": "^2.11.3", + "caniuse-lite": "^1.0.30000805", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^6.0.17", + "postcss-value-parser": "^3.2.3" + } + }, + "popper.js": { + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.14.7.tgz", + "integrity": "sha512-4q1hNvoUre/8srWsH7hnoSJ5xVmIL4qgz+s4qf2TnJIMyZFUFMGH+9vE7mXynAlHSZ/NdTmmow86muD0myUkVQ==" + } + } + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/node": { + "version": "12.12.31", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.31.tgz", + "integrity": "sha512-T+wnJno8uh27G9c+1T+a1/WYCHzLeDqtsGJkoEdSp2X8RTh3oOCZQcUnjAx90CS8cmmADX51O0FI/tu9s0yssg==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" + }, + "adjust-sourcemap-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz", + "integrity": "sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA==", + "requires": { + "assert": "1.4.1", + "camelcase": "5.0.0", + "loader-utils": "1.2.3", + "object-path": "0.11.4", + "regex-parser": "2.2.10" + }, + "dependencies": { + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + } + } + }, + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arity-n": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", + "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=" + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "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==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "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=" + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "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=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "requires": { + "util": "0.10.3" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=" + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "autoprefixer": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.5.tgz", + "integrity": "sha512-URo6Zvt7VYifomeAfJlMFnYDhow1rk2bufwkbamPEAtQFcL11moLk4PnR7n9vlu7M+BkXAZkHFA0mIcY7tjQFg==", + "requires": { + "browserslist": "^4.11.0", + "caniuse-lite": "^1.0.30001036", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.27", + "postcss-value-parser": "^4.0.3" + }, + "dependencies": { + "browserslist": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.0.tgz", + "integrity": "sha512-WqEC7Yr5wUH5sg6ruR++v2SGOQYpyUdYYd4tZoAq1F7y+QXoLoYGXVbxhtaIqWmAJjtNTRjVD3HuJc1OXTel2A==", + "requires": { + "caniuse-lite": "^1.0.30001035", + "electron-to-chromium": "^1.3.380", + "node-releases": "^1.1.52", + "pkg-up": "^3.1.0" + } + }, + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", + "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "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=", + "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==", + "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==", + "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==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "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=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "requires": { + "inherits": "~2.0.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "bootstrap": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.3.1.tgz", + "integrity": "sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "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=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "2.11.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", + "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", + "requires": { + "caniuse-lite": "^1.0.30000792", + "electron-to-chromium": "^1.3.30" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "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" + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + } + } + }, + "caniuse-lite": { + "version": "1.0.30001038", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001038.tgz", + "integrity": "sha512-zii9quPo96XfOiRD4TrfYGs+QsGZpb2cGiMAzPjtf/hpFgB6zCPZgJb7I1+EATeMw/o+lG8FyRAnI+CWStHcaQ==" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "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==", + "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=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "coffeescript": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-2.5.1.tgz", + "integrity": "sha512-J2jRPX0eeFh5VKyVnoLrfVFgLZtnnmp96WQSLAS8OrLm2wtQLcnikYKe1gViJKDH7vucjuhHvBKKBP3rKcD1tQ==" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "compose-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", + "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", + "requires": { + "arity-n": "^1.0.4" + } + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "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.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "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-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "core-js": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", + "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==" + }, + "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=" + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, + "css-blank-pseudo": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", + "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", + "requires": { + "postcss": "^7.0.5" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "css-has-pseudo": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", + "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^5.0.0-rc.4" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "css-loader": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz", + "integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==", + "requires": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.23", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.1.1", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.0.2", + "schema-utils": "^2.6.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", + "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "css-prefers-color-scheme": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", + "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", + "requires": { + "postcss": "^7.0.5" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "cssdb": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", + "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==" + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "requires": { + "array-find-index": "^1.0.1" + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "d3": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", + "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=" + }, + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "d3-axis": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", + "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" + }, + "d3-brush": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.5.tgz", + "integrity": "sha512-rEaJ5gHlgLxXugWjIkolTA0OyMvw8UWU1imYXy1v642XyyswmI1ybKOv05Ft+ewq+TFmdliD3VuK0pRp1VT/5A==", + "requires": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + }, + "d3-color": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.0.tgz", + "integrity": "sha512-TzNPeJy2+iEepfiL92LAAB7fvnp/dV2YwANPVHdDWmYMm23qIJBYww3qT8I8C1wXrmrg4UWs7BKc2tKIgyjzHg==" + }, + "d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, + "d3-drag": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", + "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "requires": { + "d3-dispatch": "1", + "d3-selection": "1" + } + }, + "d3-ease": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.6.tgz", + "integrity": "sha512-SZ/lVU7LRXafqp7XtIcBdxnWl8yyLpgOmzAk0mWBI9gXNzLDx5ybZgnRbH9dN/yY5tzVBqCQ9avltSnqVwessQ==" + }, + "d3-format": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.4.tgz", + "integrity": "sha512-TWks25e7t8/cqctxCmxpUuzZN11QxIA7YrMbram94zMQ0PXjE4LVIMe/f6a4+xxL8HQ3OsAFULOINQi1pE62Aw==" + }, + "d3-geo": { + "version": "1.11.9", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.11.9.tgz", + "integrity": "sha512-9edcH6J3s/Aa3KJITWqFJbyB/8q3mMlA9Fi7z6yy+FAYMnRaxmC7jBhUnsINxVWD14GmqX3DK8uk7nV6/Ekt4A==", + "requires": { + "d3-array": "1" + } + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "d3-quadtree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", + "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" + }, + "d3-scale": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.7.tgz", + "integrity": "sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==", + "requires": { + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-color": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + }, + "d3-selection": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.1.tgz", + "integrity": "sha512-BTIbRjv/m5rcVTfBs4AMBLKs4x8XaaLkwm28KWu9S2vKNqXkXt2AH2Qf0sdPZHjFxcWg/YL53zcqAz+3g4/7PA==" + }, + "d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "requires": { + "d3-path": "1" + } + }, + "d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + }, + "d3-time-format": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.2.3.tgz", + "integrity": "sha512-RAHNnD8+XvC4Zc4d2A56Uw0yJoM7bsvOlJR33bclxq399Rak/b9bhvu/InjxdWhPtkgU53JJcleJTGkNRnN6IA==", + "requires": { + "d3-time": "1" + } + }, + "d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + }, + "d3-transition": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", + "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", + "requires": { + "d3-color": "1", + "d3-dispatch": "1", + "d3-ease": "1", + "d3-interpolate": "1", + "d3-selection": "^1.1.0", + "d3-timer": "1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "datatables.net": { + "version": "1.10.20", + "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.10.20.tgz", + "integrity": "sha512-4E4S7tTU607N3h0fZPkGmAtr9mwy462u+VJ6gxYZ8MxcRIjZqHy3Dv1GNry7i3zQCktTdWbULVKBbkAJkuHEnQ==", + "requires": { + "jquery": ">=1.7" + }, + "dependencies": { + "jquery": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz", + "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==" + } + } + }, + "datatables.net-bs4": { + "version": "1.10.20", + "resolved": "https://registry.npmjs.org/datatables.net-bs4/-/datatables.net-bs4-1.10.20.tgz", + "integrity": "sha512-kQmMUMsHMOlAW96ztdoFqjSbLnlGZQ63iIM82kHbmldsfYdzuyhbb4hTx6YNBi481WCO3iPSvI6YodNec46ZAw==", + "requires": { + "datatables.net": "1.10.20", + "jquery": ">=1.7" + }, + "dependencies": { + "jquery": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz", + "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==" + } + } + }, + "datatables.net-buttons": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/datatables.net-buttons/-/datatables.net-buttons-1.6.1.tgz", + "integrity": "sha512-Lcgvi/xGB2X0jr1n/uQMmg43Z1JQO6aaGjPHO+sAQAMfBGBi9cK1hhfM4Vg8gzC5fz3sW4QrtjAdKvOPnQ1A3w==", + "requires": { + "datatables.net": "^1.10.15", + "jquery": ">=1.7" + } + }, + "datatables.net-buttons-bs4": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/datatables.net-buttons-bs4/-/datatables.net-buttons-bs4-1.6.1.tgz", + "integrity": "sha512-PdE1vrnRIeX+p++wnbpdnr97kgTCs+DDomtTccsQvMrFm29lxVa7uTz1awasfGRrCrJzpb5HjPrPJBzbGHrUyg==", + "requires": { + "datatables.net-bs4": "^1.10.15", + "datatables.net-buttons": "1.6.1", + "jquery": ">=1.7" + } + }, + "datatables.net-dt": { + "version": "1.10.20", + "resolved": "https://registry.npmjs.org/datatables.net-dt/-/datatables.net-dt-1.10.20.tgz", + "integrity": "sha512-D+65buDke96a3WlJo2re+SbcAVfjPh2nsFZG198Vbkz3i1wKPdB+wkV2K07qYIiIpypcXWOnD2pz3MvnUqM9Tw==", + "requires": { + "datatables.net": "1.10.20", + "jquery": ">=1.7" + }, + "dependencies": { + "jquery": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz", + "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==" + } + } + }, + "datatables.net-responsive": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/datatables.net-responsive/-/datatables.net-responsive-2.2.3.tgz", + "integrity": "sha512-8D6VtZcyuH3FG0Hn5A4LPZQEOX3+HrRFM7HjpmsQc/nQDBbdeBLkJX4Sh/o1nzFTSneuT1Wh/lYZHVPpjcN+Sw==", + "requires": { + "datatables.net": "^1.10.15", + "jquery": ">=1.7" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "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=" + }, + "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=" + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "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==", + "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==", + "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==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "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=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.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==" + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "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 + }, + "electron-to-chromium": { + "version": "1.3.386", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.386.tgz", + "integrity": "sha512-M7JHfp32Bq6Am59AWgglh2d3nqe6y8Y94Vcb/AXUsO3DGvKUHYI5ML9+U5oNShfdOEfurrrjKSoSgFt2mz7mpw==" + }, + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", + "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "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==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "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=" + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", + "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", + "dev": true + }, + "events": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==" + }, + "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" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "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=", + "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=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "exports-loader": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/exports-loader/-/exports-loader-0.7.0.tgz", + "integrity": "sha512-RKwCrO4A6IiKm0pG3c9V46JxIHcDplwwGJn6+JJ1RcVnh/WSGJa0xkmk5cRVtgOPzCAtTMGj2F7nluh9L0vpSA==", + "requires": { + "loader-utils": "^1.1.0", + "source-map": "0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.0.tgz", + "integrity": "sha1-D+llA6yGpa213mP05BKuSHLNvoY=" + } + } + }, + "expose-loader": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/expose-loader/-/expose-loader-0.7.5.tgz", + "integrity": "sha512-iPowgKUZkTPX5PznYsmifVj9Bob0w2wTHVkt/eYNPSzyebkUgIedmskf/kcfEIWpiWjg3JRjnW+a17XypySMuw==" + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "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.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "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==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "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=", + "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=", + "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==", + "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==", + "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==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "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" + } + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" + }, + "file-loader": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-5.1.0.tgz", + "integrity": "sha512-u/VkLGskw3Ue59nyOwUwXI/6nuBCo7KBkniB/l7ICwr/7cPNGsL1WCXUp3GB0qgOOKU1TiP49bv4DZF/LJqprg==", + "requires": { + "loader-utils": "^1.4.0", + "schema-utils": "^2.5.0" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "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=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==" + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.10.0.tgz", + "integrity": "sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ==", + "dev": true, + "requires": { + "debug": "^3.0.0" + }, + "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" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "font-awesome": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", + "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "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=", + "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 + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", + "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.4", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": 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.6", + "bundled": 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, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "bundled": true, + "optional": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.3", + "bundled": true, + "optional": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.3.3", + "bundled": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.3", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.8", + "bundled": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": 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, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "bundled": 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.7.1", + "bundled": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "optional": 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, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "optional": true + } + } + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "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" + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "requires": { + "globule": "^1.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "requires": { + "global-prefix": "^3.0.0" + }, + "dependencies": { + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + } + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "globule": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.1.tgz", + "integrity": "sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g==", + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.12", + "minimatch": "~3.0.2" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "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=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", + "dev": true + }, + "http-proxy": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", + "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "requires": { + "postcss": "^7.0.14" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "requires": { + "resolve-from": "^3.0.0" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imports-loader": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/imports-loader/-/imports-loader-0.8.0.tgz", + "integrity": "sha512-kXWL7Scp8KQ4552ZcdVTeaQCZSLW+e6nJfp3cwUMB673T7Hr98Xjx5JK+ql7ADlJUvj1JS5O01RLbKoutN5QDQ==", + "requires": { + "loader-utils": "^1.0.2", + "source-map": "^0.6.1" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "in-publish": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", + "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==" + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "requires": { + "repeating": "^2.0.0" + } + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==" + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "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=", + "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=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "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=", + "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==" + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "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=", + "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=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "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==" + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "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=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.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==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "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==" + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jquery": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz", + "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==" + }, + "jquery-ujs": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jquery-ujs/-/jquery-ujs-1.2.2.tgz", + "integrity": "sha1-ao7xAg5rbdo4W5CkvdwSjCHFY5c=", + "requires": { + "jquery": ">=1.8.0" + } + }, + "js-base64": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz", + "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "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==" + }, + "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=" + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "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-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "loglevel": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz", + "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==", + "dev": true + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "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=", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "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" + } + }, + "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": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "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" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "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.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" + }, + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "requires": { + "mime-db": "1.43.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "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==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "requires": { + "minimist": "^1.2.5" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "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" + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node-forge": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", + "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", + "dev": true + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" + } + } + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "requires": { + "inherits": "2.0.3" + } + } + } + }, + "node-releases": { + "version": "1.1.52", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.52.tgz", + "integrity": "sha512-snSiT1UypkgGt2wxPqS6ImEUICbNCMb31yaxWrOLXjhlt2z2/IBpaOxzONExqSm4y5oLnAqjjRWu+wsDzK5yNQ==", + "requires": { + "semver": "^6.3.0" + } + }, + "node-sass": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.1.tgz", + "integrity": "sha512-TTWFx+ZhyDx1Biiez2nB0L3YrCZ/8oHagaDalbuBSlqXgUPsdkUSzJsVxeDO9LtPB49+Fh3WQl3slABo6AotNw==", + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash": "^4.17.15", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.13.2", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "^2.2.4", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "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" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" + }, + "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=" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "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=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "object-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", + "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-path": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", + "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "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.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "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=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } + }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "requires": { + "find-up": "^3.0.0" + } + }, + "popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" + }, + "portfinder": { + "version": "1.0.25", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", + "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.1" + }, + "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" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "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=" + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "postcss-advanced-variables": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-advanced-variables/-/postcss-advanced-variables-3.0.1.tgz", + "integrity": "sha512-JqVjfkmqPoazMobVeQYzbt7djcDGJfMlpwBd9abTqmzWR40tvIUMXpTU5w3riqz7h+wYPY7V6GF8BIXL/ybEfg==", + "requires": { + "@csstools/sass-import-resolve": "^1.0.0", + "postcss": "^7.0.6" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-atroot": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/postcss-atroot/-/postcss-atroot-0.1.3.tgz", + "integrity": "sha1-Z1LAIwx0UUBUk0WysOMOvtoBpAU=", + "requires": { + "postcss": "^5.0.5" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "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" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-attribute-case-insensitive": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", + "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^6.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-color-functional-notation": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", + "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-color-gray": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", + "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-color-hex-alpha": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", + "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", + "requires": { + "postcss": "^7.0.14", + "postcss-values-parser": "^2.0.1" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-color-mod-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", + "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-color-rebeccapurple": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", + "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-custom-media": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", + "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", + "requires": { + "postcss": "^7.0.14" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-custom-properties": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", + "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", + "requires": { + "postcss": "^7.0.17", + "postcss-values-parser": "^2.0.1" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-custom-selectors": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", + "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-dir-pseudo-class": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", + "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-double-position-gradients": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", + "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", + "requires": { + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-env-function": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", + "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-extend-rule": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-extend-rule/-/postcss-extend-rule-2.0.0.tgz", + "integrity": "sha512-dgr1GJzW3lUBczZJO5Fm51rktn34Uc99xR1uQyC2Td8JPep/Y+TRx6TjK0yngikOd4LxV1xyuohMMpcaOBgrfA==", + "requires": { + "postcss": "^6.0.22", + "postcss-nesting": "^5.0.0" + } + }, + "postcss-flexbugs-fixes": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.0.tgz", + "integrity": "sha512-QRE0n3hpkxxS/OGvzOa+PDuy4mh/Jg4o9ui22/ko5iGYOG3M5dfJabjnAZjTdh2G9F85c7Hv8hWcEDEKW/xceQ==", + "requires": { + "postcss": "^7.0.26" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-focus-visible": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", + "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-focus-within": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", + "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-font-variant": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz", + "integrity": "sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==", + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-gap-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", + "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-image-set-function": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", + "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-import": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", + "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", + "requires": { + "postcss": "^7.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-initial": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.2.tgz", + "integrity": "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==", + "requires": { + "lodash.template": "^4.5.0", + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-lab-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", + "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-load-config": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", + "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-logical": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", + "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-media-minmax": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", + "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "requires": { + "postcss": "^7.0.5" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", + "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.16", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", + "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-nested": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-4.2.1.tgz", + "integrity": "sha512-AMayXX8tS0HCp4O4lolp4ygj9wBn32DJWXvG6gCv+ZvJrEa00GUxJcJEEzMh87BIe6FrWdYkpR2cuyqHKrxmXw==", + "requires": { + "postcss": "^7.0.21", + "postcss-selector-parser": "^6.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-nesting": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-5.0.0.tgz", + "integrity": "sha512-Yoe3w2mcVslnEJl5zLyz1yBxCFUpYu138apEEOCwS2HRdDw/TDxTwD1fXBrIarL8J1cPzHfVwO1m40B2/UpGCw==", + "requires": { + "postcss": "^6.0.21" + } + }, + "postcss-overflow-shorthand": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", + "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-page-break": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", + "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-place": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", + "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-preset-env": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", + "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", + "requires": { + "autoprefixer": "^9.6.1", + "browserslist": "^4.6.4", + "caniuse-lite": "^1.0.30000981", + "css-blank-pseudo": "^0.1.4", + "css-has-pseudo": "^0.10.0", + "css-prefers-color-scheme": "^3.1.1", + "cssdb": "^4.4.0", + "postcss": "^7.0.17", + "postcss-attribute-case-insensitive": "^4.0.1", + "postcss-color-functional-notation": "^2.0.1", + "postcss-color-gray": "^5.0.0", + "postcss-color-hex-alpha": "^5.0.3", + "postcss-color-mod-function": "^3.0.3", + "postcss-color-rebeccapurple": "^4.0.1", + "postcss-custom-media": "^7.0.8", + "postcss-custom-properties": "^8.0.11", + "postcss-custom-selectors": "^5.1.2", + "postcss-dir-pseudo-class": "^5.0.0", + "postcss-double-position-gradients": "^1.0.0", + "postcss-env-function": "^2.0.2", + "postcss-focus-visible": "^4.0.0", + "postcss-focus-within": "^3.0.0", + "postcss-font-variant": "^4.0.0", + "postcss-gap-properties": "^2.0.0", + "postcss-image-set-function": "^3.0.1", + "postcss-initial": "^3.0.0", + "postcss-lab-function": "^2.0.1", + "postcss-logical": "^3.0.0", + "postcss-media-minmax": "^4.0.0", + "postcss-nesting": "^7.0.0", + "postcss-overflow-shorthand": "^2.0.0", + "postcss-page-break": "^2.0.0", + "postcss-place": "^4.0.1", + "postcss-pseudo-class-any-link": "^6.0.0", + "postcss-replace-overflow-wrap": "^3.0.0", + "postcss-selector-matches": "^4.0.0", + "postcss-selector-not": "^4.0.0" + }, + "dependencies": { + "browserslist": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.0.tgz", + "integrity": "sha512-WqEC7Yr5wUH5sg6ruR++v2SGOQYpyUdYYd4tZoAq1F7y+QXoLoYGXVbxhtaIqWmAJjtNTRjVD3HuJc1OXTel2A==", + "requires": { + "caniuse-lite": "^1.0.30001035", + "electron-to-chromium": "^1.3.380", + "node-releases": "^1.1.52", + "pkg-up": "^3.1.0" + } + }, + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-nesting": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", + "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", + "requires": { + "postcss": "^7.0.2" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-property-lookup": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-property-lookup/-/postcss-property-lookup-2.0.0.tgz", + "integrity": "sha512-KUb53a7UZWDMVb0SRODOonc4H1wlbgQ0VfYwmJaR1xWPorhariEz0U7x0ri3W/imFs6HqLYWP7hl2yMvi5Ty+w==", + "requires": { + "object-assign": "^4.0.1", + "postcss": "^6.0.6", + "tcomb": "^3.2.21" + } + }, + "postcss-pseudo-class-any-link": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", + "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-replace-overflow-wrap": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", + "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-selector-matches": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", + "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-selector-not": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz", + "integrity": "sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ==", + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "postcss-values-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", + "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", + "requires": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "precss": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/precss/-/precss-4.0.0.tgz", + "integrity": "sha512-cRPZMKpHLZXR6gJlrXRjJe7SQMf+wYxg6rKp+TwYsYABjApSj9z8E8yIlagqADaWyikeIZttaNU6xqSjFIAP/g==", + "requires": { + "postcss": "^7.0.6", + "postcss-advanced-variables": "^3.0.0", + "postcss-atroot": "^0.1.3", + "postcss-extend-rule": "^2.0.0", + "postcss-nested": "^4.1.0", + "postcss-preset-env": "^6.4.0", + "postcss-property-lookup": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "requires": { + "pify": "^2.3.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "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=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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==", + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regex-parser": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz", + "integrity": "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==" + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "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=" + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "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.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "dependencies": { + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + } + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "resolve-url-loader": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz", + "integrity": "sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ==", + "requires": { + "adjust-sourcemap-loader": "2.0.0", + "camelcase": "5.3.1", + "compose-function": "3.0.3", + "convert-source-map": "1.7.0", + "es6-iterator": "2.0.3", + "loader-utils": "1.2.3", + "postcss": "7.0.21", + "rework": "1.0.1", + "rework-visit": "1.0.0", + "source-map": "0.6.1" + }, + "dependencies": { + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "postcss": { + "version": "7.0.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", + "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "rework": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", + "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", + "requires": { + "convert-source-map": "^0.3.3", + "css": "^2.0.0" + }, + "dependencies": { + "convert-source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", + "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=" + } + } + }, + "rework-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", + "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "requires": { + "aproba": "^1.1.1" + } + }, + "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==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "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==" + }, + "sass-graph": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", + "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^7.0.0" + } + }, + "sass-loader": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", + "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", + "requires": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.2.3", + "neo-async": "^2.6.1", + "schema-utils": "^2.6.1", + "semver": "^6.3.0" + } + }, + "schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==", + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", + "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "dev": true, + "requires": { + "node-forge": "0.9.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "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.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "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 + } + } + }, + "serialize-javascript": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", + "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==" + }, + "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": { + "http-errors": { + "version": "1.6.3", + "resolved": "https://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" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "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=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "simple-html-tokenizer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.1.1.tgz", + "integrity": "sha1-BcLuxXn//+FFoDCsJs/qYbmA+r4=" + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "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=", + "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=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "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==", + "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=", + "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==", + "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==", + "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==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "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.4.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "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.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "requires": { + "atob": "^2.1.2", + "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.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "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=" + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "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==" + }, + "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==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" + }, + "spdy": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", + "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "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==", + "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=" + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "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" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "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=", + "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 + }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "requires": { + "readable-stream": "^2.0.1" + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "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==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "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=", + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "requires": { + "get-stdin": "^4.0.1" + } + }, + "style-loader": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.1.3.tgz", + "integrity": "sha512-rlkH7X/22yuwFYK357fMN/BxYOorfnfq0eD7+vqlemSK4wEcejFF1dg4zxP0euBW8NrYx2WZzZ8PPFevr7D+Kw==", + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.6.4" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "svg-inline-loader": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/svg-inline-loader/-/svg-inline-loader-0.8.2.tgz", + "integrity": "sha512-kbrcEh5n5JkypaSC152eGfGcnT4lkR0eSfvefaUJkLqgGjRQJyKDvvEE/CCv5aTSdfXuc+N98w16iAojhShI3g==", + "requires": { + "loader-utils": "^1.1.0", + "object-assign": "^4.0.1", + "simple-html-tokenizer": "^0.1.1" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "taucharts": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/taucharts/-/taucharts-2.8.0.tgz", + "integrity": "sha512-rUubG1QQwIR114pIpzKkJYYrtCQnn7rC3mrTfbCSV9HYQPCcXiwodwL+NNwxET5YrJcqcWXqevUK74xhWbxMRA==", + "requires": { + "d3-array": "^1.2.1", + "d3-axis": "^1.0.12", + "d3-brush": "^1.0.6", + "d3-color": "^1.2.3", + "d3-format": "^1.3.2", + "d3-geo": "^1.11.3", + "d3-quadtree": "^1.0.6", + "d3-scale": "^1.0.6", + "d3-selection": "^1.4.0", + "d3-shape": "^1.3.4", + "d3-time": "^1.0.11", + "d3-time-format": "^2.1.3", + "d3-transition": "^1.2.0", + "topojson-client": "^3.0.0" + } + }, + "tcomb": { + "version": "3.2.29", + "resolved": "https://registry.npmjs.org/tcomb/-/tcomb-3.2.29.tgz", + "integrity": "sha512-di2Hd1DB2Zfw6StGv861JoAF5h/uQVu/QJp2g8KVbtfKnoHdBQl5M32YWq6mnSYBQ1vFFrns5B1haWJL7rKaOQ==" + }, + "terser": { + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.7.tgz", + "integrity": "sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + } + }, + "terser-webpack-plugin": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", + "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "requires": { + "setimmediate": "^1.0.4" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "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=", + "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=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "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=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "topojson-client": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", + "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", + "requires": { + "commander": "2" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "requires": { + "glob": "^7.1.2" + } + }, + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "turbolinks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/turbolinks/-/turbolinks-5.2.0.tgz", + "integrity": "sha512-pMiez3tyBo6uRHFNNZoYMmrES/IaGgMhQQM+VFF36keryjb5ms0XkVpmKHkfW/4Vy96qiGW3K9bz0tF5sK9bBw==" + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "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=", + "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=", + "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=", + "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=" + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + }, + "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==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "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=" + } + } + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "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==" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "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.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "v8-compile-cache": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", + "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==" + }, + "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==", + "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=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, + "watchpack": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.1.tgz", + "integrity": "sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA==", + "requires": { + "chokidar": "^2.1.8", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webpack": { + "version": "4.42.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.1.tgz", + "integrity": "sha512-SGfYMigqEfdGchGhFFJ9KyRpQKnipvEvjc1TwrXEPCM6H5Wywu10ka8o3KGrMzSMxMQKt8aCHUFh5DaQ9UmyRg==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "webpack-cli": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.11.tgz", + "integrity": "sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g==", + "requires": { + "chalk": "2.4.2", + "cross-spawn": "6.0.5", + "enhanced-resolve": "4.1.0", + "findup-sync": "3.0.0", + "global-modules": "2.0.0", + "import-local": "2.0.0", + "interpret": "1.2.0", + "loader-utils": "1.2.3", + "supports-color": "6.1.0", + "v8-compile-cache": "2.0.3", + "yargs": "13.2.4" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "requires": { + "invert-kv": "^2.0.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yargs": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", + "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.0" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", + "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "3.10.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz", + "integrity": "sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.2.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.6", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.25", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.7", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.4.0", + "spdy": "^4.0.1", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "12.0.5" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "websocket-driver": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.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==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + } + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "requires": { + "camelcase": "^3.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..ef0de17 --- /dev/null +++ b/package.json @@ -0,0 +1,41 @@ +{ + "dependencies": { + "@gentoo/tyrian": "git+https://anongit.gentoo.org/git/sites/tyrian-theme.git", + "autoprefixer": "^9.7.4", + "bootstrap": "4.3.1", + "coffeescript": "^2.5.0", + "core-js": "^3.6.4", + "css-loader": "^3.4.2", + "d3": "^3.5.6", + "datatables.net": "^1.10.20", + "datatables.net-bs4": "^1.10.20", + "datatables.net-buttons": "^1.6.1", + "datatables.net-buttons-bs4": "^1.6.1", + "datatables.net-dt": "^1.10.20", + "datatables.net-responsive": "^2.2.3", + "exports-loader": "^0.7.0", + "expose-loader": "^0.7.5", + "file-loader": "^5.1.0", + "imports-loader": "^0.8.0", + "jquery": "^3.4.1", + "jquery-ujs": "^1.2.2", + "node-sass": "^4.13.1", + "popper.js": "^1.16.0", + "postcss-flexbugs-fixes": "^4.2.0", + "postcss-import": "^12.0.1", + "postcss-loader": "^3.0.0", + "precss": "^4.0.0", + "regenerator-runtime": "^0.13.5", + "resolve-url-loader": "^3.1.1", + "sass-loader": "^8.0.2", + "style-loader": "^1.1.3", + "svg-inline-loader": "^0.8.2", + "taucharts": "^2.8.0", + "turbolinks": "^5.2.0", + "webpack": "^4.42.0", + "webpack-cli": "^3.3.11" + }, + "devDependencies": { + "webpack-dev-server": "^3.10.1" + } +} diff --git a/pkg/app/handler/about/index.go b/pkg/app/handler/about/index.go new file mode 100644 index 0000000..edeb45b --- /dev/null +++ b/pkg/app/handler/about/index.go @@ -0,0 +1,28 @@ +// Used to show the about pages of the application + +package about + +import ( + "glsamaker/pkg/app/handler/authentication/utils" + "net/http" +) + +// Show renders a template to show the main about page of the application +func Show(w http.ResponseWriter, r *http.Request) { + user := utils.GetAuthenticatedUser(r) + renderAboutTemplate(w, user) +} + +// ShowSearch renders a template to show the about +// page about the search functionality +func ShowSearch(w http.ResponseWriter, r *http.Request) { + user := utils.GetAuthenticatedUser(r) + renderAboutSearchTemplate(w, user) +} + +// ShowCLI renders a template to show the about +// page about the command line tool +func ShowCLI(w http.ResponseWriter, r *http.Request) { + user := utils.GetAuthenticatedUser(r) + renderAboutCLITemplate(w, user) +} diff --git a/pkg/app/handler/about/utils.go b/pkg/app/handler/about/utils.go new file mode 100644 index 0000000..77f1383 --- /dev/null +++ b/pkg/app/handler/about/utils.go @@ -0,0 +1,58 @@ +// miscellaneous utility functions used for the about pages of the application + +package about + +import ( + "glsamaker/pkg/models" + "glsamaker/pkg/models/users" + "html/template" + "net/http" +) + +// renderAboutTemplate renders all templates used for the main about page +func renderAboutTemplate(w http.ResponseWriter, user *users.User) { + templates := template.Must( + template.Must( + template.New("Show"). + ParseGlob("web/templates/layout/*.tmpl")). + ParseGlob("web/templates/about/*.tmpl")) + + templates.ExecuteTemplate(w, "about.tmpl", createPageData("about", user)) +} + +// renderAboutSearchTemplate renders all templates used for +// the about page about the search functionality +func renderAboutSearchTemplate(w http.ResponseWriter, user *users.User) { + templates := template.Must( + template.Must( + template.New("Show"). + ParseGlob("web/templates/layout/*.tmpl")). + ParseGlob("web/templates/about/*.tmpl")) + + templates.ExecuteTemplate(w, "aboutSearch.tmpl", createPageData("about", user)) +} + +// renderAboutCLITemplate renders all templates used for +// the about page about the command line tool +func renderAboutCLITemplate(w http.ResponseWriter, user *users.User) { + templates := template.Must( + template.Must( + template.New("Show"). + ParseGlob("web/templates/layout/*.tmpl")). + ParseGlob("web/templates/about/*.tmpl")) + + templates.ExecuteTemplate(w, "aboutCLI.tmpl", createPageData("about", user)) +} + +// createPageData creates the data used in the templates of the about pages +func createPageData(page string, user *users.User) interface{} { + return struct { + Page string + Application *models.GlobalSettings + User *users.User + }{ + Page: page, + Application: models.GetDefaultGlobalSettings(), + User: user, + } +} diff --git a/pkg/app/handler/account/password.go b/pkg/app/handler/account/password.go new file mode 100644 index 0000000..5cdb9e5 --- /dev/null +++ b/pkg/app/handler/account/password.go @@ -0,0 +1,109 @@ +// Used to show the change password page + +package account + +import ( + "glsamaker/pkg/app/handler/authentication/utils" + "glsamaker/pkg/database/connection" + "glsamaker/pkg/logger" + "glsamaker/pkg/models" + "glsamaker/pkg/models/users" + "html/template" + "net/http" +) + +// ChangePassword changes the password of a user in case of a valid POST request. +// In case of a GET request the dialog for the password change is displayed +func ChangePassword(w http.ResponseWriter, r *http.Request) { + + user := utils.GetAuthenticatedUser(r) + + if r.Method == "POST" { + + r.ParseForm() + + oldPassword := getStringParam("oldPassword", r) + newPassword := getStringParam("newPassword", r) + confirmedNewPassword := getStringParam("confirmedNewPassword", r) + + if newPassword != confirmedNewPassword { + renderPasswordChangeTemplate(w, r, user, false, "The passwords you have entered do not match") + return + } + + if !user.CheckPassword(oldPassword) { + renderPasswordChangeTemplate(w, r, user, false, "The old password you have entered is not correct") + return + } + + err := user.UpdatePassword(newPassword) + if err != nil { + renderPasswordChangeTemplate(w, r, user, false, "Internal error during hash calculation.") + return + } + + wasForcedToChange := user.ForcePasswordRotation + user.ForcePasswordRotation = false + + _, err = connection.DB.Model(user).Column("password").WherePK().Update() + _, err = connection.DB.Model(user).Column("force_password_rotation").WherePK().Update() + + if err != nil { + logger.Info.Println("error during password update") + logger.Info.Println(err) + renderPasswordChangeTemplate(w, r, user, false, "Internal error during password update.") + return + } + + if wasForcedToChange { + http.Redirect(w, r, "/", 301) + return + } + + updatedUser := utils.GetAuthenticatedUser(r) + + renderPasswordChangeTemplate(w, r, updatedUser, true, "Your password has been changed successfully.") + return + } + + renderPasswordChangeTemplate(w, r, user, false, "") +} + +// renderPasswordChangeTemplate renders all templates used for the login page +func renderPasswordChangeTemplate(w http.ResponseWriter, r *http.Request, user *users.User, success bool, message string) { + + templates := template.Must( + template.Must( + template.New("Show"). + ParseGlob("web/templates/layout/*.tmpl")). + ParseGlob("web/templates/account/password/*.tmpl")) + + templates.ExecuteTemplate(w, "password.tmpl", createPasswordChangeData("account", user, success, message)) +} + +// createPasswordChangeData creates the data used in the template of the password change page +func createPasswordChangeData(page string, user *users.User, success bool, message string) interface{} { + + return struct { + Page string + Application *models.GlobalSettings + User *users.User + Success bool + Message string + }{ + Page: page, + Application: models.GetDefaultGlobalSettings(), + User: user, + Success: success, + Message: message, + } +} + +// returns the value of a parameter with the given key of a POST request +func getStringParam(key string, r *http.Request) string { + if len(r.Form[key]) > 0 { + return r.Form[key][0] + } + + return "" +} diff --git a/pkg/app/handler/account/twofactor.go b/pkg/app/handler/account/twofactor.go new file mode 100644 index 0000000..4d87426 --- /dev/null +++ b/pkg/app/handler/account/twofactor.go @@ -0,0 +1,200 @@ +package account + +import ( + "glsamaker/pkg/app/handler/authentication/totp" + "glsamaker/pkg/app/handler/authentication/utils" + "glsamaker/pkg/database/connection" + "glsamaker/pkg/logger" + "glsamaker/pkg/models" + "glsamaker/pkg/models/users" + "bytes" + "github.com/duo-labs/webauthn/webauthn" + "html/template" + "net/http" +) + +// landing page + +func TwoFactorAuth(w http.ResponseWriter, r *http.Request) { + user := utils.GetAuthenticatedUser(r) + render2FATemplate(w, r, user) +} + +// webauthn + +func ActivateWebAuthn(w http.ResponseWriter, r *http.Request) { + user := utils.GetAuthenticatedUser(r) + + if user.WebauthnCredentials != nil && len(user.WebauthnCredentials) >= 0 { + updatedUser := &users.User{ + Id: user.Id, + IsUsingTOTP: false, + IsUsingWebAuthn: true, + Show2FANotice: false, + } + + _, err := connection.DB.Model(updatedUser).Column("is_using_totp").WherePK().Update() + _, err = connection.DB.Model(updatedUser).Column("is_using_web_authn").WherePK().Update() + _, err = connection.DB.Model(updatedUser).Column("show2fa_notice").WherePK().Update() + + if err != nil { + logger.Error.Println("Error activating webauthn") + logger.Error.Println(err) + } + + } + + http.Redirect(w, r, "/account/2fa", 301) +} + +func DisableWebAuthn(w http.ResponseWriter, r *http.Request) { + + user := utils.GetAuthenticatedUser(r) + + updatedUser := &users.User{ + Id: user.Id, + IsUsingWebAuthn: false, + } + + _, err := connection.DB.Model(updatedUser).Column("is_using_web_authn").WherePK().Update() + + if err != nil { + logger.Error.Println("Error disabling webauthn") + logger.Error.Println(err) + } + + http.Redirect(w, r, "/account/2fa", 301) +} + +// totp + +func ActivateTOTP(w http.ResponseWriter, r *http.Request) { + user := utils.GetAuthenticatedUser(r) + + updatedUser := &users.User{ + Id: user.Id, + IsUsingTOTP: true, + IsUsingWebAuthn: false, + Show2FANotice: false, + } + + _, err := connection.DB.Model(updatedUser).Column("is_using_totp").WherePK().Update() + _, err = connection.DB.Model(updatedUser).Column("is_using_web_authn").WherePK().Update() + _, err = connection.DB.Model(updatedUser).Column("show2fa_notice").WherePK().Update() + + if err != nil { + logger.Error.Println("Error activating totp") + logger.Error.Println(err) + } + + http.Redirect(w, r, "/account/2fa", 301) +} + +func DisableTOTP(w http.ResponseWriter, r *http.Request) { + user := utils.GetAuthenticatedUser(r) + + updatedUser := &users.User{ + Id: user.Id, + IsUsingTOTP: false, + } + + _, err := connection.DB.Model(updatedUser).Column("is_using_totp").WherePK().Update() + + if err != nil { + logger.Error.Println("Error updating 2fa") + logger.Error.Println(err) + } + + http.Redirect(w, r, "/account/2fa", 301) +} + +func VerifyTOTP(w http.ResponseWriter, r *http.Request) { + user := utils.GetAuthenticatedUser(r) + token := getToken(r) + + validToken := "false" + + if totp.IsValidTOTPToken(user, token) { + validToken = "true" + } + + w.Write([]byte(validToken)) +} + +func Disable2FANotice(w http.ResponseWriter, r *http.Request) { + + user := utils.GetAuthenticatedUser(r) + + updatedUser := &users.User{ + Id: user.Id, + Show2FANotice: false, + } + + _, err := connection.DB.Model(updatedUser).Column("show2fa_notice").WherePK().Update() + + if err != nil { + logger.Error.Println("Error disabling 2fa notice") + logger.Error.Println(err) + } + + w.Write([]byte("ok")) +} + +// utility functions + +func getToken(r *http.Request) string { + err := r.ParseForm() + if err != nil { + return "" + } + return r.Form.Get("token") +} + +// renderIndexTemplate renders all templates used for the login page +func render2FATemplate(w http.ResponseWriter, r *http.Request, user *users.User) { + + funcMap := template.FuncMap{ + "WebAuthnID": WebAuthnCredentialID, + "CredentialName": GetCredentialName, + } + + templates := template.Must( + template.Must( + template.New("Show"). + Funcs(funcMap). + ParseGlob("web/templates/layout/*.tmpl")). + ParseGlob("web/templates/account/*.tmpl")) + + templates.ExecuteTemplate(w, "2fa.tmpl", createPageData("account", user)) +} + +// createPageData creates the data used in the template of the landing page +func createPageData(page string, user *users.User) interface{} { + return struct { + Page string + Application *models.GlobalSettings + QRcode string + User *users.User + }{ + Page: page, + Application: models.GetDefaultGlobalSettings(), + QRcode: user.TOTPQRCode, + User: user, + } +} + +// WebAuthnCredentials returns credentials owned by the user +func WebAuthnCredentialID(cred webauthn.Credential) []byte { + return cred.ID[:5] +} + +func GetCredentialName(user *users.User, cred webauthn.Credential) string { + + for _, WebauthnCredentialName := range user.WebauthnCredentialNames { + if bytes.Compare(WebauthnCredentialName.Id, cred.ID) == 0 { + return WebauthnCredentialName.Name + } + } + + return "Unnamed Authenticator" +} diff --git a/pkg/app/handler/admin/edit.go b/pkg/app/handler/admin/edit.go new file mode 100644 index 0000000..8cf9291 --- /dev/null +++ b/pkg/app/handler/admin/edit.go @@ -0,0 +1,293 @@ +package admin + +import ( + "glsamaker/pkg/app/handler/authentication" + "glsamaker/pkg/app/handler/authentication/totp" + "glsamaker/pkg/app/handler/authentication/utils" + "glsamaker/pkg/database/connection" + "glsamaker/pkg/logger" + "glsamaker/pkg/models/users" + "math/rand" + "net/http" + "strconv" + "strings" + "time" +) + +// Show renders a template to show the landing page of the application +func EditUsers(w http.ResponseWriter, r *http.Request) { + + user := utils.GetAuthenticatedUser(r) + + if !user.Permissions.Admin.ManageUsers { + authentication.AccessDenied(w, r) + return + } + + var allUsers []*users.User + connection.DB.Model(&allUsers).Order("email ASC").Select() + + if r.Method == "POST" { + + r.ParseForm() + + if !(getStringParam("edit", r) == "1") { + http.Redirect(w, r, "/admin", 301) + } + + userIds := getArrayParam("userId", r) + userNicks := getArrayParam("userNick", r) + userNames := getArrayParam("userName", r) + userEmails := getArrayParam("userEmail", r) + userPasswordRotations := getArrayParam("userPasswordRotation", r) + userForce2FA := getArrayParam("userForce2FA", r) + userActive := getArrayParam("userActive", r) + + newUserIndex := -1 + + for index, userId := range userIds { + + parsedUserId, err := strconv.ParseInt(userId, 10, 64) + + if err != nil { + continue + } + + count, _ := connection.DB.Model((*users.User)(nil)).Where("id = ?", parsedUserId).Count() + + // user is present + if count == 1 { + + updatedUser := users.User{ + Id: parsedUserId, + Email: userEmails[index], + Nick: userNicks[index], + Name: userNames[index], + //Badge: users.Badge{}, + ForcePasswordRotation: containsStr(userPasswordRotations, userId), + Force2FA: containsStr(userForce2FA, userId), + Disabled: !containsStr(userActive, userId), + } + + connection.DB.Model(&updatedUser). + Column("email"). + Column("nick"). + Column("name"). + Column("force_password_rotation"). + Column("force2fa"). + Column("disabled"). + WherePK().Update() + + } else { + + newUserIndex = index + + } + + } + + if newUserIndex != -1 { + + newPassword := generateNewPassword(14) + + createNewUser( + userNicks[newUserIndex], + userNames[newUserIndex], + userEmails[newUserIndex], + newPassword, + containsStr(userForce2FA, "-1"), + !containsStr(userActive, "-1")) + + var updatedUsers []*users.User + connection.DB.Model(&updatedUsers).Order("email ASC").Select() + + renderAdminNewUserTemplate(w, user, updatedUsers, userNicks[newUserIndex], newPassword) + return + + } else { + + http.Redirect(w, r, "/admin", 301) + return + + } + + } + + renderEditUsersTemplate(w, user, allUsers) +} + +// Show renders a template to show the landing page of the application +func EditPermissions(w http.ResponseWriter, r *http.Request) { + + user := utils.GetAuthenticatedUser(r) + + if !user.Permissions.Admin.ManageUsers { + authentication.AccessDenied(w, r) + return + } + + var allUsers []*users.User + connection.DB.Model(&allUsers).Order("email ASC").Select() + + if r.Method == "POST" { + + r.ParseForm() + + if !(getStringParam("edit", r) == "1") { + http.Redirect(w, r, "/admin", 301) + } + + glsaView := getArrayParam("glsa-view", r) + glsaUpdateBugs := getArrayParam("glsa-updateBugs", r) + glsaComment := getArrayParam("glsa-comment", r) + glsaCreate := getArrayParam("glsa-create", r) + glsaEdit := getArrayParam("glsa-edit", r) + glsaDelete := getArrayParam("glsa-delete", r) + glsaApprove := getArrayParam("glsa-approve", r) + glsaApproveOwnGlsa := getArrayParam("glsa-approveOwnGlsa", r) + glsaDecline := getArrayParam("glsa-decline", r) + glsaRelease := getArrayParam("glsa-release", r) + glsaConfidential := getArrayParam("glsa-confidential", r) + + cveView := getArrayParam("cve-view", r) + cveUpdateCVEs := getArrayParam("cve-updateCVEs", r) + cveComment := getArrayParam("cve-comment", r) + cveAddPackage := getArrayParam("cve-addPackage", r) + cveChangeState := getArrayParam("cve-changeState", r) + cveAssignBug := getArrayParam("cve-assignBug", r) + + adminView := getArrayParam("admin-view", r) + adminCreateTemplates := getArrayParam("admin-createTemplates", r) + adminGlobalSettings := getArrayParam("admin-globalSettings", r) + adminManageUsers := getArrayParam("admin-manageUsers", r) + + for _, changedUser := range allUsers { + + updatedUserPermissions := users.Permissions{ + Glsa: users.GlsaPermissions{ + View: containsInt(glsaView, changedUser.Id), + UpdateBugs: containsInt(glsaUpdateBugs, changedUser.Id), + Comment: containsInt(glsaComment, changedUser.Id), + Create: containsInt(glsaCreate, changedUser.Id), + Edit: containsInt(glsaEdit, changedUser.Id), + Approve: containsInt(glsaApprove, changedUser.Id), + ApproveOwnGlsa: containsInt(glsaApproveOwnGlsa, changedUser.Id), + Decline: containsInt(glsaDecline, changedUser.Id), + Delete: containsInt(glsaDelete, changedUser.Id), + Release: containsInt(glsaRelease, changedUser.Id), + Confidential: containsInt(glsaConfidential, changedUser.Id), + }, + CVETool: users.CVEToolPermissions{ + View: containsInt(cveView, changedUser.Id), + UpdateCVEs: containsInt(cveUpdateCVEs, changedUser.Id), + Comment: containsInt(cveComment, changedUser.Id), + AddPackage: containsInt(cveAddPackage, changedUser.Id), + ChangeState: containsInt(cveChangeState, changedUser.Id), + AssignBug: containsInt(cveAssignBug, changedUser.Id), + }, + Admin: users.AdminPermissions{ + View: containsInt(adminView, changedUser.Id), + CreateTemplates: containsInt(adminCreateTemplates, changedUser.Id), + ManageUsers: containsInt(adminManageUsers, changedUser.Id), + GlobalSettings: containsInt(adminGlobalSettings, changedUser.Id), + }, + } + + updatedUser := users.User{ + Id: changedUser.Id, + Permissions: updatedUserPermissions, + } + + connection.DB.Model(&updatedUser).Column("permissions").WherePK().Update() + } + + http.Redirect(w, r, "/admin", 301) + return + } + + renderEditPermissionsTemplate(w, user, allUsers) +} + +func containsInt(arr []string, element int64) bool { + return containsStr(arr, strconv.FormatInt(element, 10)) +} + +func containsStr(arr []string, element string) bool { + for _, a := range arr { + if a == element { + return true + } + } + return false +} + +func getStringParam(key string, r *http.Request) string { + if len(r.Form[key]) > 0 { + return r.Form[key][0] + } + + return "" +} + +func getArrayParam(key string, r *http.Request) []string { + return r.Form[key] +} + +func createNewUser(nick, name, email, password string, force2FA, disabled bool) { + + token, qrcode := totp.Generate("user@gentoo.org") + + badge := users.Badge{ + Name: "user", + Description: "Normal user", + Color: "#54487A", + } + + passwordParameters := users.Argon2Parameters{ + Type: "argon2id", + Time: 1, + Memory: 64 * 1024, + Threads: 4, + KeyLen: 32, + } + passwordParameters.GenerateSalt(32) + passwordParameters.GeneratePassword(password) + + defaultUser := &users.User{ + Email: email, + Nick: nick, + Name: name, + Password: passwordParameters, + Role: "user", + ForcePasswordChange: false, + TOTPSecret: token, + TOTPQRCode: qrcode, + IsUsingTOTP: false, + WebauthnCredentials: nil, + IsUsingWebAuthn: false, + Show2FANotice: true, + Badge: badge, + Disabled: disabled, + ForcePasswordRotation: true, + Force2FA: force2FA, + } + + _, err := connection.DB.Model(defaultUser).OnConflict("(id) DO Nothing").Insert() + if err != nil { + logger.Error.Println("Err during creating default admin user") + logger.Error.Println(err) + } +} + +func generateNewPassword(length int) string { + rand.Seed(time.Now().UnixNano()) + chars := []rune("ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ" + + "abcdefghijklmnopqrstuvwxyz" + + "0123456789" + + "!&!$%&/()=?") + var b strings.Builder + for i := 0; i < length; i++ { + b.WriteRune(chars[rand.Intn(len(chars))]) + } + return b.String() +} diff --git a/pkg/app/handler/admin/index.go b/pkg/app/handler/admin/index.go new file mode 100644 index 0000000..5f1f579 --- /dev/null +++ b/pkg/app/handler/admin/index.go @@ -0,0 +1,27 @@ +// Used to show the landing page of the application + +package admin + +import ( + "glsamaker/pkg/app/handler/authentication" + "glsamaker/pkg/app/handler/authentication/utils" + "glsamaker/pkg/database/connection" + "glsamaker/pkg/models/users" + "net/http" +) + +// Show renders a template to show the landing page of the application +func Show(w http.ResponseWriter, r *http.Request) { + + user := utils.GetAuthenticatedUser(r) + + if !user.Permissions.Admin.View { + authentication.AccessDenied(w, r) + return + } + + var users []*users.User + connection.DB.Model(&users).Order("email ASC").Select() + + renderAdminTemplate(w, user, users) +} diff --git a/pkg/app/handler/admin/passwordreset.go b/pkg/app/handler/admin/passwordreset.go new file mode 100644 index 0000000..e4d36b9 --- /dev/null +++ b/pkg/app/handler/admin/passwordreset.go @@ -0,0 +1,73 @@ +package admin + +import ( + "glsamaker/pkg/app/handler/authentication" + "glsamaker/pkg/app/handler/authentication/utils" + "glsamaker/pkg/database/connection" + "glsamaker/pkg/models/users" + "net/http" + "strconv" +) + +// Show renders a template to show the landing page of the application +func ResetPassword(w http.ResponseWriter, r *http.Request) { + + user := utils.GetAuthenticatedUser(r) + + if !user.Permissions.Admin.ManageUsers { + authentication.AccessDenied(w, r) + return + } + + userPasswordResetId := r.URL.Path[len("/admin/edit/password/reset/"):] + + parsedUserPasswordResetId, err := strconv.ParseInt(userPasswordResetId, 10, 64) + + if err != nil { + http.NotFound(w, r) + return + } + + selectedUser := &users.User{Id: parsedUserPasswordResetId} + err = connection.DB.Model(selectedUser).WherePK().Select() + + if err != nil || selectedUser == nil { + http.NotFound(w, r) + return + } + + if r.Method == "POST" { + + newPassword := generateNewPassword(14) + passwordParameters := users.Argon2Parameters{ + Type: "argon2id", + Time: 1, + Memory: 64 * 1024, + Threads: 4, + KeyLen: 32, + } + passwordParameters.GenerateSalt(32) + passwordParameters.GeneratePassword(newPassword) + + updatedUser := &users.User{ + Id: parsedUserPasswordResetId, + Password: passwordParameters, + ForcePasswordRotation: true, + } + + _, err = connection.DB.Model(updatedUser).Column("password").WherePK().Update() + _, err = connection.DB.Model(updatedUser).Column("force_password_rotation").WherePK().Update() + if err != nil { + http.NotFound(w, r) + return + } + + var updatedUsers []*users.User + connection.DB.Model(&updatedUsers).Order("email ASC").Select() + + renderAdminNewUserTemplate(w, user, updatedUsers, selectedUser.Nick, newPassword) + return + } + + renderPasswordResetTemplate(w, user, selectedUser.Id, selectedUser.Nick) +} diff --git a/pkg/app/handler/admin/utils.go b/pkg/app/handler/admin/utils.go new file mode 100644 index 0000000..85a25ec --- /dev/null +++ b/pkg/app/handler/admin/utils.go @@ -0,0 +1,112 @@ +// miscellaneous utility functions used for the landing page of the application + +package admin + +import ( + "glsamaker/pkg/models" + "glsamaker/pkg/models/users" + "html/template" + "net/http" +) + +// renderIndexTemplate renders all templates used for the landing page +func renderAdminTemplate(w http.ResponseWriter, user *users.User, allUsers []*users.User) { + templates := template.Must( + template.Must( + template.Must( + template.New("Show"). + ParseGlob("web/templates/layout/*.tmpl")). + ParseGlob("web/templates/admin/components/*.tmpl")). + ParseGlob("web/templates/admin/*.tmpl")) + + templates.ExecuteTemplate(w, "view.tmpl", createPageData("admin", user, allUsers, "", "")) +} + +// renderIndexTemplate renders all templates used for the landing page +func renderAdminNewUserTemplate(w http.ResponseWriter, user *users.User, allUsers []*users.User, newUserNick, newUserPass string) { + templates := template.Must( + template.Must( + template.Must( + template.New("Show"). + ParseGlob("web/templates/layout/*.tmpl")). + ParseGlob("web/templates/admin/components/*.tmpl")). + ParseGlob("web/templates/admin/*.tmpl")) + + templates.ExecuteTemplate(w, "view.tmpl", createPageData("admin", user, allUsers, newUserNick, newUserPass)) +} + +// renderIndexTemplate renders all templates used for the landing page +func renderEditUsersTemplate(w http.ResponseWriter, user *users.User, allUsers []*users.User) { + templates := template.Must( + template.Must( + template.Must( + template.New("Show"). + ParseGlob("web/templates/layout/*.tmpl")). + ParseGlob("web/templates/admin/components/*.tmpl")). + ParseGlob("web/templates/admin/edit/*.tmpl")) + + templates.ExecuteTemplate(w, "users.tmpl", createPageData("admin", user, allUsers, "", "")) +} + +// renderIndexTemplate renders all templates used for the landing page +func renderPasswordResetTemplate(w http.ResponseWriter, user *users.User, userId int64, userNick string) { + templates := template.Must( + template.Must( + template.New("Show"). + ParseGlob("web/templates/layout/*.tmpl")). + ParseGlob("web/templates/admin/passwordreset.tmpl")) + + templates.ExecuteTemplate(w, "passwordreset.tmpl", createPasswordResetData("admin", user, userId, userNick)) +} + +// renderIndexTemplate renders all templates used for the landing page +func renderEditPermissionsTemplate(w http.ResponseWriter, user *users.User, allUsers []*users.User) { + templates := template.Must( + template.Must( + template.Must( + template.New("Show"). + ParseGlob("web/templates/layout/*.tmpl")). + ParseGlob("web/templates/admin/components/*.tmpl")). + ParseGlob("web/templates/admin/edit/*.tmpl")) + + templates.ExecuteTemplate(w, "permissions.tmpl", createPageData("admin", user, allUsers, "", "")) +} + +// createPageData creates the data used in the template of the landing page +func createPageData(page string, user *users.User, allUsers []*users.User, newUserNick, newUserPassword string) interface{} { + return struct { + Page string + Application *models.GlobalSettings + User *users.User + Users []*users.User + NewUserNick string + NewUserPassword string + }{ + Page: page, + Application: models.GetDefaultGlobalSettings(), + User: user, + Users: allUsers, + NewUserNick: newUserNick, + NewUserPassword: newUserPassword, + } +} + +// createPageData creates the data used in the template of the landing page +func createPasswordResetData(page string, user *users.User, userId int64, userNick string) interface{} { + return struct { + Page string + Application *models.GlobalSettings + User *users.User + Users []*users.User + NewUserNick string + NewUserPassword string + UserId int64 + UserNick string + }{ + Page: page, + Application: models.GetDefaultGlobalSettings(), + User: user, + UserId: userId, + UserNick: userNick, + } +} diff --git a/pkg/app/handler/all/index.go b/pkg/app/handler/all/index.go new file mode 100644 index 0000000..ef6104a --- /dev/null +++ b/pkg/app/handler/all/index.go @@ -0,0 +1,40 @@ +// Used to show the landing page of the application + +package all + +import ( + "glsamaker/pkg/app/handler/authentication" + "glsamaker/pkg/app/handler/authentication/utils" + "glsamaker/pkg/database/connection" + "glsamaker/pkg/models" + "net/http" +) + +// Show renders a template to show the landing page of the application +func Show(w http.ResponseWriter, r *http.Request) { + + user := utils.GetAuthenticatedUser(r) + + if !user.Permissions.Glsa.View { + authentication.AccessDenied(w, r) + return + } + + var all []*models.Glsa + err := user.CanAccess(connection.DB.Model(&all). + Relation("Bugs"). + Relation("Creator"). + Relation("Comments")). + Select() + + if err != nil { + http.NotFound(w, r) + return + } + + for _, glsa := range all { + glsa.ComputeStatus(user) + } + + renderAllTemplate(w, user, all) +} diff --git a/pkg/app/handler/all/utils.go b/pkg/app/handler/all/utils.go new file mode 100644 index 0000000..a0cfc65 --- /dev/null +++ b/pkg/app/handler/all/utils.go @@ -0,0 +1,36 @@ +// miscellaneous utility functions used for the landing page of the application + +package all + +import ( + "glsamaker/pkg/models" + "glsamaker/pkg/models/users" + "html/template" + "net/http" +) + +// renderIndexTemplate renders all templates used for the landing page +func renderAllTemplate(w http.ResponseWriter, user *users.User, all []*models.Glsa) { + templates := template.Must( + template.Must( + template.New("Show"). + ParseGlob("web/templates/layout/*.tmpl")). + ParseGlob("web/templates/all/*.tmpl")) + + templates.ExecuteTemplate(w, "all.tmpl", createPageData("all", user, all)) +} + +// createPageData creates the data used in the template of the landing page +func createPageData(page string, user *users.User, all []*models.Glsa) interface{} { + return struct { + Page string + Application *models.GlobalSettings + User *users.User + All []*models.Glsa + }{ + Page: page, + Application: models.GetDefaultGlobalSettings(), + User: user, + All: all, + } +} diff --git a/pkg/app/handler/archive/index.go b/pkg/app/handler/archive/index.go new file mode 100644 index 0000000..61d77dd --- /dev/null +++ b/pkg/app/handler/archive/index.go @@ -0,0 +1,44 @@ +// Used to show the landing page of the application + +package archive + +import ( + "glsamaker/pkg/app/handler/authentication" + "glsamaker/pkg/app/handler/authentication/utils" + "glsamaker/pkg/database/connection" + "glsamaker/pkg/logger" + "glsamaker/pkg/models" + "net/http" +) + +// Show renders a template to show the landing page of the application +func Show(w http.ResponseWriter, r *http.Request) { + + user := utils.GetAuthenticatedUser(r) + + if !user.Permissions.Glsa.View { + authentication.AccessDenied(w, r) + return + } + + var glsas []*models.Glsa + err := user.CanAccess(connection.DB.Model(&glsas). + Where("type = ?", "glsa"). + Relation("Bugs"). + Relation("Creator"). + Relation("Comments")). + Select() + + if err != nil { + logger.Info.Println("Error during glsa selection") + logger.Info.Println(err) + http.NotFound(w, r) + return + } + + for _, glsa := range glsas { + glsa.ComputeStatus(user) + } + + renderArchiveTemplate(w, user, glsas) +} diff --git a/pkg/app/handler/archive/utils.go b/pkg/app/handler/archive/utils.go new file mode 100644 index 0000000..6653691 --- /dev/null +++ b/pkg/app/handler/archive/utils.go @@ -0,0 +1,36 @@ +// miscellaneous utility functions used for the landing page of the application + +package archive + +import ( + "glsamaker/pkg/models" + "glsamaker/pkg/models/users" + "html/template" + "net/http" +) + +// renderIndexTemplate renders all templates used for the landing page +func renderArchiveTemplate(w http.ResponseWriter, user *users.User, glsas []*models.Glsa) { + templates := template.Must( + template.Must( + template.New("Show"). + ParseGlob("web/templates/layout/*.tmpl")). + ParseGlob("web/templates/archive/*.tmpl")) + + templates.ExecuteTemplate(w, "archive.tmpl", createPageData("archive", user, glsas)) +} + +// createPageData creates the data used in the template of the landing page +func createPageData(page string, user *users.User, glsas []*models.Glsa) interface{} { + return struct { + Page string + Application *models.GlobalSettings + User *users.User + GLSAs []*models.Glsa + }{ + Page: page, + Application: models.GetDefaultGlobalSettings(), + User: user, + GLSAs: glsas, + } +} diff --git a/pkg/app/handler/authentication/accessDenied.go b/pkg/app/handler/authentication/accessDenied.go new file mode 100644 index 0000000..de06ab2 --- /dev/null +++ b/pkg/app/handler/authentication/accessDenied.go @@ -0,0 +1,10 @@ +package authentication + +import ( + "glsamaker/pkg/app/handler/authentication/templates" + "net/http" +) + +func AccessDenied(w http.ResponseWriter, r *http.Request) { + templates.RenderAccessDeniedTemplate(w, r) +} diff --git a/pkg/app/handler/authentication/auth_session/authsession.go b/pkg/app/handler/authentication/auth_session/authsession.go new file mode 100644 index 0000000..c86ca99 --- /dev/null +++ b/pkg/app/handler/authentication/auth_session/authsession.go @@ -0,0 +1,177 @@ +package auth_session + +import ( + "glsamaker/pkg/database/connection" + "glsamaker/pkg/logger" + "glsamaker/pkg/models" + "glsamaker/pkg/models/users" + "github.com/google/uuid" + "net/http" + "strings" + "time" +) + +func Create(w http.ResponseWriter, r *http.Request, user *users.User, bindSessionToIP bool, secondFactorMissing bool) { + sessionID := createSessionID() + sessionIP := "*" + expires := time.Now().AddDate(0, 1, 0) + + if bindSessionToIP { + sessionIP = getIP(r) + } + + if secondFactorMissing { + expires = time.Now().Add(10 * time.Minute) + } + + session := &models.Session{ + Id: sessionID, + UserId: user.Id, + IP: sessionIP, + SecondFactorMissing: secondFactorMissing, + Expires: expires, + } + + _, err := connection.DB.Model(session).OnConflict("(id) DO UPDATE").Insert() + if err != nil { + logger.Error.Println("Err during creating session") + logger.Error.Println(err) + } + + createSessionCookie(w, sessionID) +} + +func createSessionID() string { + id, _ := uuid.NewUUID() + return id.String() +} + +func createSessionCookie(w http.ResponseWriter, sessionID string) { + + expires := time.Now().AddDate(0, 1, 0) + + ck := http.Cookie{ + Name: "session", + Domain: "localhost", + Path: "/", + Expires: expires, + } + + ck.Value = sessionID + + http.SetCookie(w, &ck) + +} + +func GetUserId(sessionId, userIP string) int64 { + session := &models.Session{Id: sessionId} + err := connection.DB.Model(session).Relation("User").WherePK().Select() + + if err != nil || session.User.Disabled { + return -1 + } + + if session != nil && + session.Expires.After(time.Now()) && + isValidIP(session.IP, userIP) { + return session.UserId + } else { + return -1 + } +} + +func Only2FAMissing(sessionId, userIP string) bool { + session := &models.Session{Id: sessionId} + err := connection.DB.Model(session).Relation("User").WherePK().Select() + + if err != nil { + return false + } + + invalidateExpiredSession(session) + + return session != nil && + session.Expires.After(time.Now()) && + !session.User.Disabled && + session.SecondFactorMissing && + isValidIP(session.IP, userIP) +} + +func IsLoggedIn(sessionId, userIP string) bool { + + session := &models.Session{Id: sessionId} + err := connection.DB.Model(session).Relation("User").WherePK().Select() + + if err != nil { + return false + } + + invalidateExpiredSession(session) + + return session != nil && + !session.SecondFactorMissing && + !session.User.Disabled && + session.Expires.After(time.Now()) && + isValidIP(session.IP, userIP) +} + +func IsLoggedInAndNeedsNewPassword(sessionId, userIP string) bool { + + session := &models.Session{Id: sessionId} + err := connection.DB.Model(session).Relation("User").WherePK().Select() + + if err != nil { + return false + } + + invalidateExpiredSession(session) + + return session != nil && + !session.SecondFactorMissing && + !session.User.Disabled && + session.User.ForcePasswordRotation && + session.Expires.After(time.Now()) && + isValidIP(session.IP, userIP) +} + +func IsLoggedInAndNeeds2FA(sessionId, userIP string) bool { + + session := &models.Session{Id: sessionId} + err := connection.DB.Model(session).Relation("User").WherePK().Select() + + if err != nil { + return false + } + + invalidateExpiredSession(session) + + return session != nil && + !session.SecondFactorMissing && + !session.User.Disabled && + session.User.Force2FA && + !session.User.IsUsing2FA() && + session.Expires.After(time.Now()) && + isValidIP(session.IP, userIP) +} + +func invalidateExpiredSession(session *models.Session) { + if session.Expires.Before(time.Now()) { + _, err := connection.DB.Model(session).WherePK().Delete() + if err != nil { + logger.Error.Println("Error deleting expired session.") + logger.Error.Println(err) + } + } +} + +func isValidIP(sessionIP, userIP string) bool { + return sessionIP == "*" || userIP == sessionIP +} + +func getIP(r *http.Request) string { + forwarded := r.Header.Get("X-FORWARDED-FOR") + if forwarded != "" { + return strings.Split(forwarded, ":")[0] + } + return strings.Split(r.RemoteAddr, ":")[0] +} diff --git a/pkg/app/handler/authentication/login.go b/pkg/app/handler/authentication/login.go new file mode 100644 index 0000000..7cd5c87 --- /dev/null +++ b/pkg/app/handler/authentication/login.go @@ -0,0 +1,100 @@ +package authentication + +import ( + "glsamaker/pkg/app/handler/authentication/auth_session" + "glsamaker/pkg/app/handler/authentication/templates" + "glsamaker/pkg/app/handler/authentication/utils" + "glsamaker/pkg/database/connection" + "glsamaker/pkg/models/users" + "golang.org/x/crypto/argon2" + "net/http" +) + +func Login(w http.ResponseWriter, r *http.Request) { + + // in case '/login' is request but the user is + // already authenticated we will redirect to '/' + if utils.IsAuthenticated(w, r) { + http.Redirect(w, r, "/", 301) + } + + username, pass, cameFrom, bindLoginToIP, _ := getParams(r) + + if IsValidPassword(username, pass) { + user, _ := getLoginUser(username) + auth_session.Create(w, r, user, bindLoginToIP, user.IsUsing2FA()) + if user.IsUsing2FA() { + http.Redirect(w, r, "/login/2fa", 301) + } else { + http.Redirect(w, r, cameFrom, 301) + } + } else { + templates.RenderLoginTemplate(w, r) + } + +} + +func SecondFactorLogin(w http.ResponseWriter, r *http.Request) { + user := utils.GetAuthenticatedUser(r) + + if user == nil || !user.IsUsing2FA() { + // this should not occur + http.NotFound(w, r) + return + } + + if user.IsUsingTOTP { + templates.RenderTOTPTemplate(w, r) + } else if user.IsUsingWebAuthn { + templates.RenderWebAuthnTemplate(w, r) + } else { + // this should not occur + http.NotFound(w, r) + } +} + +// utility functions + +func getLoginUser(username string) (*users.User, bool) { + var potenialUsers []*users.User + err := connection.DB.Model(&potenialUsers).Where("nick = ?", username).Select() + isValidUser := err == nil + + if len(potenialUsers) < 1 { + return &users.User{}, false + } + + return potenialUsers[0], isValidUser +} + +func getParams(r *http.Request) (string, string, string, bool, error) { + err := r.ParseForm() + if err != nil { + return "", "", "", false, err + } + username := r.Form.Get("username") + password := r.Form.Get("password") + cameFrom := r.Form.Get("cameFrom") + restrictLogin := r.Form.Get("restrictlogin") + return username, password, cameFrom, restrictLogin == "on", err +} + +func IsValidPassword(username string, password string) bool { + user, isValidUser := getLoginUser(username) + if !isValidUser { + return false + } + + hashedPassword := argon2.IDKey( + []byte(password), + user.Password.Salt, + user.Password.Time, + user.Password.Memory, + user.Password.Threads, + user.Password.KeyLen) + + if user != nil && !user.Disabled && string(user.Password.Hash) == string(hashedPassword) { + return true + } + return false +} diff --git a/pkg/app/handler/authentication/logout.go b/pkg/app/handler/authentication/logout.go new file mode 100644 index 0000000..87d17f4 --- /dev/null +++ b/pkg/app/handler/authentication/logout.go @@ -0,0 +1,29 @@ +package authentication + +import ( + "glsamaker/pkg/database/connection" + "glsamaker/pkg/logger" + "glsamaker/pkg/models" + "net/http" +) + +func Logout(w http.ResponseWriter, r *http.Request) { + + sessionID, err := r.Cookie("session") + + if err != nil || sessionID == nil { + // TODO Error + } + + session := &models.Session{Id: sessionID.Value} + _, err = connection.DB.Model(session).WherePK().Delete() + + if err != nil { + logger.Info.Println("Error deleting session") + logger.Error.Println("Error deleting session") + logger.Error.Println(err) + } + + http.Redirect(w, r, "/", 301) + +} diff --git a/pkg/app/handler/authentication/templates/admin.go b/pkg/app/handler/authentication/templates/admin.go new file mode 100644 index 0000000..12d039e --- /dev/null +++ b/pkg/app/handler/authentication/templates/admin.go @@ -0,0 +1,36 @@ +package templates + +import ( + "glsamaker/pkg/app/handler/authentication/utils" + "glsamaker/pkg/models" + "glsamaker/pkg/models/users" + "html/template" + "net/http" +) + +// renderIndexTemplate renders all templates used for the login page +func RenderAccessDeniedTemplate(w http.ResponseWriter, r *http.Request) { + + user := utils.GetAuthenticatedUser(r) + + templates := template.Must( + template.Must( + template.New("Show"). + ParseGlob("web/templates/layout/*.tmpl")). + ParseGlob("web/templates/authentication/accessDenied.tmpl")) + + templates.ExecuteTemplate(w, "accessDenied.tmpl", createAccessDeniedData(user)) +} + +// createPageData creates the data used in the template of the landing page +func createAccessDeniedData(user *users.User) interface{} { + return struct { + Page string + Application *models.GlobalSettings + User *users.User + }{ + Page: "", + Application: models.GetDefaultGlobalSettings(), + User: user, + } +} diff --git a/pkg/app/handler/authentication/templates/login.go b/pkg/app/handler/authentication/templates/login.go new file mode 100644 index 0000000..2e3b241 --- /dev/null +++ b/pkg/app/handler/authentication/templates/login.go @@ -0,0 +1,32 @@ +package templates + +import ( + "html/template" + "net/http" +) + +// renderIndexTemplate renders all templates used for the login page +func RenderLoginTemplate(w http.ResponseWriter, r *http.Request) { + + data := struct { + CameFrom string + }{ + CameFrom: getPath(r), + } + + templates := template.Must( + template.Must( + template.New("Show"). + ParseGlob("web/templates/layout/*.tmpl")). + ParseGlob("web/templates/authentication/login.tmpl")) + + templates.ExecuteTemplate(w, "login.tmpl", data) +} + +func getPath(r *http.Request) string { + if r.URL.RawQuery == "" { + return r.URL.Path + } else { + return r.URL.Path + "?" + r.URL.RawQuery + } +} diff --git a/pkg/app/handler/authentication/templates/totp.go b/pkg/app/handler/authentication/templates/totp.go new file mode 100644 index 0000000..acb34e5 --- /dev/null +++ b/pkg/app/handler/authentication/templates/totp.go @@ -0,0 +1,23 @@ +package templates + +import ( + "html/template" + "net/http" +) + +func RenderTOTPTemplate(w http.ResponseWriter, r *http.Request) { + + data := struct { + CameFrom string + }{ + CameFrom: getPath(r), + } + + templates := template.Must( + template.Must( + template.New("Show"). + ParseGlob("web/templates/layout/*.tmpl")). + ParseGlob("web/templates/authentication/totp.tmpl")) + + templates.ExecuteTemplate(w, "totp.tmpl", data) +} diff --git a/pkg/app/handler/authentication/templates/webauthn.go b/pkg/app/handler/authentication/templates/webauthn.go new file mode 100644 index 0000000..148f475 --- /dev/null +++ b/pkg/app/handler/authentication/templates/webauthn.go @@ -0,0 +1,23 @@ +package templates + +import ( + "html/template" + "net/http" +) + +func RenderWebAuthnTemplate(w http.ResponseWriter, r *http.Request) { + + data := struct { + CameFrom string + }{ + CameFrom: getPath(r), + } + + templates := template.Must( + template.Must( + template.New("Show"). + ParseGlob("web/templates/layout/*.tmpl")). + ParseGlob("web/templates/authentication/webauthn.tmpl")) + + templates.ExecuteTemplate(w, "webauthn.tmpl", data) +} diff --git a/pkg/app/handler/authentication/totp/totp.go b/pkg/app/handler/authentication/totp/totp.go new file mode 100644 index 0000000..00e6b83 --- /dev/null +++ b/pkg/app/handler/authentication/totp/totp.go @@ -0,0 +1,60 @@ +package totp + +import ( + "glsamaker/pkg/app/handler/authentication/auth_session" + "glsamaker/pkg/app/handler/authentication/utils" + "glsamaker/pkg/models/users" + "bytes" + "encoding/base64" + "github.com/pquerna/otp/totp" + "image/png" + "net/http" + "time" +) + +func Login(w http.ResponseWriter, r *http.Request) { + + user := utils.GetAuthenticatedUser(r) + token, err := getParam(r) + + if user == nil || err != nil || !IsValidTOTPToken(user, token) { + http.Redirect(w, r, "/login/2fa", 301) + } else { + auth_session.Create(w, r, user, true, false) + http.Redirect(w, r, "/", 301) + } + +} + +func IsValidTOTPToken(user *users.User, token string) bool { + return totp.Validate(token, user.TOTPSecret) +} + +func GetToken(user *users.User) string { + token, _ := totp.GenerateCode(user.TOTPSecret, time.Now()) + return token +} + +func Generate(email string) (string, string) { + + key, _ := totp.Generate(totp.GenerateOpts{ + Issuer: "glsamakertest.gentoo.org", + AccountName: email, + }) + + var buf bytes.Buffer + img, _ := key.Image(250, 250) + + png.Encode(&buf, img) + + return key.Secret(), base64.StdEncoding.EncodeToString(buf.Bytes()) +} + +func getParam(r *http.Request) (string, error) { + err := r.ParseForm() + if err != nil { + return "", err + } + token := r.Form.Get("token") + return token, err +} diff --git a/pkg/app/handler/authentication/utils/utils.go b/pkg/app/handler/authentication/utils/utils.go new file mode 100644 index 0000000..d06a2d7 --- /dev/null +++ b/pkg/app/handler/authentication/utils/utils.go @@ -0,0 +1,81 @@ +package utils + +import ( + "glsamaker/pkg/app/handler/authentication/auth_session" + "glsamaker/pkg/database/connection" + "glsamaker/pkg/models/users" + "net/http" + "strings" +) + +// utility methods to check whether a user is authenticated + +func Only2FAMissing(w http.ResponseWriter, r *http.Request) bool { + sessionID, err := r.Cookie("session") + userIP := getIP(r) + + return err == nil && sessionID != nil && auth_session.Only2FAMissing(sessionID.Value, userIP) +} + +func IsAuthenticated(w http.ResponseWriter, r *http.Request) bool { + sessionID, err := r.Cookie("session") + userIP := getIP(r) + + return err == nil && sessionID != nil && auth_session.IsLoggedIn(sessionID.Value, userIP) +} + +func IsAuthenticatedAndNeedsNewPassword(w http.ResponseWriter, r *http.Request) bool { + sessionID, err := r.Cookie("session") + userIP := getIP(r) + + return err == nil && sessionID != nil && auth_session.IsLoggedInAndNeedsNewPassword(sessionID.Value, userIP) +} + +func IsAuthenticatedAndNeeds2FA(w http.ResponseWriter, r *http.Request) bool { + sessionID, err := r.Cookie("session") + userIP := getIP(r) + + return err == nil && sessionID != nil && auth_session.IsLoggedInAndNeeds2FA(sessionID.Value, userIP) +} + +func IsAuthenticatedAsAdmin(w http.ResponseWriter, r *http.Request) bool { + sessionID, err := r.Cookie("session") + userIP := getIP(r) + + if err != nil || sessionID == nil || !auth_session.IsLoggedIn(sessionID.Value, userIP) { + return false + } + + user := GetAuthenticatedUser(r) + + return user != nil && user.Permissions.Admin.View + +} + +func GetAuthenticatedUser(r *http.Request) *users.User { + sessionID, err := r.Cookie("session") + userIP := getIP(r) + + if err != nil || sessionID == nil || !(auth_session.IsLoggedIn(sessionID.Value, userIP) || auth_session.Only2FAMissing(sessionID.Value, userIP)) { + return nil + } + + userId := auth_session.GetUserId(sessionID.Value, userIP) + + user := &users.User{Id: userId} + err = connection.DB.Select(user) + + if err != nil { + return nil + } + + return user +} + +func getIP(r *http.Request) string { + forwarded := r.Header.Get("X-FORWARDED-FOR") + if forwarded != "" { + return strings.Split(forwarded, ":")[0] + } + return strings.Split(r.RemoteAddr, ":")[0] +} diff --git a/pkg/app/handler/authentication/webauthn/login.go b/pkg/app/handler/authentication/webauthn/login.go new file mode 100644 index 0000000..7bf9c1d --- /dev/null +++ b/pkg/app/handler/authentication/webauthn/login.go @@ -0,0 +1,118 @@ +package webauthn + +import ( + "glsamaker/pkg/app/handler/authentication/auth_session" + "glsamaker/pkg/app/handler/authentication/utils" + "encoding/json" + "fmt" + "github.com/duo-labs/webauthn.io/session" + webauthn_lib "github.com/duo-labs/webauthn/webauthn" + "log" + "net/http" +) + +var ( + WebAuthn *webauthn_lib.WebAuthn + SessionStore *session.Store +) + + +func BeginLogin(w http.ResponseWriter, r *http.Request) { + + user := utils.GetAuthenticatedUser(r) + + CreateWebAuthn() + CreateSessionStore() + + // user doesn't exist + if user == nil { + log.Println("Error fetching the user.") + JsonResponse(w, "Error fetching the user.", http.StatusBadRequest) + return + } + + // generate PublicKeyCredentialRequestOptions, session data + options, sessionData, err := WebAuthn.BeginLogin(user) + if err != nil { + log.Println(err) + JsonResponse(w, err.Error(), http.StatusInternalServerError) + return + } + + // store session data as marshaled JSON + err = SessionStore.SaveWebauthnSession("authentication", sessionData, r, w) + if err != nil { + log.Println(err) + JsonResponse(w, err.Error(), http.StatusInternalServerError) + return + } + + JsonResponse(w, options, http.StatusOK) +} + +func FinishLogin(w http.ResponseWriter, r *http.Request) { + + user := utils.GetAuthenticatedUser(r) + + // user doesn't exist + if user == nil { + log.Println("Error fetching the user.") + JsonResponse(w, "Error fetching the user.", http.StatusBadRequest) + return + } + + // load the session data + sessionData, err := SessionStore.GetWebauthnSession("authentication", r) + if err != nil { + log.Println(err) + JsonResponse(w, err.Error(), http.StatusBadRequest) + return + } + + // in an actual implementation, we should perform additional checks on + // the returned 'credential', i.e. check 'credential.Authenticator.CloneWarning' + // and then increment the credentials counter + _, err = WebAuthn.FinishLogin(user, sessionData, r) + if err != nil { + log.Println(err) + JsonResponse(w, err.Error(), http.StatusBadRequest) + return + } + + // handle successful login + // TODO handle bindLoginToIP correctly + auth_session.Create(w, r, user, true, false) + JsonResponse(w, "Login Success", http.StatusOK) +} + +// from: https://github.com/duo-labs/webauthn.io/blob/3f03b482d21476f6b9fb82b2bf1458ff61a61d41/server/response.go#L15 +func JsonResponse(w http.ResponseWriter, d interface{}, c int) { + dj, err := json.Marshal(d) + if err != nil { + http.Error(w, "Error creating JSON response", http.StatusInternalServerError) + } + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(c) + fmt.Fprintf(w, "%s", dj) +} + +func CreateWebAuthn() { + + if WebAuthn == nil { + authn, _ := webauthn_lib.New(&webauthn_lib.Config{ + RPDisplayName: "Gentoo GLSAMaker", // Display Name for your site + RPID: "glsamakertest.gentoo.org", // Generally the domain name for your site + RPOrigin: "https://glsamakertest.gentoo.org", // The origin URL for WebAuthn requests + RPIcon: "https://assets.gentoo.org/tyrian/site-logo.png", // Optional icon URL for your site + }) + + WebAuthn = authn + } + +} + +func CreateSessionStore() { + if SessionStore == nil { + SessionStore, _ = session.NewStore() + } +} diff --git a/pkg/app/handler/authentication/webauthn/register.go b/pkg/app/handler/authentication/webauthn/register.go new file mode 100644 index 0000000..4e299b3 --- /dev/null +++ b/pkg/app/handler/authentication/webauthn/register.go @@ -0,0 +1,111 @@ +package webauthn + +import ( + "glsamaker/pkg/app/handler/authentication/utils" + "glsamaker/pkg/database/connection" + "glsamaker/pkg/logger" + "fmt" + "github.com/duo-labs/webauthn/protocol" + "log" + "net/http" +) + +func BeginRegistration(w http.ResponseWriter, r *http.Request) { + user := utils.GetAuthenticatedUser(r) + + CreateWebAuthn() + CreateSessionStore() + + if user == nil { + JsonResponse(w, fmt.Errorf("must supply a valid username i.e. foo@bar.com"), http.StatusBadRequest) + return + } + + registerOptions := func(credCreationOpts *protocol.PublicKeyCredentialCreationOptions) { + credCreationOpts.CredentialExcludeList = user.CredentialExcludeList() + } + + // generate PublicKeyCredentialCreationOptions, session data + //var options *protocol.CredentialCreation + //var err error + options, sessionData, err := WebAuthn.BeginRegistration( + user, + registerOptions, + ) + + if err != nil { + log.Println("Error begin register") + log.Println(err) + JsonResponse(w, err.Error(), http.StatusInternalServerError) + return + } + + // store session data as marshaled JSON + err = SessionStore.SaveWebauthnSession("registration", sessionData, r, w) + if err != nil { + log.Println("Error store session") + log.Println(err) + JsonResponse(w, err.Error(), http.StatusInternalServerError) + return + } + + JsonResponse(w, options, http.StatusOK) +} + +func FinishRegistration(w http.ResponseWriter, r *http.Request) { + + authname := getParams(r) + user := utils.GetAuthenticatedUser(r) + + if user == nil { + JsonResponse(w, "Cannot find User", http.StatusBadRequest) + return + } + + // load the session data + sessionData, err := SessionStore.GetWebauthnSession("registration", r) + if err != nil { + log.Println("Error loading session") + log.Println(err) + JsonResponse(w, err.Error(), http.StatusBadRequest) + return + } + + credential, err := WebAuthn.FinishRegistration(user, sessionData, r) + if err != nil { + log.Println("Error finish session") + log.Println(err) + JsonResponse(w, err.Error(), http.StatusBadRequest) + return + } + + user.AddCredential(*credential, authname) + + _, err = connection.DB.Model(user).Column("webauthn_credentials").WherePK().Update() + _, err = connection.DB.Model(user).Column("webauthn_credential_names").WherePK().Update() + if err != nil { + logger.Error.Println("Error adding WebAuthn credentials.") + logger.Error.Println(err) + } + + JsonResponse(w, "Registration Success", http.StatusOK) +} + +func getParams(r *http.Request) string { + + keys, ok := r.URL.Query()["name"] + + if !ok || len(keys[0]) < 1 { + logger.Info.Println("Url Param 'name' is missing") + return "Unnamed Authenticator" + } + + // we only want the single item. + key := keys[0] + + if len(key) > 20 { + key = key[0:20] + } + + return key +} diff --git a/pkg/app/handler/cvetool/bug.go b/pkg/app/handler/cvetool/bug.go new file mode 100644 index 0000000..7725c88 --- /dev/null +++ b/pkg/app/handler/cvetool/bug.go @@ -0,0 +1,85 @@ +package cvetool + +import ( + "glsamaker/pkg/app/handler/authentication" + "glsamaker/pkg/app/handler/authentication/utils" + "glsamaker/pkg/database/connection" + "glsamaker/pkg/logger" + "glsamaker/pkg/models/bugzilla" + "glsamaker/pkg/models/cve" + "net/http" +) + +// Show renders a template to show the landing page of the application +func AssignBug(w http.ResponseWriter, r *http.Request) { + + user := utils.GetAuthenticatedUser(r) + + if !user.Permissions.CVETool.AssignBug { + authentication.AccessDenied(w, r) + return + } + + cveId, bugId, err := getBugAssignParams(r) + + // TODO validate bug using bugzilla api before continue + + cveItem := &cve.DefCveItem{Id: cveId} + err = connection.DB.Select(cveItem) + + if err != nil { + w.Write([]byte("err")) + return + } + + cveItem.State = "Assigned" + + logger.Info.Println("bugId") + logger.Info.Println(bugId) + + //assign bug + newBugs := bugzilla.GetBugsByIds([]string{bugId}) + + for _, newBug := range newBugs { + _, err = connection.DB.Model(&newBug).OnConflict("(id) DO UPDATE").Insert() + + if err != nil { + logger.Info.Println("Error creating bug") + logger.Info.Println(err) + } + + cveToBug := &cve.DefCveItemToBug{ + DefCveItemId: cveId, + BugId: newBug.Id, + } + + connection.DB.Model(cveToBug).Insert() + + } + + // TODO MIGRATION + //cveItem.Bugs = append(cveItem.Bugs, bugId) + + _, err = connection.DB.Model(cveItem).Column("bugs").WherePK().Update() + _, err = connection.DB.Model(cveItem).Column("state").WherePK().Update() + + if err != nil { + logger.Info.Println("Err") + logger.Info.Println(err) + w.Write([]byte("err")) + return + } + + w.Write([]byte("ok")) + +} + +func getBugAssignParams(r *http.Request) (string, string, error) { + err := r.ParseForm() + if err != nil { + return "", "", err + } + cveid := r.Form.Get("cveid") + bugid := r.Form.Get("bugid") + return cveid, bugid, err +} diff --git a/pkg/app/handler/cvetool/comments.go b/pkg/app/handler/cvetool/comments.go new file mode 100644 index 0000000..d36122a --- /dev/null +++ b/pkg/app/handler/cvetool/comments.go @@ -0,0 +1,74 @@ +package cvetool + +import ( + "glsamaker/pkg/app/handler/authentication" + "glsamaker/pkg/app/handler/authentication/utils" + "glsamaker/pkg/database/connection" + "glsamaker/pkg/logger" + "glsamaker/pkg/models/cve" + "encoding/json" + "net/http" + "time" +) + +// Show renders a template to show the landing page of the application +func AddComment(w http.ResponseWriter, r *http.Request) { + + user := utils.GetAuthenticatedUser(r) + + if !user.Permissions.CVETool.Comment { + authentication.AccessDenied(w, r) + return + } + + id, comment, err := getParams(r) + + newComment, err := addNewCommment(id, user.Id, comment) + + if err != nil { + logger.Info.Println("Err") + logger.Info.Println(err) + w.Write([]byte("err")) + return + } + + newCommentString, _ := json.Marshal(newComment) + + w.Write(newCommentString) + +} + +func addNewCommment(id string, userID int64, comment string) (cve.Comment, error) { + + cveItem := &cve.DefCveItem{Id: id} + err := connection.DB.Select(cveItem) + + if err != nil { + return cve.Comment{}, err + } + + newComment := cve.Comment{ + CVEId: id, + User: userID, + Message: comment, + Date: time.Now(), + } + + //cveItem.Comments = append(cveItem.Comments, newComment) + + //_, err = connection.DB.Model(cveItem).Column("comments").WherePK().Update() + _, err = connection.DB.Model(&newComment).Insert() + + return newComment, err + +} + +func getParams(r *http.Request) (string, string, error) { + err := r.ParseForm() + if err != nil { + return "", "", err + } + id := r.Form.Get("cveid") + comment := r.Form.Get("comment") + return id, comment, err +} diff --git a/pkg/app/handler/cvetool/index.go b/pkg/app/handler/cvetool/index.go new file mode 100644 index 0000000..9c54a01 --- /dev/null +++ b/pkg/app/handler/cvetool/index.go @@ -0,0 +1,169 @@ +// Used to show the landing page of the application + +package cvetool + +import ( + "glsamaker/pkg/app/handler/authentication" + "glsamaker/pkg/app/handler/authentication/utils" + "glsamaker/pkg/database/connection" + "glsamaker/pkg/logger" + "glsamaker/pkg/models/cve" + "encoding/json" + "fmt" + "github.com/go-pg/pg/v9/orm" + "net/http" + "strconv" + "strings" +) + +// Show renders a template to show the landing page of the application +func Show(w http.ResponseWriter, r *http.Request) { + + user := utils.GetAuthenticatedUser(r) + + if !user.Permissions.CVETool.View { + authentication.AccessDenied(w, r) + return + } + + renderIndexTemplate(w, user) +} + +// Show renders a template to show the landing page of the application +func ShowFullscreen(w http.ResponseWriter, r *http.Request) { + user := utils.GetAuthenticatedUser(r) + + if !user.Permissions.CVETool.View { + authentication.AccessDenied(w, r) + return + } + + renderIndexFullscreenTemplate(w, user) +} + +// Show renders a template to show the landing page of the application +func Add(w http.ResponseWriter, r *http.Request) { + //renderIndexTemplate(w) +} + +// Show renders a template to show the landing page of the application +func CveData(w http.ResponseWriter, r *http.Request) { + + user := utils.GetAuthenticatedUser(r) + + if !user.Permissions.CVETool.View { + authentication.AccessDenied(w, r) + return + } + + type DataTableData struct { + Draw int `json:"draw"` + RecordsTotal int `json:"recordsTotal"` + RecordsFiltered int `json:"recordsFiltered"` + Data [][]string `json:"data"` + } + + draw, _ := strconv.Atoi(getParam(r, "draw")) + start, _ := strconv.Atoi(getParam(r, "start")) + length, _ := strconv.Atoi(getParam(r, "length")) + order_column := getParam(r, "order[0][column]") + order_dir := strings.ToUpper(getParam(r, "order[0][dir]")) + search_value := strings.ToUpper(getParam(r, "search[value]")) + + state_value := getParam(r, "columns[10][search][value]") + logger.Info.Println("state_value") + logger.Info.Println(state_value) + + count_overall, _ := connection.DB.Model((*cve.DefCveItem)(nil)).Count() + count, _ := connection.DB.Model((*cve.DefCveItem)(nil)).Where("state LIKE " + "'%" + state_value + "%'").WhereGroup(func(q *orm.Query) (*orm.Query, error) { + q = q.WhereOr("description LIKE " + "'%" + search_value + "%'"). + WhereOr("id LIKE " + "'%" + search_value + "%'") + return q, nil + }).Count() + + order := "id" + if order_column == "0" { + order = "id" + } else if order_column == "8" { + order = "last_modified_date" + } else if order_column == "9" { + order = "published_date" + } else if order_column == "10" { + order = "state" + } + + var dataTableEntries [][]string + var cves []*cve.DefCveItem + err := connection.DB.Model(&cves).Order(order + " " + order_dir).Offset(start).Limit(length).Where("state LIKE " + "'%" + state_value + "%'").WhereGroup(func(q *orm.Query) (*orm.Query, error) { + q = q.WhereOr("description LIKE " + "'%" + search_value + "%'"). + WhereOr("id LIKE " + "'%" + search_value + "%'") + return q, nil + }).Relation("Bugs").Relation("Comments").Select() + + if err != nil || len(cves) == 0 { + logger.Info.Println("Error finding cves:") + logger.Info.Println(err) + w.Header().Set("Content-Type", "application/json") + w.Write([]byte(`{"draw":` + strconv.Itoa(draw) + `,"recordsTotal":` + strconv.Itoa(count_overall) + `,"recordsFiltered":0,"data":[]}`)) + return + } else { + for _, cve := range cves { + + // TODO handle empty + + baseScore := "" + impact := "" + if cve.Impact != nil { + baseScore = fmt.Sprintf("%.2f", cve.Impact.BaseMetricV3.CvssV3.BaseScore) + impact = cve.Impact.BaseMetricV3.CvssV3.VectorString + } + + var referenceList []string + for _, reference := range cve.Cve.References.ReferenceData { + referenceList = append(referenceList, "source") + //referenceList = append(referenceList, "" + strings.ToLower(reference.Refsource) + "") + } + references := strings.Join(referenceList, ", ") + + comments, _ := json.Marshal(cve.Comments) + + packages, _ := json.Marshal(cve.Packages) + bugs, _ := json.Marshal(cve.Bugs) + + dataTableEntries = append(dataTableEntries, []string{ + cve.Id, + cve.Description, + string(packages), // TODO MIGRATION strings.Join(cve.Packages, ","), + string(bugs), // TODO MIGRATION strings.Join(cve.Bugs, ","), + baseScore, + impact, + references, + string(comments), + cve.LastModifiedDate, + cve.PublishedDate, + cve.State, + "changelog"}) + } + } + + dataTableData := DataTableData{ + Draw: draw, + RecordsTotal: count_overall, + RecordsFiltered: count, + Data: dataTableEntries, + } + + res, _ := json.Marshal(dataTableData) + + w.Header().Set("Content-Type", "application/json") + w.Write(res) +} + +func getParam(r *http.Request, keyname string) string { + keys, ok := r.URL.Query()[keyname] + if !ok || len(keys[0]) < 1 { + return "" + } + result := keys[0] + return result +} diff --git a/pkg/app/handler/cvetool/state.go b/pkg/app/handler/cvetool/state.go new file mode 100644 index 0000000..608691c --- /dev/null +++ b/pkg/app/handler/cvetool/state.go @@ -0,0 +1,75 @@ +package cvetool + +import ( + "glsamaker/pkg/app/handler/authentication" + "glsamaker/pkg/app/handler/authentication/utils" + "glsamaker/pkg/database/connection" + "glsamaker/pkg/logger" + "glsamaker/pkg/models/cve" + "encoding/json" + "net/http" +) + +// Show renders a template to show the landing page of the application +func ChangeState(w http.ResponseWriter, r *http.Request) { + + user := utils.GetAuthenticatedUser(r) + + if !user.Permissions.CVETool.ChangeState { + authentication.AccessDenied(w, r) + return + } + + if !user.CanEditCVEs() { + logger.Error.Println("Err, user can not edit.") + w.Write([]byte("err")) + return + } + + id, newState, reason, err := getStateParams(r) + + cveItem := &cve.DefCveItem{Id: id} + err = connection.DB.Select(cveItem) + + if err != nil || reason == "" || cveItem.State == "Assigned" || !(newState == "NFU" || newState == "Later" || newState == "Invalid") { + logger.Error.Println("Err, invalid data") + logger.Error.Println(err) + w.Write([]byte("err")) + return + } + + cveItem.State = newState + _, err = connection.DB.Model(cveItem).Column("state").WherePK().Update() + + if err != nil { + logger.Error.Println("Err") + logger.Error.Println(err) + w.Write([]byte("err")) + return + } + + newComment, err := addNewCommment(id, user.Id, "Changed status to "+newState+": "+reason) + + if err != nil { + logger.Error.Println("Err") + logger.Error.Println(err) + w.Write([]byte("err")) + return + } + + newCommentString, _ := json.Marshal(newComment) + + w.Write(newCommentString) + +} + +func getStateParams(r *http.Request) (string, string, string, error) { + err := r.ParseForm() + if err != nil { + return "", "", "", err + } + id := r.Form.Get("cveid") + newstate := r.Form.Get("newstate") + reason := r.Form.Get("reason") + return id, newstate, reason, err +} diff --git a/pkg/app/handler/cvetool/update.go b/pkg/app/handler/cvetool/update.go new file mode 100644 index 0000000..8ce12f5 --- /dev/null +++ b/pkg/app/handler/cvetool/update.go @@ -0,0 +1,23 @@ +package cvetool + +import ( + "glsamaker/pkg/app/handler/authentication" + "glsamaker/pkg/app/handler/authentication/utils" + "glsamaker/pkg/cveimport" + "net/http" +) + +// Show renders a template to show the landing page of the application +func Update(w http.ResponseWriter, r *http.Request) { + + user := utils.GetAuthenticatedUser(r) + + if !user.Permissions.CVETool.UpdateCVEs { + authentication.AccessDenied(w, r) + return + } + + go cveimport.IncrementalCVEImport() + + http.Redirect(w, r, "/", 301) +} diff --git a/pkg/app/handler/cvetool/utils.go b/pkg/app/handler/cvetool/utils.go new file mode 100644 index 0000000..7e78660 --- /dev/null +++ b/pkg/app/handler/cvetool/utils.go @@ -0,0 +1,47 @@ +// miscellaneous utility functions used for the landing page of the application + +package cvetool + +import ( + "glsamaker/pkg/models" + "glsamaker/pkg/models/users" + "html/template" + "net/http" +) + +// renderIndexTemplate renders all templates used for the landing page +func renderIndexTemplate(w http.ResponseWriter, user *users.User) { + templates := template.Must( + template.Must( + template.New("Show"). + ParseGlob("web/templates/layout/*.tmpl")). + ParseGlob("web/templates/index/*.tmpl")) + + templates.ExecuteTemplate(w, "show.tmpl", createPageData("cvetool", user)) +} + +// renderIndexTemplate renders all templates used for the landing page +func renderIndexFullscreenTemplate(w http.ResponseWriter, user *users.User) { + templates := template.Must( + template.Must( + template.New("Show"). + ParseGlob("web/templates/layout/*.tmpl")). + ParseGlob("web/templates/index/*.tmpl")) + + templates.ExecuteTemplate(w, "showFullscreen.tmpl", createPageData("cvetool", user)) +} + +// createPageData creates the data used in the template of the landing page +func createPageData(page string, user *users.User) interface{} { + return struct { + Page string + Application *models.GlobalSettings + User *users.User + CanEdit bool + }{ + Page: page, + Application: models.GetDefaultGlobalSettings(), + User: user, + CanEdit: user.CanEditCVEs(), + } +} diff --git a/pkg/app/handler/dashboard/index.go b/pkg/app/handler/dashboard/index.go new file mode 100644 index 0000000..82fd858 --- /dev/null +++ b/pkg/app/handler/dashboard/index.go @@ -0,0 +1,58 @@ +// Used to show the landing page of the application + +package dashboard + +import ( + "glsamaker/pkg/app/handler/authentication" + "glsamaker/pkg/app/handler/authentication/utils" + "glsamaker/pkg/app/handler/statistics" + "glsamaker/pkg/database/connection" + "glsamaker/pkg/models" + "glsamaker/pkg/models/cve" + "net/http" +) + +// Show renders a template to show the landing page of the application +func Show(w http.ResponseWriter, r *http.Request) { + + user := utils.GetAuthenticatedUser(r) + + if !(user.Permissions.Glsa.View && user.Permissions.CVETool.View) { + authentication.AccessDenied(w, r) + return + } + + var glsas []*models.Glsa + user.CanAccess(connection.DB.Model(&glsas).Relation("Creator").Order("updated DESC").Limit(5)).Select() + + var cves []*cve.DefCveItem + connection.DB.Model(&cves).Order("last_modified_date DESC").Limit(5).Select() + + var comments []*cve.Comment + connection.DB.Model(&comments).Order("date DESC").Limit(5).Select() + + requests, _ := connection.DB.Model((*models.Glsa)(nil)).Where("type = ?", "request").Count() + drafts, _ := connection.DB.Model((*models.Glsa)(nil)).Where("type = ?", "draft").Count() + glsasCount, _ := connection.DB.Model((*models.Glsa)(nil)).Where("type = ?", "glsa").Count() + allGlsas, _ := connection.DB.Model((*models.Glsa)(nil)).Count() + + new, _ := connection.DB.Model((*cve.DefCveItem)(nil)).Where("state = ?", "New").Count() + assigned, _ := connection.DB.Model((*cve.DefCveItem)(nil)).Where("state = ?", "Assigned").Count() + nfu, _ := connection.DB.Model((*cve.DefCveItem)(nil)).Where("state = ?", "NFU").Count() + later, _ := connection.DB.Model((*cve.DefCveItem)(nil)).Where("state = ?", "Later").Count() + invalid, _ := connection.DB.Model((*cve.DefCveItem)(nil)).Where("state = ?", "Invalid").Count() + allCVEs, _ := connection.DB.Model((*cve.DefCveItem)(nil)).Count() + + statisticsData := statistics.StatisticsData{ + Requests: float64(requests) / float64(allGlsas), + Drafts: float64(drafts) / float64(allGlsas), + Glsas: float64(glsasCount) / float64(allGlsas), + New: float64(new) / float64(allCVEs), + Assigned: float64(assigned) / float64(allCVEs), + NFU: float64(nfu) / float64(allCVEs), + Later: float64(later) / float64(allCVEs), + Invalid: float64(invalid) / float64(allCVEs), + } + + renderDashboardTemplate(w, user, glsas, cves, comments, &statisticsData) +} diff --git a/pkg/app/handler/dashboard/utils.go b/pkg/app/handler/dashboard/utils.go new file mode 100644 index 0000000..ed0bc91 --- /dev/null +++ b/pkg/app/handler/dashboard/utils.go @@ -0,0 +1,44 @@ +// miscellaneous utility functions used for the landing page of the application + +package dashboard + +import ( + "glsamaker/pkg/app/handler/statistics" + "glsamaker/pkg/models" + "glsamaker/pkg/models/cve" + "glsamaker/pkg/models/users" + "html/template" + "net/http" +) + +// renderIndexTemplate renders all templates used for the landing page +func renderDashboardTemplate(w http.ResponseWriter, user *users.User, glsas []*models.Glsa, cves []*cve.DefCveItem, comments []*cve.Comment, statisticsData *statistics.StatisticsData) { + templates := template.Must( + template.Must( + template.New("Show"). + ParseGlob("web/templates/layout/*.tmpl")). + ParseGlob("web/templates/dashboard/*.tmpl")) + + templates.ExecuteTemplate(w, "dashboard.tmpl", createPageData("dashboard", user, glsas, cves, comments, statisticsData)) +} + +// createPageData creates the data used in the template of the landing page +func createPageData(page string, user *users.User, glsas []*models.Glsa, cves []*cve.DefCveItem, comments []*cve.Comment, statisticsData *statistics.StatisticsData) interface{} { + return struct { + Page string + Application *models.GlobalSettings + User *users.User + GLSAs []*models.Glsa + CVEs []*cve.DefCveItem + Comments []*cve.Comment + StatisticsData *statistics.StatisticsData + }{ + Page: page, + Application: models.GetDefaultGlobalSettings(), + User: user, + GLSAs: glsas, + CVEs: cves, + Comments: comments, + StatisticsData: statisticsData, + } +} diff --git a/pkg/app/handler/drafts/index.go b/pkg/app/handler/drafts/index.go new file mode 100644 index 0000000..cfc699f --- /dev/null +++ b/pkg/app/handler/drafts/index.go @@ -0,0 +1,44 @@ +// Used to show the landing page of the application + +package drafts + +import ( + "glsamaker/pkg/app/handler/authentication" + "glsamaker/pkg/app/handler/authentication/utils" + "glsamaker/pkg/database/connection" + "glsamaker/pkg/logger" + "glsamaker/pkg/models" + "net/http" +) + +// Show renders a template to show the landing page of the application +func Show(w http.ResponseWriter, r *http.Request) { + + user := utils.GetAuthenticatedUser(r) + + if !user.Permissions.Glsa.View { + authentication.AccessDenied(w, r) + return + } + + var drafts []*models.Glsa + err := user.CanAccess(connection.DB.Model(&drafts). + Where("type = ?", "draft"). + Relation("Bugs"). + Relation("Creator"). + Relation("Comments")). + Select() + + if err != nil { + logger.Info.Println("Error during draft selection") + logger.Info.Println(err) + http.NotFound(w, r) + return + } + + for _, draft := range drafts { + draft.ComputeStatus(user) + } + + renderDraftsTemplate(w, user, drafts) +} diff --git a/pkg/app/handler/drafts/utils.go b/pkg/app/handler/drafts/utils.go new file mode 100644 index 0000000..f7f4f57 --- /dev/null +++ b/pkg/app/handler/drafts/utils.go @@ -0,0 +1,37 @@ +// miscellaneous utility functions used for the landing page of the application + +package drafts + +import ( + "glsamaker/pkg/models" + "glsamaker/pkg/models/users" + "html/template" + "net/http" +) + +// renderIndexTemplate renders all templates used for the landing page +func renderDraftsTemplate(w http.ResponseWriter, user *users.User, drafts []*models.Glsa) { + + templates := template.Must( + template.Must( + template.New("Show"). + ParseGlob("web/templates/layout/*.tmpl")). + ParseGlob("web/templates/drafts/*.tmpl")) + + templates.ExecuteTemplate(w, "drafts.tmpl", createPageData("drafts", user, drafts)) +} + +// createPageData creates the data used in the template of the landing page +func createPageData(page string, user *users.User, drafts []*models.Glsa) interface{} { + return struct { + Page string + Application *models.GlobalSettings + User *users.User + Drafts []*models.Glsa + }{ + Page: page, + Application: models.GetDefaultGlobalSettings(), + User: user, + Drafts: drafts, + } +} diff --git a/pkg/app/handler/glsa/bugs.go b/pkg/app/handler/glsa/bugs.go new file mode 100644 index 0000000..9b3d32e --- /dev/null +++ b/pkg/app/handler/glsa/bugs.go @@ -0,0 +1,63 @@ +package glsa + +import ( + "glsamaker/pkg/app/handler/authentication" + "glsamaker/pkg/app/handler/authentication/utils" + "glsamaker/pkg/database/connection" + "glsamaker/pkg/logger" + "glsamaker/pkg/models" + "glsamaker/pkg/models/bugzilla" + "net/http" + "strconv" +) + +// Show renders a template to show the landing page of the application +func UpdateBugs(w http.ResponseWriter, r *http.Request) { + + user := utils.GetAuthenticatedUser(r) + + if !user.Permissions.Glsa.UpdateBugs { + authentication.AccessDenied(w, r) + return + } + + go bugUpdate() + + http.Redirect(w, r, "/", 301) +} + +func bugUpdate() { + + var allBugs []*bugzilla.Bug + connection.DB.Model(&allBugs).Select() + + var bugIdsLists [][]string + bugIdsLists = append(bugIdsLists, []string{}) + for _, bug := range allBugs { + lastElem := bugIdsLists[len(bugIdsLists)-1] + + if len(lastElem) < 100 { + bugIdsLists[len(bugIdsLists)-1] = append(lastElem, strconv.FormatInt(bug.Id, 10)) + } else { + bugIdsLists = append(bugIdsLists, []string{strconv.FormatInt(bug.Id, 10)}) + } + } + + for _, bugIdsList := range bugIdsLists { + updatedBugs := bugzilla.GetBugsByIds(bugIdsList) + + for _, updatedBug := range updatedBugs { + _, err := connection.DB.Model(&updatedBug).WherePK().Update() + if err != nil { + logger.Error.Println("Error during bug data update") + logger.Error.Println(err) + } + } + } + + // Possibly delete deleted bugs + // Do we even delete bugs? + + // update the time of the last bug update + models.SetApplicationValue("LastBugUpdate", "") +} diff --git a/pkg/app/handler/glsa/comments.go b/pkg/app/handler/glsa/comments.go new file mode 100644 index 0000000..9412b62 --- /dev/null +++ b/pkg/app/handler/glsa/comments.go @@ -0,0 +1,110 @@ +package glsa + +import ( + "glsamaker/pkg/app/handler/authentication" + "glsamaker/pkg/app/handler/authentication/utils" + "glsamaker/pkg/database/connection" + "glsamaker/pkg/logger" + "glsamaker/pkg/models" + "glsamaker/pkg/models/cve" + "glsamaker/pkg/models/users" + "encoding/json" + "errors" + "net/http" + "strconv" + "time" +) + +// Show renders a template to show the landing page of the application +func AddComment(w http.ResponseWriter, r *http.Request) { + + user := utils.GetAuthenticatedUser(r) + + if !user.Permissions.Glsa.Comment { + authentication.AccessDenied(w, r) + return + } + + if !user.CanEditCVEs() { + w.Write([]byte("err")) + return + } + + id, comment, commentType, err := getParams(r) + + newComment, err := AddNewCommment(id, user, comment, commentType) + + if err != nil { + logger.Info.Println("Err") + logger.Info.Println(err) + w.Write([]byte("err")) + return + } + + newCommentString, _ := json.Marshal(newComment) + + w.Write(newCommentString) + +} + +func AddNewCommment(id string, user *users.User, comment string, commentType string) (cve.Comment, error) { + + glsaID, err := strconv.ParseInt(id, 10, 64) + + if err != nil { + return cve.Comment{}, err + } + + glsa := &models.Glsa{Id: glsaID} + err = user.CanAccess(connection.DB.Model(glsa).WherePK()).Select() + + if err != nil { + return cve.Comment{}, err + } + + // TODO: VALIDATE !! + + if commentType == "approve" && !user.Permissions.Glsa.Approve { + return cve.Comment{}, errors.New("ACCESS DENIED") + } else if commentType == "approve" && glsa.CreatorId == user.Id && !user.Permissions.Glsa.ApproveOwnGlsa { + return cve.Comment{}, errors.New("ACCESS DENIED") + } else if commentType == "decline" && !user.Permissions.Glsa.Decline { + return cve.Comment{}, errors.New("ACCESS DENIED") + } + + if commentType == "approve" { + glsa.ApprovedBy = append(glsa.ApprovedBy, user.Id) + _, err = connection.DB.Model(glsa).Column("approved_by").WherePK().Update() + } else if commentType == "decline" { + glsa.DeclinedBy = append(glsa.DeclinedBy, user.Id) + _, err = connection.DB.Model(glsa).Column("declined_by").WherePK().Update() + } + + newComment := cve.Comment{ + GlsaId: glsaID, + User: user.Id, + UserBadge: user.Badge, + Type: commentType, + Message: comment, + Date: time.Now(), + } + + glsa.Comments = append(glsa.Comments, newComment) + + //_, err = connection.DB.Model(glsa).Column("comments").WherePK().Update() + _, err = connection.DB.Model(&newComment).Insert() + + return newComment, err + +} + +func getParams(r *http.Request) (string, string, string, error) { + err := r.ParseForm() + if err != nil { + return "", "", "", err + } + id := r.Form.Get("glsaid") + comment := r.Form.Get("comment") + commentType := r.Form.Get("commentType") + return id, comment, commentType, err +} diff --git a/pkg/app/handler/glsa/delete.go b/pkg/app/handler/glsa/delete.go new file mode 100644 index 0000000..b036319 --- /dev/null +++ b/pkg/app/handler/glsa/delete.go @@ -0,0 +1,42 @@ +// Used to show the landing page of the application + +package glsa + +import ( + "glsamaker/pkg/app/handler/authentication" + "glsamaker/pkg/app/handler/authentication/utils" + "glsamaker/pkg/database/connection" + "glsamaker/pkg/models" + "glsamaker/pkg/models/cve" + "net/http" + "strconv" +) + +// Show renders a template to show the landing page of the application +func Delete(w http.ResponseWriter, r *http.Request) { + + // TODO delete confidential bugs? + + user := utils.GetAuthenticatedUser(r) + + if !user.Permissions.Glsa.Delete { + authentication.AccessDenied(w, r) + return + } + + glsaID := r.URL.Path[len("/glsa/delete/"):] + + if _, err := strconv.Atoi(glsaID); err != nil { + http.Redirect(w, r, "/", 301) + w.Write([]byte("err")) + } + + var glsa *models.Glsa + var glsaToBug *models.GlsaToBug + var comment *cve.Comment + connection.DB.Model(glsa).Where("id = ?", glsaID).Delete() + connection.DB.Model(glsaToBug).Where("glsa_id = ?", glsaID).Delete() + connection.DB.Model(comment).Where("glsa_id = ?", glsaID).Delete() + + w.Write([]byte("ok")) +} diff --git a/pkg/app/handler/glsa/edit.go b/pkg/app/handler/glsa/edit.go new file mode 100644 index 0000000..04e67b3 --- /dev/null +++ b/pkg/app/handler/glsa/edit.go @@ -0,0 +1,185 @@ +package glsa + +import ( + "glsamaker/pkg/app/handler/authentication" + "glsamaker/pkg/app/handler/authentication/utils" + "glsamaker/pkg/database/connection" + "glsamaker/pkg/logger" + "glsamaker/pkg/models" + "glsamaker/pkg/models/bugzilla" + "glsamaker/pkg/models/gpackage" + "net/http" + "strconv" + "time" +) + +func getStringParam(key string, r *http.Request) string { + if len(r.Form[key]) > 0 { + return r.Form[key][0] + } + + return "" +} + +func getArrayParam(key string, r *http.Request) []string { + return r.Form[key] +} + +// Show renders a template to show the landing page of the application +func Edit(w http.ResponseWriter, r *http.Request) { + + // TODO edit confidential bugs? + + user := utils.GetAuthenticatedUser(r) + + if !user.Permissions.Glsa.Edit { + authentication.AccessDenied(w, r) + return + } + + glsaID := r.URL.Path[len("/glsa/edit/"):] + + parsedGlsaId, _ := strconv.ParseInt(glsaID, 10, 64) + currentGlsa := &models.Glsa{Id: parsedGlsaId} + err := user.CanAccess(connection.DB.Model(currentGlsa). + Relation("Bugs"). + Relation("Creator"). + Relation("Comments"). + WherePK()). + Select() + + if r.Method == "POST" { + + r.ParseForm() + + id, err := strconv.ParseInt(glsaID, 10, 64) + + if err != nil { + http.NotFound(w, r) + return + } + + // if + var packages []gpackage.Package + for k, _ := range getArrayParam("package_atom", r) { + newPackage := gpackage.Package{ + Affected: r.Form["package_vulnerable"][k] == "true", + Atom: r.Form["package_atom"][k], + Identifier: r.Form["package_identifier"][k], + Version: r.Form["package_version"][k], + Slot: r.Form["package_slot"][k], + Arch: r.Form["package_arch"][k], + Auto: r.Form["package_auto"][k] == "true", + } + packages = append(packages, newPackage) + } + + var references []models.Reference + for k, _ := range getArrayParam("reference_title", r) { + newReference := models.Reference{ + Title: r.Form["reference_title"][k], + URL: r.Form["reference_url"][k], + } + references = append(references, newReference) + } + + // Update Bugs: delete old mapping first + _, err = connection.DB.Model(&[]models.GlsaToBug{}).Where("glsa_id = ?", glsaID).Delete() + if err != nil { + logger.Error.Println("ERR during delete") + logger.Error.Println(err) + } + + newBugs := bugzilla.GetBugsByIds(getArrayParam("bugs", r)) + + for _, newBug := range newBugs { + _, err = connection.DB.Model(&newBug).OnConflict("(id) DO UPDATE").Insert() + + if err != nil { + logger.Error.Println("Error creating bug") + logger.Error.Println(err) + } + + parsedGlsaID, _ := strconv.ParseInt(glsaID, 10, 64) + + glsaToBug := &models.GlsaToBug{ + GlsaId: parsedGlsaID, + BugId: newBug.Id, + } + + connection.DB.Model(glsaToBug).Insert() + + } + + glsa := &models.Glsa{ + Id: id, + // Alias: getStringParam("alias", r), + // Type: getStringParam("status", r), + Title: getStringParam("title", r), + Synopsis: getStringParam("synopsis", r), + Packages: packages, + Description: getStringParam("description", r), + Impact: getStringParam("impact", r), + Workaround: getStringParam("workaround", r), + Resolution: getStringParam("resolution", r), + References: references, + Permission: getStringParam("permission", r), + Access: getStringParam("access", r), + Severity: getStringParam("severity", r), + Keyword: getStringParam("keyword", r), + Background: getStringParam("background", r), + //TODO + //Bugs: , + //Comments: nil, + Revision: "r9999", + // Created: time.Time{}, + Updated: time.Time{}, + } + + if currentGlsa.Type == "request" && glsa.Description != "" { + glsa.Type = "draft" + } else { + glsa.Type = currentGlsa.Type + } + + _, err = connection.DB.Model(glsa).Column( + "type", + "title", + "synopsis", + "packages", + "description", + "impact", + "workaround", + "resolution", + "references", + "permission", + "access", + "severity", + "keyword", + "background", + "updated", + "revision").WherePK().Update() + + if err != nil { + http.NotFound(w, r) + logger.Error.Println("ERR NOT FOUND") + logger.Error.Println(err) + return + } + + http.Redirect(w, r, "/glsa/"+glsaID, 301) + return + } + + if err != nil { + http.NotFound(w, r) + return + } + + currentGlsa.ComputeStatus(user) + currentGlsa.ComputeCommentBadges() + + glsaCount, err := connection.DB.Model((*models.Glsa)(nil)).Count() + + renderEditTemplate(w, user, currentGlsa, int64(glsaCount)) +} diff --git a/pkg/app/handler/glsa/release.go b/pkg/app/handler/glsa/release.go new file mode 100644 index 0000000..c24e5b0 --- /dev/null +++ b/pkg/app/handler/glsa/release.go @@ -0,0 +1,70 @@ +package glsa + +import ( + "glsamaker/pkg/app/handler/authentication" + "glsamaker/pkg/app/handler/authentication/utils" + "glsamaker/pkg/database/connection" + "glsamaker/pkg/logger" + "glsamaker/pkg/models" + "net/http" + "strconv" + "strings" + "time" +) + +// Show renders a template to show the landing page of the application +func Release(w http.ResponseWriter, r *http.Request) { + + user := utils.GetAuthenticatedUser(r) + + if !user.Permissions.Glsa.Release { + authentication.AccessDenied(w, r) + return + } + + glsaID := r.URL.Path[len("/glsa/release/"):] + + currentGlsa := new(models.Glsa) + err := user.CanAccess(connection.DB.Model(currentGlsa). + Where("id = ?", glsaID)). + Select() + + if err != nil { + http.NotFound(w, r) + return + } + + currentGlsa.Type = "glsa" + currentGlsa.Alias = computeNextGLSAId() + + _, err = connection.DB.Model(currentGlsa).Column("type").WherePK().Update() + _, err = connection.DB.Model(currentGlsa).Column("alias").WherePK().Update() + + http.Redirect(w, r, "/archive", 301) +} + +func computeNextGLSAId() string { + + logger.Info.Println("compute Next GLSA") + + newGLSAID := "" + var glsas []*models.Glsa + err := connection.DB.Model(&glsas).Where("type = ?", "glsa").Order("alias DESC").Limit(1).Select() + + if err != nil || len(glsas) == 0 { + newGLSAID = time.Now().Format("200601") + "-" + "01" + } else if !strings.HasPrefix(glsas[0].Alias, time.Now().Format("200601")+"-") { + newGLSAID = time.Now().Format("200601") + "-" + "01" + } else { + oldId := strings.Replace(glsas[0].Alias, time.Now().Format("200601")+"-", "", 1) + parsedOldId, _ := strconv.Atoi(oldId) + parsedOldId = parsedOldId + 1 + newID := strconv.Itoa(parsedOldId) + if len(newID) < 2 { + newID = "0" + newID + } + newGLSAID = time.Now().Format("200601") + "-" + newID + } + + return newGLSAID +} diff --git a/pkg/app/handler/glsa/utils.go b/pkg/app/handler/glsa/utils.go new file mode 100644 index 0000000..b417a80 --- /dev/null +++ b/pkg/app/handler/glsa/utils.go @@ -0,0 +1,79 @@ +package glsa + +import ( + "glsamaker/pkg/logger" + "glsamaker/pkg/models" + "glsamaker/pkg/models/bugzilla" + "glsamaker/pkg/models/users" + "html/template" + "net/http" +) + +// renderIndexTemplate renders all templates used for the landing page +func renderViewTemplate(w http.ResponseWriter, user *users.User, glsa *models.Glsa, glsaCount int64) { + + templates := template.Must( + template.Must( + template.New("Show"). + Funcs(getFuncMap()). + ParseGlob("web/templates/layout/*.tmpl")). + ParseGlob("web/templates/glsa/show.tmpl")) + + templates.ExecuteTemplate(w, "show.tmpl", createPageData("show", user, glsa, glsaCount)) +} + +// renderIndexTemplate renders all templates used for the landing page +func renderEditTemplate(w http.ResponseWriter, user *users.User, glsa *models.Glsa, glsaCount int64) { + templates := template.Must( + template.Must( + template.New("Show"). + Funcs(getFuncMap()). + ParseGlob("web/templates/layout/*.tmpl")). + ParseGlob("web/templates/glsa/edit.tmpl")) + + templates.ExecuteTemplate(w, "edit.tmpl", createPageData("edit", user, glsa, glsaCount)) +} + +// createPageData creates the data used in the template of the landing page +func createPageData(page string, user *users.User, glsa *models.Glsa, glsaCount int64) interface{} { + return struct { + Page string + Application *models.GlobalSettings + User *users.User + Glsa *models.Glsa + GlsaCount int64 + }{ + Page: page, + Application: models.GetDefaultGlobalSettings(), + User: user, + Glsa: glsa, + GlsaCount: glsaCount, + } +} + +func getFuncMap() template.FuncMap { + return template.FuncMap{ + "bugIsReady": BugIsReady, + "prevGLSA": PrevGLSA, + "nextGLSA": NextGLSA, + } +} + +func BugIsReady(bug bugzilla.Bug) bool { + return bug.IsReady() +} + +func PrevGLSA(id int64, min int64) int64 { + logger.Info.Println("prev glsa") + if id == min { + return id + } + return id - 1 +} + +func NextGLSA(id int64, max int64) int64 { + if id == max { + return id + } + return id + 1 +} diff --git a/pkg/app/handler/glsa/view.go b/pkg/app/handler/glsa/view.go new file mode 100644 index 0000000..d84273c --- /dev/null +++ b/pkg/app/handler/glsa/view.go @@ -0,0 +1,48 @@ +package glsa + +import ( + "glsamaker/pkg/app/handler/authentication" + "glsamaker/pkg/app/handler/authentication/utils" + "glsamaker/pkg/database/connection" + "glsamaker/pkg/models" + "net/http" + "strconv" +) + +// Show renders a template to show the landing page of the application +func View(w http.ResponseWriter, r *http.Request) { + + user := utils.GetAuthenticatedUser(r) + + if !user.Permissions.Glsa.View { + authentication.AccessDenied(w, r) + return + } + + glsaID := r.URL.Path[len("/glsa/"):] + + parsedGlsaId, _ := strconv.ParseInt(glsaID, 10, 64) + glsa := &models.Glsa{Id: parsedGlsaId} + err := user.CanAccess(connection.DB.Model(glsa). + Relation("Bugs"). + Relation("Creator"). + Relation("Comments").WherePK()). + Select() + + if err != nil { + http.NotFound(w, r) + return + } + + if glsa.Permission == "confidential" && user.Confidential() != "confidential" { + authentication.AccessDenied(w, r) + return + } + + glsa.ComputeStatus(user) + glsa.ComputeCommentBadges() + + glsaCount, err := connection.DB.Model((*models.Glsa)(nil)).Count() + + renderViewTemplate(w, user, glsa, int64(glsaCount)) +} diff --git a/pkg/app/handler/home/index.go b/pkg/app/handler/home/index.go new file mode 100644 index 0000000..8f514f7 --- /dev/null +++ b/pkg/app/handler/home/index.go @@ -0,0 +1,16 @@ +// Used to show the landing page of the application + +package home + +import ( + "glsamaker/pkg/app/handler/authentication/utils" + "net/http" +) + +// Show renders a template to show the landing page of the application +func Show(w http.ResponseWriter, r *http.Request) { + + user := utils.GetAuthenticatedUser(r) + + renderHomeTemplate(w, user) +} diff --git a/pkg/app/handler/home/utils.go b/pkg/app/handler/home/utils.go new file mode 100644 index 0000000..5f6e0b5 --- /dev/null +++ b/pkg/app/handler/home/utils.go @@ -0,0 +1,34 @@ +// miscellaneous utility functions used for the landing page of the application + +package home + +import ( + "glsamaker/pkg/models" + "glsamaker/pkg/models/users" + "html/template" + "net/http" +) + +// renderIndexTemplate renders all templates used for the landing page +func renderHomeTemplate(w http.ResponseWriter, user *users.User) { + templates := template.Must( + template.Must( + template.New("Show"). + ParseGlob("web/templates/layout/*.tmpl")). + ParseGlob("web/templates/home/*.tmpl")) + + templates.ExecuteTemplate(w, "home.tmpl", createPageData("home", user)) +} + +// createPageData creates the data used in the template of the landing page +func createPageData(page string, user *users.User) interface{} { + return struct { + Page string + Application *models.GlobalSettings + User *users.User + }{ + Page: page, + Application: models.GetDefaultGlobalSettings(), + User: user, + } +} diff --git a/pkg/app/handler/newRequest/index.go b/pkg/app/handler/newRequest/index.go new file mode 100644 index 0000000..929ac5b --- /dev/null +++ b/pkg/app/handler/newRequest/index.go @@ -0,0 +1,186 @@ +// Used to show the landing page of the application + +package newRequest + +import ( + "glsamaker/pkg/app/handler/authentication" + "glsamaker/pkg/app/handler/authentication/utils" + "glsamaker/pkg/app/handler/glsa" + "glsamaker/pkg/database/connection" + "glsamaker/pkg/logger" + "glsamaker/pkg/models" + "glsamaker/pkg/models/bugzilla" + "glsamaker/pkg/models/cve" + "crypto/sha256" + "fmt" + "github.com/go-pg/pg/v9" + "net/http" + "strconv" + "strings" + "time" +) + +// Show renders a template to show the landing page of the application +func Show(w http.ResponseWriter, r *http.Request) { + + user := utils.GetAuthenticatedUser(r) + + if !user.Permissions.Glsa.Create { + authentication.AccessDenied(w, r) + return + } + + bugs, title, synopsis, description, workaround, impact, background, resolution, importReferences, permissions, access, severity, keyword, comment, err := getParams(r) + newID := getNextGLSAId() + + if err != nil || bugs == "" { + // render without message + renderNewTemplate(w, user, strconv.FormatInt(newID, 10)) + return + } + + // create bugs + newBugs := bugzilla.GetBugsByIds(strings.Split(bugs, ",")) + + for _, newBug := range newBugs { + _, err = connection.DB.Model(&newBug).OnConflict("(id) DO UPDATE").Insert() + + if err != nil { + logger.Error.Println("Error creating bug") + logger.Error.Println(err) + } + + glsaToBug := &models.GlsaToBug{ + GlsaId: newID, + BugId: newBug.Id, + } + + connection.DB.Model(glsaToBug).Insert() + + } + + var references []models.Reference + + // TODO if title is empty try to import from bug + // TODO validate permissions + if importReferences { + // TODO import references + + // import from CVE + for _, bug := range strings.Split(bugs, ",") { + var cves []cve.DefCveItem + connection.DB.Model(&cves).Where("bugs::jsonb @> ?", "\""+bug+"\"").Select() + + for _, cve := range cves { + references = append(references, models.Reference{ + Title: cve.Id, + URL: "https://nvd.nist.gov/vuln/detail/" + cve.Id, + }) + } + + } + + // import from BUG + for _, bug := range newBugs { + for _, alias := range bug.Alias { + if strings.HasPrefix(alias, "CVE-") { + alreadyPresent := false + for _, reference := range references { + if reference.Title == alias { + alreadyPresent = true + } + } + if !alreadyPresent { + references = append(references, models.Reference{ + Title: alias, + URL: "https://nvd.nist.gov/vuln/detail/" + alias, + }) + } + } + } + } + + } + + id := title + bugs + time.Now().String() + id = fmt.Sprintf("%x", sha256.Sum256([]byte(id))) + + glsaType := "request" + if description != "" { + glsaType = "draft" + } + + newGlsa := &models.Glsa{ + //Id: id, + Type: glsaType, + Title: title, + Synopsis: synopsis, + Description: description, + Workaround: workaround, + Impact: impact, + Background: background, + Resolution: resolution, + References: references, + Permission: permissions, + Access: access, + Severity: severity, + Keyword: keyword, + Revision: "r0", + CreatorId: user.Id, + Created: time.Now(), + Updated: time.Now(), + } + + _, err = connection.DB.Model(newGlsa).OnConflict("(id) DO Nothing").Insert() + if err != nil { + logger.Error.Println("Err during creating new GLSA") + logger.Error.Println(err) + } + + if comment != "" { + glsa.AddNewCommment(strconv.FormatInt(newID, 10), user, comment, "comment") + } + + if glsaType == "draft" { + http.Redirect(w, r, "/drafts", 301) + } else { + http.Redirect(w, r, "/requests", 301) + } +} + +func getParams(r *http.Request) (string, string, string, string, string, string, string, string, bool, string, string, string, string, string, error) { + err := r.ParseForm() + if err != nil { + return "", "", "", "", "", "", "", "", false, "", "", "", "", "", err + } + bugs := r.Form.Get("bugs") + title := r.Form.Get("title") + synopsis := r.Form.Get("synopsis") + description := r.Form.Get("description") + workaround := r.Form.Get("workaround") + impact := r.Form.Get("impact") + background := r.Form.Get("background") + resolution := r.Form.Get("resolution") + importReferences := r.Form.Get("importReferences") + permissions := r.Form.Get("permissions") + access := r.Form.Get("access") + severity := r.Form.Get("severity") + keyword := r.Form.Get("keyword") + comment := r.Form.Get("comment") + return bugs, title, synopsis, description, workaround, impact, background, resolution, importReferences == "on", permissions, access, severity, keyword, comment, err +} + +func getNextGLSAId() int64 { + var newID int64 + newID = 1 + var glsas []*models.Glsa + err := connection.DB.Model(&glsas).Order("id DESC").Limit(1).Select() + + if err != nil && err != pg.ErrNoRows { + newID = -1 + } else if glsas != nil && len(glsas) == 1 { + newID = glsas[0].Id + 1 + } + + return newID +} diff --git a/pkg/app/handler/newRequest/utils.go b/pkg/app/handler/newRequest/utils.go new file mode 100644 index 0000000..7192939 --- /dev/null +++ b/pkg/app/handler/newRequest/utils.go @@ -0,0 +1,36 @@ +// miscellaneous utility functions used for the landing page of the application + +package newRequest + +import ( + "glsamaker/pkg/models" + "glsamaker/pkg/models/users" + "html/template" + "net/http" +) + +// renderIndexTemplate renders all templates used for the landing page +func renderNewTemplate(w http.ResponseWriter, user *users.User, newID string) { + templates := template.Must( + template.Must( + template.New("Show"). + ParseGlob("web/templates/layout/*.tmpl")). + ParseGlob("web/templates/new/*.tmpl")) + + templates.ExecuteTemplate(w, "new.tmpl", createPageData("new", user, newID)) +} + +// createPageData creates the data used in the template of the landing page +func createPageData(page string, user *users.User, newID string) interface{} { + return struct { + Page string + Application *models.GlobalSettings + User *users.User + NewID string + }{ + Page: page, + Application: models.GetDefaultGlobalSettings(), + User: user, + NewID: newID, + } +} diff --git a/pkg/app/handler/requests/index.go b/pkg/app/handler/requests/index.go new file mode 100644 index 0000000..fddbd86 --- /dev/null +++ b/pkg/app/handler/requests/index.go @@ -0,0 +1,44 @@ +// Used to show the landing page of the application + +package requests + +import ( + "glsamaker/pkg/app/handler/authentication" + "glsamaker/pkg/app/handler/authentication/utils" + "glsamaker/pkg/database/connection" + "glsamaker/pkg/logger" + "glsamaker/pkg/models" + "net/http" +) + +// Show renders a template to show the landing page of the application +func Show(w http.ResponseWriter, r *http.Request) { + + user := utils.GetAuthenticatedUser(r) + + if !user.Permissions.Glsa.View { + authentication.AccessDenied(w, r) + return + } + + var requests []*models.Glsa + err := user.CanAccess(connection.DB.Model(&requests). + Where("type = ?", "request"). + Relation("Bugs"). + Relation("Creator"). + Relation("Comments")). + Select() + + if err != nil { + logger.Info.Println("Error during request selection") + logger.Info.Println(err) + http.NotFound(w, r) + return + } + + for _, request := range requests { + request.ComputeStatus(user) + } + + renderRequestsTemplate(w, user, requests) +} diff --git a/pkg/app/handler/requests/utils.go b/pkg/app/handler/requests/utils.go new file mode 100644 index 0000000..85bc472 --- /dev/null +++ b/pkg/app/handler/requests/utils.go @@ -0,0 +1,36 @@ +// miscellaneous utility functions used for the landing page of the application + +package requests + +import ( + "glsamaker/pkg/models" + "glsamaker/pkg/models/users" + "html/template" + "net/http" +) + +// renderIndexTemplate renders all templates used for the landing page +func renderRequestsTemplate(w http.ResponseWriter, user *users.User, requests []*models.Glsa) { + templates := template.Must( + template.Must( + template.New("Show"). + ParseGlob("web/templates/layout/*.tmpl")). + ParseGlob("web/templates/requests/*.tmpl")) + + templates.ExecuteTemplate(w, "requests.tmpl", createPageData("requests", user, requests)) +} + +// createPageData creates the data used in the template of the landing page +func createPageData(page string, user *users.User, requests []*models.Glsa) interface{} { + return struct { + Page string + Application *models.GlobalSettings + User *users.User + Requests []*models.Glsa + }{ + Page: page, + Application: models.GetDefaultGlobalSettings(), + User: user, + Requests: requests, + } +} diff --git a/pkg/app/handler/search/index.go b/pkg/app/handler/search/index.go new file mode 100644 index 0000000..1503d9c --- /dev/null +++ b/pkg/app/handler/search/index.go @@ -0,0 +1,126 @@ +// Used to show the landing page of the application + +package search + +import ( + "glsamaker/pkg/app/handler/authentication" + "glsamaker/pkg/app/handler/authentication/utils" + "glsamaker/pkg/database/connection" + "glsamaker/pkg/logger" + "glsamaker/pkg/models" + "github.com/go-pg/pg/v9/orm" + "net/http" + "strconv" +) + +// Show renders a template to show the landing page of the application +func Search(w http.ResponseWriter, r *http.Request) { + + user := utils.GetAuthenticatedUser(r) + + keys, ok := r.URL.Query()["q"] + + if !ok || len(keys[0]) < 1 { + http.NotFound(w, r) + return + } + + // Query()["key"] will return an array of items, + // we only want the single item. + key := keys[0] + + // redirect to glsa if isNumeric + if _, err := strconv.Atoi(key); err == nil { + http.Redirect(w, r, "/glsa/"+key, 301) + } + + if key == "#home" { + http.Redirect(w, r, "/", 301) + return + } else if key == "#dashboard" { + http.Redirect(w, r, "/dashboard", 301) + return + } else if key == "#new" { + http.Redirect(w, r, "/new", 301) + return + } else if key == "#cvetool" { + http.Redirect(w, r, "/cve/tool", 301) + return + } else if key == "#requests" { + http.Redirect(w, r, "/requests", 301) + return + } else if key == "#drafts" { + http.Redirect(w, r, "/drafts", 301) + return + } else if key == "#all" { + http.Redirect(w, r, "/all", 301) + return + } else if key == "#archive" { + http.Redirect(w, r, "/archive", 301) + return + } else if key == "#about" { + http.Redirect(w, r, "/about", 301) + return + } else if key == "#bugzilla" { + http.Redirect(w, r, "https://bugs.gentoo.org/", 301) + return + } else if key == "#admin" { + http.Redirect(w, r, "/admin", 301) + return + } else if key == "#password" { + http.Redirect(w, r, "/account/password", 301) + return + } else if key == "#2fa" { + http.Redirect(w, r, "/account/2fa", 301) + return + } else if key == "#statistics" { + http.Redirect(w, r, "/statistics", 301) + return + } + + if key == "#logout" { + http.Redirect(w, r, "/logout", 301) + return + } + + if !user.Permissions.Glsa.View { + authentication.AccessDenied(w, r) + return + } + + var glsas []*models.Glsa + err := user.CanAccess(connection.DB.Model(&glsas). + Relation("Bugs"). + Relation("Comments"). + Relation("Creator"). + WhereGroup(func(q *orm.Query) (*orm.Query, error) { + q = q.WhereOr("title LIKE " + "'%" + key + "%'"). + WhereOr("type LIKE " + "'%" + key + "%'"). + WhereOr("synopsis LIKE " + "'%" + key + "%'"). + WhereOr("description LIKE " + "'%" + key + "%'"). + WhereOr("workaround LIKE " + "'%" + key + "%'"). + WhereOr("resolution LIKE " + "'%" + key + "%'"). + WhereOr("keyword LIKE " + "'%" + key + "%'"). + WhereOr("background LIKE " + "'%" + key + "%'") + //WhereOr("creator LIKE " + "'%" + key + "%'") + return q, nil + })). + Select() + + // TODO search in comments + // TODO search in bugs + + if err != nil { + logger.Info.Println("Error during searching") + logger.Info.Println(err) + http.NotFound(w, r) + return + } + + for _, glsa := range glsas { + glsa.ComputeStatus(user) + } + + renderSearchTemplate(w, user, key, glsas) + +} diff --git a/pkg/app/handler/search/utils.go b/pkg/app/handler/search/utils.go new file mode 100644 index 0000000..81e4e88 --- /dev/null +++ b/pkg/app/handler/search/utils.go @@ -0,0 +1,38 @@ +// miscellaneous utility functions used for the landing page of the application + +package search + +import ( + "glsamaker/pkg/models" + "glsamaker/pkg/models/users" + "html/template" + "net/http" +) + +// renderIndexTemplate renders all templates used for the landing page +func renderSearchTemplate(w http.ResponseWriter, user *users.User, searchQuery string, searchResults []*models.Glsa) { + templates := template.Must( + template.Must( + template.New("Show"). + ParseGlob("web/templates/layout/*.tmpl")). + ParseGlob("web/templates/search/*.tmpl")) + + templates.ExecuteTemplate(w, "search.tmpl", createPageData("search", user, searchQuery, searchResults)) +} + +// createPageData creates the data used in the template of the landing page +func createPageData(page string, user *users.User, searchQuery string, searchResults []*models.Glsa) interface{} { + return struct { + Page string + Application *models.GlobalSettings + User *users.User + GLSAs []*models.Glsa + SearchQuery string + }{ + Page: page, + Application: models.GetDefaultGlobalSettings(), + User: user, + GLSAs: searchResults, + SearchQuery: searchQuery, + } +} diff --git a/pkg/app/handler/statistics/index.go b/pkg/app/handler/statistics/index.go new file mode 100644 index 0000000..d4b3a4d --- /dev/null +++ b/pkg/app/handler/statistics/index.go @@ -0,0 +1,42 @@ +// Used to show the landing page of the application + +package statistics + +import ( + "glsamaker/pkg/app/handler/authentication/utils" + "glsamaker/pkg/database/connection" + "glsamaker/pkg/models" + "glsamaker/pkg/models/cve" + "net/http" +) + +// Show renders a template to show the landing page of the application +func Show(w http.ResponseWriter, r *http.Request) { + + user := utils.GetAuthenticatedUser(r) + + requests, _ := connection.DB.Model((*models.Glsa)(nil)).Where("type = ?", "request").Count() + drafts, _ := connection.DB.Model((*models.Glsa)(nil)).Where("type = ?", "draft").Count() + glsas, _ := connection.DB.Model((*models.Glsa)(nil)).Where("type = ?", "glsa").Count() + allGlsas, _ := connection.DB.Model((*models.Glsa)(nil)).Count() + + new, _ := connection.DB.Model((*cve.DefCveItem)(nil)).Where("state = ?", "New").Count() + assigned, _ := connection.DB.Model((*cve.DefCveItem)(nil)).Where("state = ?", "Assigned").Count() + nfu, _ := connection.DB.Model((*cve.DefCveItem)(nil)).Where("state = ?", "NFU").Count() + later, _ := connection.DB.Model((*cve.DefCveItem)(nil)).Where("state = ?", "Later").Count() + invalid, _ := connection.DB.Model((*cve.DefCveItem)(nil)).Where("state = ?", "Invalid").Count() + allCVEs, _ := connection.DB.Model((*cve.DefCveItem)(nil)).Count() + + statisticsData := StatisticsData{ + Requests: float64(requests) / float64(allGlsas), + Drafts: float64(drafts) / float64(allGlsas), + Glsas: float64(glsas) / float64(allGlsas), + New: float64(new) / float64(allCVEs), + Assigned: float64(assigned) / float64(allCVEs), + NFU: float64(nfu) / float64(allCVEs), + Later: float64(later) / float64(allCVEs), + Invalid: float64(invalid) / float64(allCVEs), + } + + renderStatisticsTemplate(w, user, &statisticsData) +} diff --git a/pkg/app/handler/statistics/utils.go b/pkg/app/handler/statistics/utils.go new file mode 100644 index 0000000..3e64ddf --- /dev/null +++ b/pkg/app/handler/statistics/utils.go @@ -0,0 +1,48 @@ +// miscellaneous utility functions used for the landing page of the application + +package statistics + +import ( + "glsamaker/pkg/models" + "glsamaker/pkg/models/users" + "html/template" + "net/http" +) + +// renderIndexTemplate renders all templates used for the landing page +func renderStatisticsTemplate(w http.ResponseWriter, user *users.User, statisticsData *StatisticsData) { + templates := template.Must( + template.Must( + template.New("Show"). + ParseGlob("web/templates/layout/*.tmpl")). + ParseGlob("web/templates/statistics/*.tmpl")) + + templates.ExecuteTemplate(w, "statistics.tmpl", createPageData("statistics", user, statisticsData)) +} + +type StatisticsData struct { + Requests float64 + Drafts float64 + Glsas float64 + // CVEs + New float64 + Assigned float64 + NFU float64 + Later float64 + Invalid float64 +} + +// createPageData creates the data used in the template of the landing page +func createPageData(page string, user *users.User, statisticsData *StatisticsData) interface{} { + return struct { + Page string + Application *models.GlobalSettings + User *users.User + Data *StatisticsData + }{ + Page: page, + Application: models.GetDefaultGlobalSettings(), + User: user, + Data: statisticsData, + } +} diff --git a/pkg/app/serve.go b/pkg/app/serve.go new file mode 100644 index 0000000..1f16d9a --- /dev/null +++ b/pkg/app/serve.go @@ -0,0 +1,214 @@ +// Entrypoint for the web application + +package app + +import ( + "glsamaker/pkg/app/handler/about" + "glsamaker/pkg/app/handler/account" + "glsamaker/pkg/app/handler/admin" + "glsamaker/pkg/app/handler/all" + "glsamaker/pkg/app/handler/archive" + "glsamaker/pkg/app/handler/authentication" + "glsamaker/pkg/app/handler/authentication/totp" + "glsamaker/pkg/app/handler/authentication/utils" + "glsamaker/pkg/app/handler/authentication/webauthn" + "glsamaker/pkg/app/handler/cvetool" + "glsamaker/pkg/app/handler/dashboard" + "glsamaker/pkg/app/handler/drafts" + "glsamaker/pkg/app/handler/glsa" + "glsamaker/pkg/app/handler/home" + "glsamaker/pkg/app/handler/newRequest" + "glsamaker/pkg/app/handler/requests" + "glsamaker/pkg/app/handler/search" + "glsamaker/pkg/app/handler/statistics" + "glsamaker/pkg/config" + "glsamaker/pkg/database" + "glsamaker/pkg/database/connection" + "glsamaker/pkg/logger" + "glsamaker/pkg/models" + "log" + "net/http" + "strings" +) + +// Serve is used to serve the web application +func Serve() { + + database.Connect() + defer connection.DB.Close() + + CreateDefaultAdmin() + models.SeedInitialApplicationData() + + // public login page + loginPage("/login", authentication.Login) + + // second factor login page + // (either totp or webauthn, depending on the user settings) + twoFactorLogin("/login/2fa", authentication.SecondFactorLogin) + + // webauthn login endpoints + twoFactorLogin("/login/2fa/totp", totp.Login) + + // webauthn login endpoints + twoFactorLogin("/login/2fa/webauthn/begin", webauthn.BeginLogin) + twoFactorLogin("/login/2fa/webauthn/finish", webauthn.FinishLogin) + + requireLogin("/", home.Show) + + requireLogin("/dashboard", dashboard.Show) + + requireLogin("/statistics", statistics.Show) + + requireLogin("/search", search.Search) + + requireLogin("/about", about.Show) + requireLogin("/about/search", about.ShowSearch) + requireLogin("/about/cli", about.ShowCLI) + + requireLogin("/archive", archive.Show) + + requireLogin("/drafts", drafts.Show) + + requireLogin("/requests", requests.Show) + + requireLogin("/all", all.Show) + + requireLogin("/new", newRequest.Show) + + requireLogin("/cve/update", cvetool.Update) + requireLogin("/cve/tool", cvetool.Show) + requireLogin("/cve/tool/fullscreen", cvetool.ShowFullscreen) + requireLogin("/cve/data", cvetool.CveData) + requireLogin("/cve/add", cvetool.Add) + requireLogin("/cve/comment/add", cvetool.AddComment) + requireLogin("/cve/bug/assign", cvetool.AssignBug) + requireLogin("/cve/state/change", cvetool.ChangeState) + + requireLogin("/logout", authentication.Logout) + + requireLogin("/account/password", account.ChangePassword) + requireLogin("/account/2fa", account.TwoFactorAuth) + requireLogin("/account/2fa/notice/disable", account.Disable2FANotice) + requireLogin("/account/2fa/totp/activate", account.ActivateTOTP) + requireLogin("/account/2fa/totp/disable", account.DisableTOTP) + requireLogin("/account/2fa/totp/verify", account.VerifyTOTP) + requireLogin("/account/2fa/webauthn/activate", account.ActivateWebAuthn) + requireLogin("/account/2fa/webauthn/disable", account.DisableWebAuthn) + requireLogin("/account/2fa/webauthn/register/begin", webauthn.BeginRegistration) + requireLogin("/account/2fa/webauthn/register/finish", webauthn.FinishRegistration) + + requireLogin("/glsa/", glsa.View) + requireLogin("/glsa/edit/", glsa.Edit) + requireLogin("/glsa/comment/add", glsa.AddComment) + requireLogin("/glsa/delete/", glsa.Delete) + requireLogin("/glsa/release/", glsa.Release) + requireLogin("/glsa/bugs/update", glsa.UpdateBugs) + + requireAdmin("/admin", admin.Show) + requireAdmin("/admin/", admin.Show) + requireAdmin("/admin/edit/users", admin.EditUsers) + requireAdmin("/admin/edit/permissions", admin.EditPermissions) + requireAdmin("/admin/edit/password/reset/", admin.ResetPassword) + + fs := http.StripPrefix("/assets/", http.FileServer(http.Dir("/go/src/glsamaker/assets"))) + requireLogin("/assets/", fs.ServeHTTP) + + logger.Info.Println("Serving on port " + config.Port()) + log.Fatal(http.ListenAndServe(":"+config.Port(), nil)) +} + +func loginPage(path string, handler http.HandlerFunc) { + http.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) { + setDefaultHeaders(w) + + if utils.IsAuthenticated(w, r) { + http.Redirect(w, r, "/", 301) + } else if utils.Only2FAMissing(w, r) { + http.Redirect(w, r, "/login/2fa", 301) + } else { + handler(w, r) + } + }) +} + +func twoFactorLogin(path string, handler http.HandlerFunc) { + http.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) { + setDefaultHeaders(w) + + if utils.IsAuthenticated(w, r) { + http.Redirect(w, r, "/", 301) + } else if utils.Only2FAMissing(w, r) { + handler(w, r) + } else { + http.Redirect(w, r, "/login", 301) + } + }) +} + +// define a route using the default middleware and the given handler +func requireLogin(path string, handler http.HandlerFunc) { + http.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) { + setDefaultHeaders(w) + + if utils.IsAuthenticatedAndNeedsNewPassword(w, r) { + if strings.HasPrefix(path, "/logout") || + strings.HasPrefix(path, "/assets/") || + strings.HasPrefix(path, "/account/password") { + handler(w, r) + } else { + http.Redirect(w, r, "/account/password", 301) + } + } else if utils.IsAuthenticatedAndNeeds2FA(w, r) { + if strings.HasPrefix(path, "/logout") || + strings.HasPrefix(path, "/assets/") || + strings.HasPrefix(path, "/account/2fa") { + handler(w, r) + } else { + http.Redirect(w, r, "/account/2fa", 301) + } + } else if utils.IsAuthenticated(w, r) { + handler(w, r) + } else if utils.Only2FAMissing(w, r) { + http.Redirect(w, r, "/login/2fa", 301) + } else { + http.Redirect(w, r, "/login", 301) + } + }) +} + +// define a route using the default middleware and the given handler +func requireAdmin(path string, handler http.HandlerFunc) { + http.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) { + setDefaultHeaders(w) + + if utils.IsAuthenticatedAndNeedsNewPassword(w, r) { + if strings.HasPrefix(path, "/logout") || + strings.HasPrefix(path, "/assets/") || + strings.HasPrefix(path, "/account/password") { + handler(w, r) + } else { + http.Redirect(w, r, "/account/password", 301) + } + } else if utils.IsAuthenticatedAndNeeds2FA(w, r) { + if strings.HasPrefix(path, "/logout") || + strings.HasPrefix(path, "/assets/") || + strings.HasPrefix(path, "/account/2fa") { + handler(w, r) + } else { + http.Redirect(w, r, "/account/2fa", 301) + } + } else if utils.IsAuthenticatedAsAdmin(w, r) { + handler(w, r) + } else if utils.IsAuthenticated(w, r) { + authentication.AccessDenied(w, r) + } else { + http.Redirect(w, r, "/login", 301) + } + }) +} + +// setDefaultHeaders sets the default headers that apply for all pages +func setDefaultHeaders(w http.ResponseWriter) { + w.Header().Set("Cache-Control", "no-store") +} diff --git a/pkg/app/utils.go b/pkg/app/utils.go new file mode 100644 index 0000000..9d66c13 --- /dev/null +++ b/pkg/app/utils.go @@ -0,0 +1,89 @@ +package app + +import ( + "glsamaker/pkg/app/handler/authentication/totp" + "glsamaker/pkg/config" + "glsamaker/pkg/database/connection" + "glsamaker/pkg/logger" + "glsamaker/pkg/models/users" +) + +func defaultAdminPermissions() users.Permissions { + return users.Permissions{ + Glsa: users.GlsaPermissions{ + View: true, + UpdateBugs: true, + Comment: true, + Create: true, + Edit: true, + Approve: true, + ApproveOwnGlsa: true, + Decline: true, + Delete: true, + Release: true, + Confidential: true, + }, + CVETool: users.CVEToolPermissions{ + View: true, + UpdateCVEs: true, + Comment: true, + AddPackage: true, + ChangeState: true, + AssignBug: true, + CreateBug: true, + }, + Admin: users.AdminPermissions{ + View: true, + CreateTemplates: true, + ManageUsers: true, + GlobalSettings: true, + }, + } +} + +func CreateDefaultAdmin() { + + token, qrcode := totp.Generate(config.AdminEmail()) + + badge := users.Badge{ + Name: "admin", + Description: "Admin Account", + Color: "orange", + } + + passwordParameters := users.Argon2Parameters{ + Type: "argon2id", + Time: 1, + Memory: 64 * 1024, + Threads: 4, + KeyLen: 32, + } + passwordParameters.GenerateSalt(32) + passwordParameters.GeneratePassword(config.AdminInitialPassword()) + + defaultUser := &users.User{ + Email: config.AdminEmail(), + Password: passwordParameters, + Nick: "admin", + Name: "Admin Account", + Role: "admin", + ForcePasswordChange: false, + TOTPSecret: token, + TOTPQRCode: qrcode, + IsUsingTOTP: false, + WebauthnCredentials: nil, + IsUsingWebAuthn: false, + Show2FANotice: true, + Badge: badge, + Disabled: false, + ForcePasswordRotation: false, + Force2FA: false, + Permissions: defaultAdminPermissions(), + } + + _, err := connection.DB.Model(defaultUser).OnConflict("(email) DO Nothing").Insert() + if err != nil { + logger.Error.Println("Err during creating default admin user") + logger.Error.Println(err) + } +} diff --git a/pkg/config/config.go b/pkg/config/config.go new file mode 100644 index 0000000..bab084d --- /dev/null +++ b/pkg/config/config.go @@ -0,0 +1,63 @@ +package config + +import "os" + +func PostgresUser() string { + return getEnv("GLSAMAKER_POSTGRES_USER", "root") +} + +func PostgresPass() string { + return getEnv("GLSAMAKER_POSTGRES_PASS", "root") +} + +func PostgresDb() string { + return getEnv("GLSAMAKER_POSTGRES_DB", "glsamaker") +} + +func PostgresHost() string { + return getEnv("GLSAMAKER_POSTGRES_HOST", "db") +} + +func PostgresPort() string { + return getEnv("GLSAMAKER_POSTGRES_PORT", "5432") +} + +func Debug() string { + return getEnv("GLSAMAKER_DEBUG", "false") +} + +func Quiet() string { + return getEnv("GLSAMAKER_QUIET", "false") +} + +func LogFile() string { + return getEnv("GLSAMAKER_LOG_FILE", "/var/log/glsamaker/errors.log") +} + +func Version() string { + return getEnv("GLSAMAKER_VERSION", "v0.1.0") +} + +func Port() string { + return getEnv("GLSAMAKER_PORT", "5000") +} + +func AdminEmail() string { + return getEnv("GLSAMAKER_EMAIL", "admin@gentoo.org") +} + +func AdminInitialPassword() string { + return getEnv("GLSAMAKER_INITIAL_ADMIN_PASSWORD", "admin") +} + +func CacheControl() string { + return getEnv("GLSAMAKER_CACHE_CONTROL", "max-age=300") +} + +func getEnv(key string, fallback string) string { + if os.Getenv(key) != "" { + return os.Getenv(key) + } else { + return fallback + } +} diff --git a/pkg/cveimport/update.go b/pkg/cveimport/update.go new file mode 100644 index 0000000..a15e447 --- /dev/null +++ b/pkg/cveimport/update.go @@ -0,0 +1,96 @@ +package cveimport + +import ( + "glsamaker/pkg/database" + "glsamaker/pkg/database/connection" + "glsamaker/pkg/logger" + "glsamaker/pkg/models" + "glsamaker/pkg/models/cve" + "compress/gzip" + "encoding/json" + "io" + "io/ioutil" + "net/http" + "strconv" +) + +func Update() { + database.Connect() + defer connection.DB.Close() + + logger.Info.Println("Start update...") + IncrementalCVEImport() + logger.Info.Println("Finished update...") +} + +func FullUpdate() { + database.Connect() + defer connection.DB.Close() + + logger.Info.Println("Start full update...") + FullCVEImport() + logger.Info.Println("Finished full update...") +} + +func IncrementalCVEImport() { + logger.Info.Println("Start importing recent CVEs") + importCVEs("recent") + logger.Info.Println("Finished importing recent CVEs") +} + +func FullCVEImport() { + for i := 2002; i <= 2020; i++ { + year := strconv.Itoa(i) + logger.Info.Println("Import CVEs from " + year) + importCVEs(year) + logger.Info.Println("Finished importing recent CVEs") + } +} + +func importCVEs(year string) { + resp, err := http.Get("https://nvd.nist.gov/feeds/json/cve/1.1/nvdcve-1.1-" + year + ".json.gz") + if err != nil { + logger.Error.Println("err") + logger.Error.Println(err) + return + } + defer resp.Body.Close() + + var reader io.ReadCloser + reader, err = gzip.NewReader(resp.Body) + defer reader.Close() + + s, _ := ioutil.ReadAll(reader) + + var data cve.NVDFeed + + err = json.Unmarshal([]byte(s), &data) + + if err != nil { + logger.Info.Println("ERROR during unmarshal:") + logger.Info.Println(err) + } + + for _, cveitem := range data.CVEItems { + cveitem.Id = cveitem.Cve.CVEDataMeta.ID + cveitem.State = "New" + + description := "" + for _, langstring := range cveitem.Cve.Description.DescriptionData { + if langstring.Lang == "en" { + description = langstring.Value + } + } + cveitem.Description = description + + _, err := connection.DB.Model(cveitem).OnConflict("(id) DO UPDATE").Insert() + if err != nil { + logger.Error.Println("Err during CVE insert") + logger.Error.Println(err) + } + } + + // update the time of the last bug update + models.SetApplicationValue("LastCVEUpdate", "") + +} diff --git a/pkg/database/connection/connection.go b/pkg/database/connection/connection.go new file mode 100644 index 0000000..733aee2 --- /dev/null +++ b/pkg/database/connection/connection.go @@ -0,0 +1,42 @@ +// Contains utility functions around the database + +package connection + +import ( + "glsamaker/pkg/config" + "glsamaker/pkg/logger" + "context" + "github.com/go-pg/pg/v9" +) + +// DBCon is the connection handle +// for the database +var ( + DB *pg.DB +) + +type dbLogger struct{} + +func (d dbLogger) BeforeQuery(c context.Context, q *pg.QueryEvent) (context.Context, error) { + return c, nil +} + +// AfterQuery is used to log SQL queries +func (d dbLogger) AfterQuery(c context.Context, q *pg.QueryEvent) error { + logger.Debug.Println(q.FormattedQuery()) + return nil +} + +// Connect is used to connect to the database +// and turn on logging if desired +func Connect() { + DB = pg.Connect(&pg.Options{ + User: config.PostgresUser(), + Password: config.PostgresPass(), + Database: config.PostgresDb(), + Addr: config.PostgresHost() + ":" + config.PostgresPort(), + }) + + DB.AddQueryHook(dbLogger{}) + +} diff --git a/pkg/database/init.go b/pkg/database/init.go new file mode 100644 index 0000000..1949e27 --- /dev/null +++ b/pkg/database/init.go @@ -0,0 +1,23 @@ +// Contains utility functions around the database + +package database + +import ( + "glsamaker/pkg/database/connection" + "glsamaker/pkg/database/schema" + "glsamaker/pkg/logger" + "log" +) + +// Connect is used to connect to the database +// and turn on logging if desired +func Connect() { + connection.Connect() + err := schema.CreateSchema(connection.DB) + if err != nil { + logger.Error.Println("ERROR: Could not create database schema") + logger.Error.Println(err) + log.Fatalln(err) + } + +} diff --git a/pkg/database/schema/create.go b/pkg/database/schema/create.go new file mode 100644 index 0000000..d87d962 --- /dev/null +++ b/pkg/database/schema/create.go @@ -0,0 +1,36 @@ +package schema + +import ( + "glsamaker/pkg/models" + "glsamaker/pkg/models/bugzilla" + "glsamaker/pkg/models/cve" + "glsamaker/pkg/models/users" + "github.com/go-pg/pg/v9" + "github.com/go-pg/pg/v9/orm" +) + +// CreateSchema creates the tables in the database +// in case they don't alreay exist +func CreateSchema(dbCon *pg.DB) error { + for _, model := range []interface{}{ + (*models.GlobalSettings)(nil), + (*models.ApplicationSetting)(nil), + (*users.User)(nil), + (*models.Session)(nil), + (*bugzilla.Bug)(nil), + (*models.Glsa)(nil), + (*models.GlsaToBug)(nil), + (*cve.Comment)(nil), + (*cve.DefCveItem)(nil), + (*cve.DefCveItemToBug)(nil)} { + + err := dbCon.CreateTable(model, &orm.CreateTableOptions{ + IfNotExists: true, + }) + if err != nil { + return err + } + + } + return nil +} diff --git a/pkg/logger/loggers.go b/pkg/logger/loggers.go new file mode 100644 index 0000000..0ef51e9 --- /dev/null +++ b/pkg/logger/loggers.go @@ -0,0 +1,39 @@ +package logger + +import ( + "io" + "log" + "os" +) + +var ( + Debug *log.Logger + Info *log.Logger + Error *log.Logger +) + +func Init( + debugHandle io.Writer, + infoHandle io.Writer, + errorHandle io.Writer) { + + Debug = log.New(debugHandle, + "DEBUG: ", + log.Ldate|log.Ltime|log.Lshortfile) + + Info = log.New(infoHandle, + "INFO: ", + log.Ldate|log.Ltime|log.Lshortfile) + + Error = log.New(errorHandle, + "ERROR: ", + log.Ldate|log.Ltime|log.Lshortfile) +} + +func CreateLogFile(path string) *os.File { + f, err := os.OpenFile(path, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + log.Println(err) + } + return f +} diff --git a/pkg/models/application.go b/pkg/models/application.go new file mode 100644 index 0000000..56e673c --- /dev/null +++ b/pkg/models/application.go @@ -0,0 +1,69 @@ +// Contains the model of the application data + +package models + +import ( + "glsamaker/pkg/config" + "glsamaker/pkg/database/connection" + "time" +) + +type ApplicationSetting struct { + Key string `pg:",pk"` + Value string + LastUpdate time.Time + //LastBugUpdate time.Time + //LastCVEUpdate time.Time +} + +type GlobalSettings struct { + LastBugUpdate time.Time + LastCVEUpdate time.Time + Version string + Force2FALogin bool + Force2FAGLSARelease bool +} + +func GetApplicationKey(key string) *ApplicationSetting { + applicationData := &ApplicationSetting{Key: key} + connection.DB.Model(applicationData).WherePK().Select() + return applicationData +} + +func SetApplicationValue(key string, value string) { + applicationData := &ApplicationSetting{ + Key: key, + Value: value, + LastUpdate: time.Now(), + } + + connection.DB.Model(applicationData).WherePK().OnConflict("(key) DO Update").Insert() +} + +func SeedApplicationValue(key string, value string) { + applicationData := &ApplicationSetting{ + Key: key, + Value: value, + LastUpdate: time.Now(), + } + + connection.DB.Model(applicationData).WherePK().OnConflict("(key) DO Nothing").Insert() +} + +func GetDefaultGlobalSettings() *GlobalSettings { + return &GlobalSettings{ + LastBugUpdate: GetApplicationKey("LastBugUpdate").LastUpdate, + LastCVEUpdate: GetApplicationKey("LastCVEUpdate").LastUpdate, + Version: GetApplicationKey("Version").Value, + Force2FALogin: GetApplicationKey("Force2FALogin").Value == "1", + Force2FAGLSARelease: GetApplicationKey("Force2FAGLSARelease").Value == "1", + } +} + +func SeedInitialApplicationData() { + SeedApplicationValue("LastBugUpdate", "") + SeedApplicationValue("LastCVEUpdate", "") + SeedApplicationValue("Version", config.Version()) + SeedApplicationValue("Force2FALogin", "0") + SeedApplicationValue("Force2FAGLSARelease", "0") +} diff --git a/pkg/models/bugzilla/bugs.go b/pkg/models/bugzilla/bugs.go new file mode 100644 index 0000000..9654841 --- /dev/null +++ b/pkg/models/bugzilla/bugs.go @@ -0,0 +1,156 @@ +package bugzilla + +import ( + "encoding/json" + "glsamaker/pkg/database/connection" + "io/ioutil" + "net/http" + "strconv" + "strings" +) + +type Bugs struct { + Bugs []Bug +} + +// missing flags +type Bug struct { + Id int64 `json:"id" pg:",pk"` + Alias []string `json:"alias"` + AssignedTo string `json:"assigned_to"` + AssignedToDetail Contributor `json:"assigned_to"` + Blocks []int64 `json:"blocks"` + CC []string `json:"cc"` + CCDetail []Contributor `json:"cc_detail"` + Classification string `json:"classification"` + Component string `json:"component"` + CreationTime string `json:"creation_time"` + Creator string `json:"creator"` + CreatorDetail Contributor `json:"creator_detail"` + DependsOn []int64 `json:"depends_on"` + DupeOf int64 `json:"dupe_of"` + Groups []string `json:"groups"` + IsCCAccessible bool `json:"is_cc_accessible"` + IsConfirmed bool `json:"is_confirmed"` + IsCreatorAccessible bool `json:"is_creator_accessible"` + IsOpen bool `json:"is_open"` + Keywords []string `json:"keywords"` + LastChangeTime string `json:"last_change_time"` + OpSys string `json:"op_sys"` + Platform string `json:"platform"` + Priority string `json:"priority"` + Product string `json:"product"` + QAContact string `json:"qa_contact"` + Resolution string `json:"resolution"` + SeeAlso []string `json:"see_also"` + Severity string `json:"severity"` + Status string `json:"status"` + Summary string `json:"summary"` + TargetMilestone string `json:"target_milestone"` + Url string `json:"url"` + Version string `json:"version"` + Whiteboard string `json:"whiteboard"` +} + +type Contributor struct { + Email string `json:"email"` + Id int64 `json:"id"` + Name string `json:"name"` + RealName string `json:"real_name"` +} + +func (bug *Bug) IsReady() bool { + return strings.Contains(bug.Whiteboard, "[glsa") +} + +func GetBugById(id string) Bug { + + parsedId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + return Bug{} + } + + bug := &Bug{Id: parsedId} + err = connection.DB.Model(bug).WherePK().Select() + + if err == nil && bug != nil { + return *bug + } + + resp, err := http.Get("https://bugs.gentoo.org/rest/bug?id=" + id) + if err != nil { + return Bug{} + } + + // Read body + b, err := ioutil.ReadAll(resp.Body) + defer resp.Body.Close() + if err != nil { + return Bug{} + } + + // Unmarshal + var bugs Bugs + err = json.Unmarshal(b, &bugs) + if err != nil || bugs.Bugs == nil || len(bugs.Bugs) == 0 { + return Bug{} + } + + return bugs.Bugs[0] +} + +func GetBugsByIds(ids []string) []Bug { + + var result []Bug + + if len(ids) < 1 { + return result + } + + // get existing bugs from database + var newBugIds []string + for _, id := range ids { + + parsedId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + continue + } + + bug := &Bug{Id: parsedId} + err = connection.DB.Model(bug).WherePK().Select() + + if err == nil && bug != nil { + result = append(result, *bug) + } else { + newBugIds = append(newBugIds, id) + } + + } + + // if there are new bugs, import them + if len(newBugIds) > 0 { + var bugs Bugs + resp, err := http.Get("https://bugs.gentoo.org/rest/bug?id=" + strings.Join(newBugIds, ",")) + + if err != nil { + return bugs.Bugs + } + + // Read body + b, err := ioutil.ReadAll(resp.Body) + defer resp.Body.Close() + if err != nil { + return bugs.Bugs + } + + // Unmarshal + err = json.Unmarshal(b, &bugs) + if err != nil || bugs.Bugs == nil || len(bugs.Bugs) == 0 { + return result + } + + result = append(result, bugs.Bugs...) + } + + return result +} diff --git a/pkg/models/cve/cve.go b/pkg/models/cve/cve.go new file mode 100644 index 0000000..397b156 --- /dev/null +++ b/pkg/models/cve/cve.go @@ -0,0 +1,86 @@ +package cve + +// CVE +type CVE struct { + Affects *Affects `json:"affects,omitempty"` + CVEDataMeta *CVEDataMeta `json:"CVE_data_meta"` + DataFormat string `json:"data_format"` + DataType string `json:"data_type"` + DataVersion string `json:"data_version"` + Description *Description `json:"description"` + Problemtype *Problemtype `json:"problemtype"` + References *References `json:"references"` +} + +// Affects +type Affects struct { + Vendor *Vendor `json:"vendor"` +} + +// CVEDataMeta +type CVEDataMeta struct { + ASSIGNER string `json:"ASSIGNER"` + ID string `json:"ID"` + STATE string `json:"STATE,omitempty"` +} + +// Description +type Description struct { + DescriptionData []*LangString `json:"description_data"` +} + +// LangString +type LangString struct { + Lang string `json:"lang"` + Value string `json:"value"` +} + +// Problemtype +type Problemtype struct { + ProblemtypeData []*ProblemtypeDataItems `json:"problemtype_data"` +} + +// ProblemtypeDataItems +type ProblemtypeDataItems struct { + Description []*LangString `json:"description"` +} + +// Product +type Product struct { + ProductData []*Product `json:"product_data"` +} + +// Reference +type Reference struct { + Name string `json:"name,omitempty"` + Refsource string `json:"refsource,omitempty"` + Tags []string `json:"tags,omitempty"` + Url string `json:"url"` +} + +// References +type References struct { + ReferenceData []*Reference `json:"reference_data"` +} + +// Vendor +type Vendor struct { + VendorData []*VendorDataItems `json:"vendor_data"` +} + +// VendorDataItems +type VendorDataItems struct { + Product *Product `json:"product"` + VendorName string `json:"vendor_name"` +} + +// Version +type Version struct { + VersionData []*VersionDataItems `json:"version_data"` +} + +// VersionDataItems +type VersionDataItems struct { + VersionAffected string `json:"version_affected,omitempty"` + VersionValue string `json:"version_value"` +} diff --git a/pkg/models/cve/cvss.go b/pkg/models/cve/cvss.go new file mode 100644 index 0000000..987a5d5 --- /dev/null +++ b/pkg/models/cve/cvss.go @@ -0,0 +1,62 @@ +package cve + +// CvssV2 Common Vulnerability Scoring System version 2.0 +type CvssV2 struct { + AccessComplexity string `json:"accessComplexity,omitempty"` + AccessVector string `json:"accessVector,omitempty"` + Authentication string `json:"authentication,omitempty"` + AvailabilityImpact string `json:"availabilityImpact,omitempty"` + AvailabilityRequirement string `json:"availabilityRequirement,omitempty"` + BaseScore float64 `json:"baseScore"` + CollateralDamagePotential string `json:"collateralDamagePotential,omitempty"` + ConfidentialityImpact string `json:"confidentialityImpact,omitempty"` + ConfidentialityRequirement string `json:"confidentialityRequirement,omitempty"` + EnvironmentalScore float64 `json:"environmentalScore,omitempty"` + Exploitability string `json:"exploitability,omitempty"` + IntegrityImpact string `json:"integrityImpact,omitempty"` + IntegrityRequirement string `json:"integrityRequirement,omitempty"` + RemediationLevel string `json:"remediationLevel,omitempty"` + ReportConfidence string `json:"reportConfidence,omitempty"` + TargetDistribution string `json:"targetDistribution,omitempty"` + TemporalScore float64 `json:"temporalScore,omitempty"` + VectorString string `json:"vectorString"` + + // CVSS Version + Version string `json:"version"` +} + +// CvssV3 Common Vulnerability Scoring System version 3.x (BETA) +type CvssV3 struct { + AttackComplexity string `json:"attackComplexity,omitempty"` + AttackVector string `json:"attackVector,omitempty"` + AvailabilityImpact string `json:"availabilityImpact,omitempty"` + AvailabilityRequirement string `json:"availabilityRequirement,omitempty"` + BaseScore float64 `json:"baseScore"` + BaseSeverity string `json:"baseSeverity"` + ConfidentialityImpact string `json:"confidentialityImpact,omitempty"` + ConfidentialityRequirement string `json:"confidentialityRequirement,omitempty"` + EnvironmentalScore float64 `json:"environmentalScore,omitempty"` + EnvironmentalSeverity string `json:"environmentalSeverity,omitempty"` + ExploitCodeMaturity string `json:"exploitCodeMaturity,omitempty"` + IntegrityImpact string `json:"integrityImpact,omitempty"` + IntegrityRequirement string `json:"integrityRequirement,omitempty"` + ModifiedAttackComplexity string `json:"modifiedAttackComplexity,omitempty"` + ModifiedAttackVector string `json:"modifiedAttackVector,omitempty"` + ModifiedAvailabilityImpact string `json:"modifiedAvailabilityImpact,omitempty"` + ModifiedConfidentialityImpact string `json:"modifiedConfidentialityImpact,omitempty"` + ModifiedIntegrityImpact string `json:"modifiedIntegrityImpact,omitempty"` + ModifiedPrivilegesRequired string `json:"modifiedPrivilegesRequired,omitempty"` + ModifiedScope string `json:"modifiedScope,omitempty"` + ModifiedUserInteraction string `json:"modifiedUserInteraction,omitempty"` + PrivilegesRequired string `json:"privilegesRequired,omitempty"` + RemediationLevel string `json:"remediationLevel,omitempty"` + ReportConfidence string `json:"reportConfidence,omitempty"` + Scope string `json:"scope,omitempty"` + TemporalScore float64 `json:"temporalScore,omitempty"` + TemporalSeverity string `json:"temporalSeverity,omitempty"` + UserInteraction string `json:"userInteraction,omitempty"` + VectorString string `json:"vectorString"` + + // CVSS Version + Version string `json:"version"` +} diff --git a/pkg/models/cve/feed.go b/pkg/models/cve/feed.go new file mode 100644 index 0000000..527f233 --- /dev/null +++ b/pkg/models/cve/feed.go @@ -0,0 +1,116 @@ +package cve + +import ( + "glsamaker/pkg/models/bugzilla" + "glsamaker/pkg/models/gpackage" + "glsamaker/pkg/models/users" + "time" +) + +// NVDFeed +type NVDFeed struct { + CVEDataFormat string `json:"CVE_data_format"` + + // NVD adds number of CVE in this feed + CVEDataNumberOfCVEs string `json:"CVE_data_numberOfCVEs,omitempty"` + + // NVD adds feed date timestamp + CVEDataTimestamp string `json:"CVE_data_timestamp,omitempty"` + CVEDataType string `json:"CVE_data_type"` + CVEDataVersion string `json:"CVE_data_version"` + + // NVD feed array of CVE + CVEItems []*DefCveItem `json:"CVE_Items"` +} + +// DefConfigurations Defines the set of product configurations for a NVD applicability statement. +type DefConfigurations struct { + CVEDataVersion string `json:"CVE_data_version"` + Nodes []*DefNode `json:"nodes,omitempty"` +} + +// DefCpeMatch CPE match string or range +type DefCpeMatch struct { + Cpe22Uri string `json:"cpe22Uri,omitempty"` + Cpe23Uri string `json:"cpe23Uri"` + CpeName []*DefCpeName `json:"cpe_name,omitempty"` + VersionEndExcluding string `json:"versionEndExcluding,omitempty"` + VersionEndIncluding string `json:"versionEndIncluding,omitempty"` + VersionStartExcluding string `json:"versionStartExcluding,omitempty"` + VersionStartIncluding string `json:"versionStartIncluding,omitempty"` + Vulnerable bool `json:"vulnerable"` +} + +// DefCpeName CPE name +type DefCpeName struct { + Cpe22Uri string `json:"cpe22Uri,omitempty"` + Cpe23Uri string `json:"cpe23Uri"` + LastModifiedDate string `json:"lastModifiedDate,omitempty"` +} + +// DefCveItem Defines a vulnerability in the NVD data feed. +type DefCveItem struct { + Id string `pg:",pk"` + State string `pg:"state"` + Configurations *DefConfigurations `json:"configurations,omitempty"` + Cve CVE `json:"cve"` + Description string + Impact *DefImpact `json:"impact,omitempty"` + LastModifiedDate string `json:"lastModifiedDate,omitempty"` + PublishedDate string `json:"publishedDate,omitempty"` + + Comments []Comment `pg:",fk:cve_id"` + Packages []gpackage.Package + Bugs []bugzilla.Bug `pg:"many2many:def_cve_item_to_bugs,joinFK:bug_id"` +} + +type DefCveItemToBug struct { + DefCveItemId string `pg:",unique:cve_to_bug"` + BugId int64 `pg:",unique:cve_to_bug"` +} + +type Comment struct { + Id int64 `pg:",pk,unique"` + GlsaId int64 + CVEId string + User int64 + UserBadge users.Badge + Type string + Message string + // Date time.Time `pg:"-"` + Date time.Time +} + +// DefNode Defines a node or sub-node in an NVD applicability statement. +type DefNode struct { + Children []*DefNode `json:"children,omitempty"` + CpeMatch []*DefCpeMatch `json:"cpe_match,omitempty"` + Negate bool `json:"negate,omitempty"` + Operator string `json:"operator,omitempty"` +} + +// DefImpact Impact scores for a vulnerability as found on NVD. +type DefImpact struct { + BaseMetricV3 BaseMetricV3 `json:"baseMetricV3"` + BaseMetricV2 BaseMetricV2 `json:"baseMetricV2"` +} + +// BaseMetricV2 CVSS V2.0 score. +type BaseMetricV2 struct { + CvssV2 CvssV2 `json:"cvssV2"` + Severity string `json:"severity"` + ExploitabilityScore float32 `json:"exploitabilityScore"` + ImpactScore float32 `json:"impactScore"` + AcInsufInfo bool `json:"acInsufInfo"` + ObtainAllPrivilege bool `json:"obtainAllPrivilege"` + ObtainUserPrivilege bool `json:"obtainUserPrivilege"` + ObtainOtherPrivilege bool `json:"obtainOtherPrivilege"` + UserInteractionRequired bool `json:"userInteractionRequired"` +} + +// BaseMetricV3 CVSS V3.x score. +type BaseMetricV3 struct { + CvssV3 CvssV3 `json:"cvssV3"` + ExploitabilityScore float32 `json:"exploitabilityScore"` + ImpactScore float32 `json:"impactScore"` +} diff --git a/pkg/models/glsa.go b/pkg/models/glsa.go new file mode 100644 index 0000000..9f8c3ec --- /dev/null +++ b/pkg/models/glsa.go @@ -0,0 +1,115 @@ +package models + +import ( + "glsamaker/pkg/database/connection" + "glsamaker/pkg/models/bugzilla" + "glsamaker/pkg/models/cve" + "glsamaker/pkg/models/gpackage" + "glsamaker/pkg/models/users" + "time" +) + +type Glsa struct { + // Id string + Id int64 `pg:",pk,unique"` + Alias string + Type string + Title string + Synopsis string + Packages []gpackage.Package + Description string + Impact string + Workaround string + Resolution string + References []Reference + Permission string + Access string + Severity string + Keyword string + Background string + Bugs []bugzilla.Bug `pg:"many2many:glsa_to_bugs,joinFK:bug_id"` + Comments []cve.Comment `pg:",fk:glsa_id"` + Revision string + ApprovedBy []int64 + DeclinedBy []int64 + CreatorId int64 + Creator *users.User + Created time.Time + Updated time.Time + Status Status `pg:"-"` +} + +type GlsaToBug struct { + GlsaId int64 `pg:",unique:glsa_to_bug"` + BugId int64 `pg:",unique:glsa_to_bug"` +} + +type Reference struct { + Title string + URL string +} + +type Status struct { + BugReady bool + Approval string + WorkflowStatus string + Permission string +} + +func (glsa *Glsa) IsBugReady() bool { + bugReady := true + for _, bug := range glsa.Bugs { + bugReady = bugReady && bug.IsReady() + } + return bugReady +} + +func (glsa *Glsa) ComputeStatus(user *users.User) { + status := Status{ + BugReady: glsa.IsBugReady(), + Approval: "none", + WorkflowStatus: "todo", + Permission: glsa.Permission, + } + + if glsa.DeclinedBy != nil && len(glsa.DeclinedBy) > 0 { + status.Approval = "declined" + } else if glsa.ApprovedBy != nil && len(glsa.ApprovedBy) > 0 { + status.Approval = "approved" + } else if glsa.Comments != nil && len(glsa.Comments) > 0 { + status.Approval = "comments" + } + + if glsa.CreatorId == user.Id { + status.WorkflowStatus = "own" + } else if contains(glsa.ApprovedBy, user.Id) { + status.WorkflowStatus = "approved" + } else { + for _, comment := range glsa.Comments { + if comment.User == user.Id { + status.WorkflowStatus = "commented" + break + } + } + } + + glsa.Status = status +} + +func (glsa *Glsa) ComputeCommentBadges() { + for _, comment := range glsa.Comments { + user := new(users.User) + connection.DB.Model(user).Where("id = ?", comment.User).Select() + + comment.UserBadge = user.Badge + } +} + +func contains(arr []int64, element int64) bool { + for _, a := range arr { + if a == element { + return true + } + } + return false +} diff --git a/pkg/models/gpackage/package.go b/pkg/models/gpackage/package.go new file mode 100644 index 0000000..76166b7 --- /dev/null +++ b/pkg/models/gpackage/package.go @@ -0,0 +1,11 @@ +package gpackage + +type Package struct { + Affected bool + Atom string + Identifier string + Version string + Slot string + Arch string + Auto bool +} diff --git a/pkg/models/session.go b/pkg/models/session.go new file mode 100644 index 0000000..b83da06 --- /dev/null +++ b/pkg/models/session.go @@ -0,0 +1,15 @@ +package models + +import ( + "glsamaker/pkg/models/users" + "time" +) + +type Session struct { + Id string `pg:",pk"` + UserId int64 + User *users.User + SecondFactorMissing bool + IP string + Expires time.Time +} diff --git a/pkg/models/users/user.go b/pkg/models/users/user.go new file mode 100644 index 0000000..b8a60d6 --- /dev/null +++ b/pkg/models/users/user.go @@ -0,0 +1,214 @@ +// Contains the model of the application data + +package users + +import ( + "crypto/rand" + "errors" + "github.com/duo-labs/webauthn/protocol" + "github.com/duo-labs/webauthn/webauthn" + "github.com/go-pg/pg/v9/orm" + "golang.org/x/crypto/argon2" + "strconv" + "strings" +) + +type User struct { + Id int64 `pg:",pk,unique"` + + Email string `pg:",unique"` + Nick string + Name string + Password Argon2Parameters + ForcePasswordChange bool + Role string + TOTPSecret string + TOTPQRCode string + IsUsingTOTP bool + WebauthnCredentials []webauthn.Credential + WebauthnCredentialNames []*WebauthnCredentialName + IsUsingWebAuthn bool + Show2FANotice bool + + Permissions Permissions + + Badge Badge + + ForcePasswordRotation bool + Force2FA bool + + Disabled bool +} + +type Argon2Parameters struct { + Type string + Salt []byte + Time uint32 + Memory uint32 + Threads uint8 + KeyLen uint32 + Hash []byte +} + +func (a *Argon2Parameters) GenerateSalt(n uint32) error { + b := make([]byte, n) + _, err := rand.Read(b) + if err != nil { + return err + } + a.Salt = b + + return nil +} + +func (a *Argon2Parameters) GeneratePassword(password string) error { + if a.Salt == nil || a.Time == 0 || a.Memory == 0 || a.Threads == 0 || a.KeyLen == 0 { + return errors.New("Invalid parameters") + } + a.Hash = argon2.IDKey([]byte(password), a.Salt, a.Time, a.Memory, a.Threads, a.KeyLen) + return nil +} + +func (u *User) UpdatePassword(password string) error { + err := u.Password.GeneratePassword(password) + if err != nil { + return err + } + return nil +} + +func (u *User) CheckPassword(password string) bool { + return string(u.Password.Hash) == string(argon2.IDKey( + []byte(password), + u.Password.Salt, + u.Password.Time, + u.Password.Memory, + u.Password.Threads, + u.Password.KeyLen)) +} + +type Permissions struct { + Glsa GlsaPermissions + CVETool CVEToolPermissions + Admin AdminPermissions +} + +type GlsaPermissions struct { + View bool + UpdateBugs bool + Comment bool + Create bool + Edit bool + Approve bool + ApproveOwnGlsa bool + Decline bool + Delete bool + Release bool + Confidential bool +} + +type CVEToolPermissions struct { + View bool + UpdateCVEs bool + Comment bool + AddPackage bool + ChangeState bool + AssignBug bool + CreateBug bool +} + +type AdminPermissions struct { + View bool + CreateTemplates bool + ManageUsers bool + GlobalSettings bool +} + +type WebauthnCredentialName struct { + Id []byte + Name string +} + +type Badge struct { + Name string `pg:",pk"` + Description string + Color string +} + +func (u User) IsUsing2FA() bool { + return u.IsUsingTOTP || u.IsUsingWebAuthn +} + +// WebAuthnID returns the user's ID +func (u User) WebAuthnID() []byte { + return []byte(strconv.FormatInt(u.Id, 10)) +} + +// WebAuthnName returns the user's username +func (u User) WebAuthnName() string { + return strings.TrimRight(u.Nick, "@") +} + +// WebAuthnDisplayName returns the user's display name +func (u User) WebAuthnDisplayName() string { + return strings.TrimRight(u.Nick, "@") +} + +// WebAuthnIcon is not (yet) implemented +func (u User) WebAuthnIcon() string { + return "" +} + +// WebAuthnCredentials returns credentials owned by the user +func (u User) WebAuthnCredentials() []webauthn.Credential { + return u.WebauthnCredentials +} + +// CredentialExcludeList returns a CredentialDescriptor array filled +// with all the user's credentials +func (u User) CredentialExcludeList() []protocol.CredentialDescriptor { + + credentialExcludeList := []protocol.CredentialDescriptor{} + for _, cred := range u.WebauthnCredentials { + descriptor := protocol.CredentialDescriptor{ + Type: protocol.PublicKeyCredentialType, + CredentialID: cred.ID, + } + credentialExcludeList = append(credentialExcludeList, descriptor) + } + + return credentialExcludeList +} + +// AddCredential associates the credential to the user +func (u *User) AddCredential(cred webauthn.Credential, credentialName string) { + u.WebauthnCredentials = append(u.WebauthnCredentials, cred) + + webauthnCredentialName := &WebauthnCredentialName{ + Id: cred.ID, + Name: credentialName, + } + + u.WebauthnCredentialNames = append(u.WebauthnCredentialNames, webauthnCredentialName) + +} + +func (u *User) CanEditCVEs() bool { + return u.Role == "admin" || u.Role == "editor" +} + +func (u *User) Confidential() string { + confidential := "public" + if u.Permissions.Glsa.Confidential { + confidential = "confidential" + } + return confidential +} + +func (u *User) CanAccess(query *orm.Query) *orm.Query { + return query.WhereGroup(func(q *orm.Query) (*orm.Query, error) { + q = q.WhereOr("permission = ?", "public"). + WhereOr("permission = ?", u.Confidential()) + return q, nil + }) +} diff --git a/public/404.html b/public/404.html deleted file mode 100644 index 7f701e2..0000000 --- a/public/404.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - The page you were looking for doesn't exist (404) - - - - - -
      -

      Good Sir, the page thou were looking for indeed doeseth not exist.

      -

      You may have mistyped the address or the page may have moved.

      -

      (Or you just had too much wine.)

      -
      - - diff --git a/public/422.html b/public/422.html deleted file mode 100644 index 83660ab..0000000 --- a/public/422.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - The change you wanted was rejected (422) - - - - - -
      -

      The change you wanted was rejected.

      -

      Maybe you tried to change something you didn't have access to.

      -
      - - diff --git a/public/500.html b/public/500.html deleted file mode 100644 index 4ba71a9..0000000 --- a/public/500.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - We're sorry, but something went wrong (500) - - - - - -
      -

      We're sorry, but something went wrong.

      -

      We've been notified about this issue and we'll take a look at it shortly.

      -

      (umad?)

      -
      - - diff --git a/public/error-404.png b/public/error-404.png deleted file mode 100644 index 0676c0a..0000000 Binary files a/public/error-404.png and /dev/null differ diff --git a/public/error-500.png b/public/error-500.png deleted file mode 100644 index 1027855..0000000 Binary files a/public/error-500.png and /dev/null differ diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index e69de29..0000000 diff --git a/public/robots.txt b/public/robots.txt deleted file mode 100644 index 085187f..0000000 --- a/public/robots.txt +++ /dev/null @@ -1,5 +0,0 @@ -# See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file -# -# To ban all spiders from the entire site uncomment the next two lines: -# User-Agent: * -# Disallow: / diff --git a/public/xsl/ads.xsl b/public/xsl/ads.xsl deleted file mode 100644 index bf5e446..0000000 --- a/public/xsl/ads.xsl +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - Support OSL - - - - - - - - - - Gentoo Centric Hosting: vr.org - - - - - - - - - - Tek Alchemy - - - - - - - - - - SevenL.net - - - - - - - - - - Global Netoptex Inc. - - - - - - - - - - Euro-Web/SD-France - - - - - - - - - - Bytemark - - - - - - - - - - Edurium - - - - - - - diff --git a/public/xsl/content.xsl b/public/xsl/content.xsl deleted file mode 100644 index 303da59..0000000 --- a/public/xsl/content.xsl +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/xsl/devmap.xsl b/public/xsl/devmap.xsl deleted file mode 100644 index 8ba7615..0000000 --- a/public/xsl/devmap.xsl +++ /dev/null @@ -1,86 +0,0 @@ - - - - -" - + "" - + "" - + "" - + "" - + doc.developers[x].nick + "
      " - + "" + doc.developers[x].name + "
      " - + "" + doc.developers[x].roles + ""; - marker.name = doc.developers[x].nick; - markers.push(marker); - map.addOverlay(marker); - } - - var t = document.getElementById("devlinks"); - var selectDev = -1; - var nCol = 8; - var nLines = parseInt(markers.length / nCol); - if (markers.length / nCol) - ++nLines; - for (var r = 0; r < nLines; ++r) { - var tr = document.createElement("tr"); - for (var c = 0; c < nCol; ++c) { - var td = document.createElement("td"); - var i = c * nLines + r; - if (i < markers.length) { - var a = document.createElement("a"); - if (markers[i].name == "X-PLACEHOLDER") - selectDev = i; - a.setAttribute("href", "javascript:markers["+i+"].openInfoWindowHtml(markers["+i+"].text)"); - a.textContent = markers[i].name; - td.appendChild(a); - } - tr.appendChild(td); - } - t.appendChild(tr); - } - if (selectDev >= 0) - markers[selectDev].openInfoWindowHtml(markers[selectDev].text); - } -} -]]> -
      -
      diff --git a/public/xsl/doc-struct.xsl b/public/xsl/doc-struct.xsl deleted file mode 100644 index 6c5846c..0000000 --- a/public/xsl/doc-struct.xsl +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - - - - -
      -
      - -
      - - - - -
      -
      -
      -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      diff --git a/public/xsl/glsa.xsl b/public/xsl/glsa.xsl deleted file mode 100644 index 139e384..0000000 --- a/public/xsl/glsa.xsl +++ /dev/null @@ -1,412 +0,0 @@ - - - - - - - - - -<xsl:value-of select="title"/> - - Security Team - - -This is a Gentoo Linux Security Advisory - - - - - - - - - - -Gentoo Linux Security Advisory -
      -Version Information - - - - - - GLSA / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Advisory Reference
      Release Date
      Latest Revision
      Impact
      Exploitable
      - - - - - -

      -Related bugreports: - - - - - # - , - - - - No related gentoo bugreports - - - -

      - - -
      -
      -Synopsis - - -

      - - -
      -
      - -Impact Information - -
      -Background - - - - - -
      -
      -
      -Description - - - - - -
      -
      -Impact - - - - - -
      -
      - -Resolution Information -
      -Workaround - - - - - -
      -
      -Resolution - - - - - -
      -
      - - -References -
      - - -
        - -
      • -
        -
      - - -
      -
      -
      -
      -
      - - - - - - - - - - - - - - - - - - - - <= - - - < - - - = - - - > - - - >= - - - revision < - - - revision <= - - - revision > - - - revision >= - - - - , - - - - - - - <= - - - < - - - = - - - > - - - >= - - - revision < - - - revision <= - - - revision > - - - revision >= - - - - - - - - , - - * - - - - - All supported architectures - - - Intel compatible - - - PowerPC - - - Sparc - - - HP-PA - - - Alpha - - - AMD64 - - - ARM - - - ia64 - - - mips - - - - - - - - -
      PackageVulnerable versionsUnaffected versionsArchitecture(s)
      - - - - *: Needs to be manually updated - - - -
      - - - - - - - - - - - (fixed) - - - -
      Affected ServiceAffected Server
      -
      - - - -
      -
      - - -

      -
      - - -
      -
      - 
      -
      -
      -
      - - - - - - - - - - - - - - - - - - -
        - -
      • -
        -
      -
      - - -
        - -
      1. -
        -
      -
      - - - - - - - - - - -
      -
      - - - - - - - - - - - - - - - - - - - - - - - -
      diff --git a/public/xsl/guide.xsl b/public/xsl/guide.xsl deleted file mode 100644 index 3264274..0000000 --- a/public/xsl/guide.xsl +++ /dev/null @@ -1,2015 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - -0 -9 - - -0 - - - - - -ads2 - - -www - - - - - - - - - - 1 - - - - - - - - - - - - - margin-top:40px;margin-bottom:30px - - - - -
      -

      - - - font-size:1.3em - - : - - - - - - - -

      -
      -
      -
      - - - - - -
      -
      - -

      - - : - - -

      - - - - -
      - - - - - -
      -
      -
      - - -
      - : - -
      -
      -
      -
      - - - - - - - - - -
      - - - -
      -
      - - - - - - - - - - - - - - - - - - - - - - - - - /rdf/en/glsa-index.rdf - - ?num=9 - - - - - - - - - - - - - - - - - - <xsl:choose> - <xsl:when test="/guide/@type='project'">Gentoo Linux Projects</xsl:when> - <xsl:when test="/guide/@type='newsletter'">Gentoo Linux Newsletter</xsl:when> - <xsl:when test="/sections">Gentoo Linux Handbook Page</xsl:when> - <xsl:otherwise><xsl:value-of select="func:gettext('GLinuxDoc')"/></xsl:otherwise> - </xsl:choose> --- - <xsl:choose> - <xsl:when test="subtitle"><xsl:if test="/guide/@type!='newsletter'"><xsl:value-of select="title"/>:</xsl:if> <xsl:value-of select="subtitle"/></xsl:when> - <xsl:otherwise><xsl:value-of select="title"/></xsl:otherwise> - </xsl:choose> - - - - - - - - - - RTL - - - - - - - - - - - - - - - - - - - - - -
      - Gentoo Logo -
      - - - - - -
      - - - - RTL - - - left - - - - - - - - - - -
      -
      - -
      - - -
      -
      - -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gentoo Linux -- <xsl:value-of select="title"/> - - - - - - - - - - - - - - NotADev - - - - - - - - - - - - load() - GUnload() - - - - https://www.gentoo.org - - - - - - - - - - - - - - -
      - Gentoo Logo - - -
      - - - - - - - -
      - Gentoo Spaceship -
      - - - - - -
      -

      - -

      -

      -
      -
      -
      - - - RTL - - - -

      - Gentoo logo - We produce Gentoo Linux, a special flavor of Linux that - can be automatically optimized and customized for just - about any application or need. Extreme performance, - configurability and a top-notch user and developer - community are all hallmarks of the Gentoo experience. - To learn more, read our about - page. -

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 01 - 02 - 03 - 04 - 05 - 06 - 07 - 08 - 09 - 10 - 11 - 12 - 00 - - - - - - - - - - - - - - - - - - - - - - - - - - -01- - -02- - -03- - -04- - -05- - -06- - -07- - -08- - -09- - -10- - -11- - -12- - -00- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <xsl:copy-of select="$newsitem/title"/> - - - - - - - - - - - planet - Blog posts - - - - - planet.gentoo.org - - - - - - - - - - - - - - . . . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      -
      - - - plans - - GLSA <xsl:value-of select="$glsaid"/>: <xsl:value-of select="$GLSAs//glsa[@id=$glsaid]/package[1]"/><xsl:if test="count($GLSAs//glsa[@id=$glsaid]/package)>1"> (and <xsl:value-of select="count($GLSAs//glsa[@id=$glsaid]/package)-1"/> more package<xsl:if test="count($GLSAs//glsa[@id=$glsaid]/package)>2">s</xsl:if>)</xsl:if> - - Gentoo Security Team -



      See GLSA for more information.

      -
      - - - moo - - New Packages - - packages.gentoo.org - - - - - - - -
      -
      -
      -
      -
      - - - - - - -
      - - - - - -
      -

      - Older News -

      -
        - - -
      • -
        -
      -
      -
      - - - - - - - -
      -
      - - - - -
      - -
      -
      - - - -
      - -
      - -
      - -
      - - - -
      - - - - - - - - - - - Y - - - https://www.gentoo.org - - - - - - - /main/en/contact.xml - - -Copyright 2001- Gentoo Foundation, Inc. Questions, Comments? Contact us. - - - - - - - - - - - - - - - - altlink - - - - - - - - - - - - - - - - -
      -   - -
      -
      -
      -
      - - - - - - - - - - - - - - - - - - - - -
      -
      - -
      -
      - - - -
      -
      - - -

      - - - - - - - - - - - - - - - - - . - - - .  - - - - -

      -
      - - -

      - - . - -

      -
      - - - - - - - - - - -

      - -

      - - -
      -
      -
      - -
      - - - - - - - - - - - - - - - - - - - - - - - - - -
      -
      - -
      -
      - - - -
      -
      - - - - - - - - - - - - - -

      - - - -

      -
      -
      - - -
      -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - - - - - - -
      -

      - - -  .: - - -  . - - -

      -
      - - - Fig. {$fignum}: {@short} - - - Fig. {$fignum} - - -
      -
      -
      - - - - - - - - - - - - - - - - -
      - - - {@short} - - - {@short} - - -
      - - - -

      Gentoo Developers Map

      -

      -
      - - - - - -
      -
      - - - - - - - - -
      -

      - : - -

      -
      - - - - - - - - - - -
      -

      - : - -

      -
      -
      -
      - - - - - - - - -
      -

      - : - -

      -
      -
      -
      - - - - - ( - - ) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

      -
      - -
      - - - - - - - - - - - -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      -

      -  . - - : - -

      -
      -
      -            
      -          
      -
      -
      -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - () - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - &style=printable - &full=1 - &part= - &chap= - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

      - - - - - - - epigraph - - - - - - - -



      -
      -

      -
      -
      - - - - - - - - - - - -
      -
      -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text-align:center - - - - - - - - - - - - - -
        - -
      -
      -
      - - - - -
        - -
      -
      -
      - - - - -
    4. - -
    5. - - - - - -
      -
      - - -
      -
      - - -
      -
      - - - - - - - - - - - - - - - <rdf:RDF xmlns="http://web.resource.org/cc/" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> - <License rdf:about="http://creativecommons.org/licenses/by-sa/2.5/"> - <permits rdf:resource="http://web.resource.org/cc/Reproduction" /> - <permits rdf:resource="http://web.resource.org/cc/Distribution" /> - <requires rdf:resource="http://web.resource.org/cc/Notice" /> - <requires rdf:resource="http://web.resource.org/cc/Attribution" /> - <permits rdf:resource="http://web.resource.org/cc/DerivativeWorks" /> - <requires rdf:resource="http://web.resource.org/cc/ShareAlike" /> - </License> - </rdf:RDF> - - - - - - - - - - - - -
      NumberTypeStatusTitle
      -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      -
      - - - - - - - - - - NoOriginal - - - - NoOriginal - - - - - - - - - - - - - - - - Different - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - https://www.gentoo.org/ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      -

      - - - - - - - - - &part= - &chap= - - - - - - - -

      -
      -

      - - - - - - - - - - - - -

      -
      - - - - RTL - - - center - - - -

      - -

      -
      - - - - RTL - - - left - - - -

      - -

      -
      - - - - RTL - - - left - - - -

      - - : - - - - - - - - -

      -
      -

      - - -

      -
      -

      - Donate to support our development efforts. -

      - -
      - - - - - - - - - - -
      -
      -
      -
      - - - - - - -
      -

      - -
      - - - - Posted between and - - - Posted on - - - - - - - - by - -

      - - - - Happy Birthday - - - gentoo - - - stick man - - - tux - - - Larry the Cow - - - Clock - - - Planet Earth - - - - AlphaServer GS160 - - - KDE - - - ibm - - - Nvidia - - - Freescale Semiconductor - - - -
      - - - -
      - (full story) -
      - - - -
      -
      -
      -
      - - diff --git a/public/xsl/handbook.xsl b/public/xsl/handbook.xsl deleted file mode 100644 index 491070b..0000000 --- a/public/xsl/handbook.xsl +++ /dev/null @@ -1,323 +0,0 @@ - - - - -0 -0 -0 - - - - - - - - - - - - - - - - - - - - - - -

      - - -
      - - - - - -
      -
      -
      -

      :

      -
        - - -
      • - - - - - - - - - - - - - - - - -
        - -
        -
          - - -
        1. - - - - - - - - - - - - - - - - - -
          - -
          - -
          - -
          -
          -
        2. -
          -
        -
      • -
        -
      - - - - - - - -
      - - - - - - - -

      -
      - - - -
      - - - -
      - - - - - - - -

      - -

      -
      -

      :

      -
        - - - -
      1. - - - -
        - -
        - -
        - -
        -
        -
      2. - - -
      - - - - - - - - - - - - -
      -

      - - - - [ << ] - - - [ << ] - - - - - - [ < ] - - - [ < ] - - - - [ ] - - - [ > ] - - - [ > ] - - - - - [ > ] - - - [ > ] - - - - - - [ >> ] - - - - - [ >> ] - - - [ >> ] - - - - - - - [ >> ] - - - [ >> ] - - - -

      -
      -
      -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <div style="border-left:4px solid #AAA; margin-top:4px; padding-left:4px;"> -
      -
      - - -
      -

      - - -

      -
      - - - - - - : -
      - - - - - - - - - - - - - - - - - - - - </div> - - - - - - - -
      - -
      diff --git a/public/xsl/inserts.xsl b/public/xsl/inserts.xsl deleted file mode 100644 index 6fe8fbd..0000000 --- a/public/xsl/inserts.xsl +++ /dev/null @@ -1,401 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - YES - - - YES - - - YES - - YES - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - - - - - - - -1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - er - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ${} - - - - - - - - - - - - - / - - - ../ - - - - - - - - - - - - - - - - - - - - - - - - - en - - - -Y - - - - - - - - - - / - - - - - - - - - diff --git a/public/xsl/mail.xsl b/public/xsl/mail.xsl deleted file mode 100644 index a094105..0000000 --- a/public/xsl/mail.xsl +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/xsl/menu.xsl b/public/xsl/menu.xsl deleted file mode 100644 index 01ce2c7..0000000 --- a/public/xsl/menu.xsl +++ /dev/null @@ -1,57 +0,0 @@ - - - - - -
      -
      - -
      - - - http://www.gentoo.org - - - - - - - - - - - - - - - - - - - - - - - - -

      -
      - - - - highlight - - - - | - -
      -
      - -
      diff --git a/public/xsl/util.xsl b/public/xsl/util.xsl deleted file mode 100644 index 3e5a5b3..0000000 --- a/public/xsl/util.xsl +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - ( - - - - - - - - - - - ) - - - - - ( - - ) - - - - - - - - - - - - - - index.xml - - - - - - - - - - - - - diff --git a/script/config_init b/script/config_init deleted file mode 100755 index c4d81e2..0000000 --- a/script/config_init +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env ruby -PWD = File.dirname(__FILE__) - -begin - require 'yaml' - - puts "Initializing GLSAMaker 2 configuration in '#{File.expand_path(PWD + '/../')}'..." - - File.umask 0077 - - puts "Reading configuration..." - require PWD + '/../tmp/deploy.private.rb' - - Dir.chdir(File.join(PWD, '../config')) do - puts "Setting database.yml..." - y = YAML.load(open('database.yml.mysql')) - - if DB_CONN == :tcp - y['production']['host'] = DB_HOST - y['production']['port'] = DB_PORT - elsif DB_CONN == :sock - y['production']['socket'] = DB_SOCK - end - - y['production']['username'] = DB_USER - y['production']['password'] = DB_PASS - y['production']['database'] = DB_DB - - File.open('database.yml', 'w') {|f| YAML.dump(y, f) } - - puts "Creating initializers/glsamaker.rb..." - File.open('initializers/glsamaker.rb', 'w') do |f| - f.write INITIALIZER - end - end - - puts "Removing deploy configuration" - File.unlink(PWD + '/../tmp/deploy.private.rb') - - puts 'all done!' -rescue Exception => e - $stderr.puts "!! Failed: #{e.message}" - exit 1 -end diff --git a/script/db-backup b/script/db-backup deleted file mode 100755 index e89cd38..0000000 --- a/script/db-backup +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env ruby - -# Log to STDOUT if in Rails -if ENV.include?('RAILS_ENV') && !Object.const_defined?('RAILS_DEFAULT_LOGGER') && ENV.include?('RAILS_LOG_SQL') - require 'logger' - RAILS_DEFAULT_LOGGER = Logger.new(STDOUT) -end - -DUMP_CMD = '/usr/bin/mk-parallel-dump' - -require(File.join(File.dirname(__FILE__), '..', 'config', 'environment')) - -dbc = Cve.configurations[RAILS_ENV] -opts = [] -opts << '-u' << dbc['username'] -opts << '-p' << dbc['password'] -if dbc.include?('socket') then - opts << '-S' << dbc['socket'] -else - opts << '-h' << dbc['host'] - opts << '--port' << dbc['port'] if dbc.include?('port') -end -opts << '--databases' << dbc['database'] - -cmd = ([DUMP_CMD]+opts+ARGV).join(' ') -#print "#{cmd}\n" -exec cmd - -# vim: ts=2 sw=2 et ft=ruby sts=2 tw=72 nospell: diff --git a/script/rails b/script/rails deleted file mode 100755 index f8da2cf..0000000 --- a/script/rails +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env ruby -# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application. - -APP_PATH = File.expand_path('../../config/application', __FILE__) -require File.expand_path('../../config/boot', __FILE__) -require 'rails/commands' diff --git a/script/update-portage-cache b/script/update-portage-cache deleted file mode 100755 index 451a7ba..0000000 --- a/script/update-portage-cache +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -# This populates the cache for GLSAMaker to fetch data about packages, and is only meant for running on production. -DESTDIR=/var/cache/glsamaker-portage/ -SYNC='rsync://rsync.gentoo.org/gentoo-portage' -RSYNC='/usr/bin/rsync' -OPTIONS="-aq --delete-after" -OPTIONS+=" --include=*/*/metadata.xml" -OPTIONS+=" --include=metadata/*/* --include=metadata/*/*/*" -OPTIONS+=" --exclude=licenses/ --exclude=eclass/ --exclude=packages/" -OPTIONS+=" --exclude=skel.* --exclude=distfiles/ --exclude=profiles/" -OPTIONS+=" --exclude=header.txt" -OPTIONS+=" --exclude=*/*/*" - -"${RSYNC}" ${OPTIONS} "${SYNC}" "${DESTDIR}" diff --git a/test/fixtures/.gitkeep b/test/fixtures/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/test/fixtures/bugs.yml b/test/fixtures/bugs.yml deleted file mode 100644 index f275338..0000000 --- a/test/fixtures/bugs.yml +++ /dev/null @@ -1,11 +0,0 @@ -bug_one: - bug_id: 236060 - title: dev-lang/ruby <1.8.6_p287-r1 REXML DoS Vulnerability (CVE-2008-3790) - whiteboard: "B3? [glsa]" - revision_id: 1 - -bug_two: - bug_id: 260006 - title: "=' - arch: '*' - slot: '1.8' - automatic: 1 - revision_id: 1 diff --git a/test/fixtures/references.yml b/test/fixtures/references.yml deleted file mode 100644 index 50867bd..0000000 --- a/test/fixtures/references.yml +++ /dev/null @@ -1,11 +0,0 @@ -reference_one: - id: 1 - revision_id: 2 - title: Reference 1 Title - url: http://reference-1-title.com/ref.html - -reference_two: - id: 2 - revision_id: 1 - title: Reference 2 Title - url: http://reference-2-title.com/ref.html \ No newline at end of file diff --git a/test/fixtures/revisions.yml b/test/fixtures/revisions.yml deleted file mode 100644 index 1edba9e..0000000 --- a/test/fixtures/revisions.yml +++ /dev/null @@ -1,58 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html - -revision_one: - id: 1 - glsa_id: 1 - revid: 0 - user_id: 1 - title: GLSA 1 - access: remote - severity: normal - description: lol hi - product: product - category: category - synopsis: synopsis - background: background - impact: impact - workaround: workaround - resolution: resolution - -revision_two: - id: 2 - glsa_id: 1 - revid: 0 - user_id: 1 - title: GLSA 1 - access: local - severity: low - description: test blah - -revision_three: - id: 3 - glsa_id: 2 - revid: 0 - user_id: 1 - title: GLSA 2 - access: remote - severity: high - description: blah - -revision_four: - id: 4 - glsa_id: 3 - revid: 0 - user_id: 1 - title: GLSA 3 (restricted) - access: remote - severity: high - description: blah - -revision_five: - id: 5 - glsa_id: 4 - revid: 0 - user_id: 1 - title: GLSA 4 (contributor draft) - access: remote - severity: high - description: blah diff --git a/test/fixtures/templates.yml b/test/fixtures/templates.yml deleted file mode 100644 index 744e493..0000000 --- a/test/fixtures/templates.yml +++ /dev/null @@ -1,13 +0,0 @@ -# Read about fixtures at http://api.rubyonrails.org/classes/Fixtures.html - -one: - name: DoS - text: A remote attacker could exploit these vulnerabilities to cause a Denial of Service condition. - target: impact - enabled: false - -two: - name: DoS - text: Muiltiple vulnerabilities in [Product] allow remote attackers to cause Denial of Service conditions. - target: synopsis - enabled: true diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml deleted file mode 100644 index fb9a792..0000000 --- a/test/fixtures/users.yml +++ /dev/null @@ -1,49 +0,0 @@ -test_user: - id: 1 - login: test - name: Tim Est - email: user@localhost.invalid - access: 3 - -test_admin: - id: 2 - login: admin - name: Alex Dmin - email: admin@localhost.invalid - jefe: true - access: 3 - -test_locked: - id: 3 - login: locked - name: Leroy Ocked - email: locked@localhost.invalid - disabled: true - -test_contributor: - id: 4 - login: contributor - name: Carl Ontributor - email: contributor@localhost.invalid - access: 0 - -test_padawan: - id: 5 - login: padawan - name: Peter Adawan - email: padawan@localhost.invalid - access: 1 - -test_member: - id: 6 - login: member - name: Mike Ember - email: member@localhost.invalid - access: 2 - -test_confidential_member: - id: 7 - login: confidential_member - name: James Bond - email: confidential_member@localhost.invalid - access: 3 \ No newline at end of file diff --git a/test/functional/.gitkeep b/test/functional/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/test/functional/admin/index_controller_test.rb b/test/functional/admin/index_controller_test.rb deleted file mode 100644 index 443aec6..0000000 --- a/test/functional/admin/index_controller_test.rb +++ /dev/null @@ -1,15 +0,0 @@ -require 'test_helper' - -class Admin::IndexControllerTest < ActionController::TestCase - test "should work for admins" do - log_in_as :admin - get :index - assert_response :success - end - - test "should not grant access to regular users" do - log_in_as :user - get :index - assert_redirected_to :controller => '/index', :action => 'error', :type => 'access' - end -end diff --git a/test/functional/admin/templates_controller_test.rb b/test/functional/admin/templates_controller_test.rb deleted file mode 100644 index 8a0459e..0000000 --- a/test/functional/admin/templates_controller_test.rb +++ /dev/null @@ -1,56 +0,0 @@ -require 'test_helper' - -class Admin::TemplatesControllerTest < ActionController::TestCase - setup do - @template = templates(:one) - log_in_as :admin - end - - test "should not grant access to regular users" do - log_in_as :user - get :index - assert_redirected_to :controller => '/index', :action => 'error', :type => 'access' - end - - test "should get index" do - get :index - assert_response :success - assert_not_nil assigns(:templates) - end - - test "should get new" do - get :new - assert_response :success - end - - test "should create admin_template" do - assert_difference('Template.count') do - post :create, template: @template.attributes - end - - assert_redirected_to admin_template_path(assigns(:template)) - end - - test "should show admin_template" do - get :show, :id => @template.to_param - assert_response :success - end - - test "should get edit" do - get :edit, :id => @template.to_param - assert_response :success - end - - test "should update admin_template" do - put :update, :id => @template.to_param, :template => @template.attributes - assert_redirected_to admin_template_path(assigns(:template)) - end - - test "should destroy admin_template" do - assert_difference('Template.count', -1) do - delete :destroy, :id => @template.to_param - end - - assert_redirected_to admin_templates_path - end -end diff --git a/test/functional/admin/users_controller_test.rb b/test/functional/admin/users_controller_test.rb deleted file mode 100644 index 03976e7..0000000 --- a/test/functional/admin/users_controller_test.rb +++ /dev/null @@ -1,15 +0,0 @@ -require 'test_helper' - -class Admin::UsersControllerTest < ActionController::TestCase - test "should work for admins" do - log_in_as :admin - get :index - assert_response :success - end - - test "should not grant access to regular users" do - log_in_as :user - get :index - assert_redirected_to :controller => '/index', :action => 'error', :type => 'access' - end -end diff --git a/test/functional/bug_controller_test.rb b/test/functional/bug_controller_test.rb deleted file mode 100644 index 25d2c5d..0000000 --- a/test/functional/bug_controller_test.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'test_helper' - -class BugControllerTest < ActionController::TestCase - # Replace this with your real tests. - test "the truth" do - assert true - end -end diff --git a/test/functional/bugs_controller_test.rb b/test/functional/bugs_controller_test.rb deleted file mode 100644 index 428da4c..0000000 --- a/test/functional/bugs_controller_test.rb +++ /dev/null @@ -1,4 +0,0 @@ -require 'test_helper' - -class BugsControllerTest < ActionController::TestCase -end diff --git a/test/functional/comments_controller_test.rb b/test/functional/comments_controller_test.rb deleted file mode 100644 index b4c996b..0000000 --- a/test/functional/comments_controller_test.rb +++ /dev/null @@ -1,4 +0,0 @@ -require 'test_helper' - -class CommentsControllerTest < ActionController::TestCase -end diff --git a/test/functional/cve_controller_test.rb b/test/functional/cve_controller_test.rb deleted file mode 100644 index 28b33b0..0000000 --- a/test/functional/cve_controller_test.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'test_helper' - -class CveControllerTest < ActionController::TestCase - # Replace this with your real tests. - test "the truth" do - assert true - end -end diff --git a/test/functional/glsa_controller_test.rb b/test/functional/glsa_controller_test.rb deleted file mode 100644 index e68c570..0000000 --- a/test/functional/glsa_controller_test.rb +++ /dev/null @@ -1,83 +0,0 @@ -require 'test_helper' - -class GlsaControllerTest < ActionController::TestCase - fixtures :glsas - - def setup - @actions = [:show, :edit, :update, :diff, :prepare_release, :release, :import_references] - end - - # Basic tests for the four permission groups - test "should apply contributor permissions for restricted advisories correctly" do - @actions.each do |action| - log_in_as :contributor - get action, :id => glsas(:restricted_glsa).id - assert_access_denied "Failed action: #{action.to_s}" - end - end - - test "should apply padawan permissions for restricted advisories correctly" do - @actions.each do |action| - log_in_as :padawan - get action, :id => glsas(:restricted_glsa).id - assert_access_denied "Failed action: #{action.to_s}" - end - end - - test "should apply regular member permissions for restricted advisories correctly" do - @actions.each do |action| - log_in_as :full_member - get action, :id => glsas(:restricted_glsa).id - assert_access_denied "Failed action: #{action.to_s}" - end - end - - test "should apply confidential member permissions for restricted advisories correctly" do - @actions.each do |action| - next if action == :update # TODO - next if action == :diff # TODO - - next if action == :prepare_release # Confidential drafts cannot be released - next if action == :release # ditto - - log_in_as :confidential_member - get action, :id => glsas(:restricted_glsa).id - assert_response :success, "Failed action: #{action.to_s}" - end - end - - # Specific tests for contributors - test "should apply contributor permissions for their own drafts correctly" do - @actions.each do |action| - next if action == :update # TODO - next if action == :diff # TODO - - next if action == :prepare_release # Off-limits for contributors - next if action == :release # ditto - - log_in_as :contributor - get action, :id => glsas(:contributor_draft).id - assert_response :success, "Failed action: #{action.to_s}" - end - end - - test "should apply contributor permissions for other drafts correctly" do - @actions.each do |action| - log_in_as :contributor - get action, :id => glsas(:glsa_one).id - assert_access_denied "Failed action #{action.to_s}" - end - end - - test "should not allow padawans to release advisories" do - log_in_as :padawan - get :prepare_release, :id => glsas(:glsa_one).id - assert_access_denied "Prepare release test failed" - - log_in_as :padawan - get :release, :id => glsas(:glsa_one).id - assert_access_denied "Release tes failed" - end - - # TODO: listing pages -end diff --git a/test/functional/glsa_mailer_test.rb b/test/functional/glsa_mailer_test.rb deleted file mode 100644 index 5963931..0000000 --- a/test/functional/glsa_mailer_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class GlsaMailerTest < ActionMailer::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/functional/index_controller_test.rb b/test/functional/index_controller_test.rb deleted file mode 100644 index 319e4a4..0000000 --- a/test/functional/index_controller_test.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'test_helper' - -class IndexControllerTest < ActionController::TestCase - # Replace this with your real tests. - test "the truth" do - assert true - end -end diff --git a/test/functional/search_controller_test.rb b/test/functional/search_controller_test.rb deleted file mode 100644 index bfbf22d..0000000 --- a/test/functional/search_controller_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class SearchControllerTest < ActionController::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/functional/tools_controller_test.rb b/test/functional/tools_controller_test.rb deleted file mode 100644 index e022569..0000000 --- a/test/functional/tools_controller_test.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'test_helper' - -class ToolsControllerTest < ActionController::TestCase - # Replace this with your real tests. - test "the truth" do - assert true - end -end diff --git a/test/integration/.gitkeep b/test/integration/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/test/integration/authentication_test.rb b/test/integration/authentication_test.rb deleted file mode 100644 index 9ace8f8..0000000 --- a/test/integration/authentication_test.rb +++ /dev/null @@ -1,20 +0,0 @@ -require 'test_helper' - -class AuthenticationTest < ActionDispatch::IntegrationTest - fixtures :all - - test "successful login" do - get '/', {}, { 'HTTP_AUTHORIZATION' => basic_auth_creds(users(:test_member).login, GLSAMAKER_DEVEL_PASSWORD) } - assert_response :success - end - - test "unknown user login" do - get '/', {}, { 'HTTP_AUTHORIZATION' => basic_auth_creds("doesnotexist", "invalidpassword") } - assert_response 401 - end - - test "locked user login" do - get '/', {}, { 'HTTP_AUTHORIZATION' => basic_auth_creds(users(:test_locked).login, GLSAMAKER_DEVEL_PASSWORD) } - assert_response 401 - end -end diff --git a/test/test_helper.rb b/test/test_helper.rb deleted file mode 100644 index 317d547..0000000 --- a/test/test_helper.rb +++ /dev/null @@ -1,48 +0,0 @@ -ENV["RAILS_ENV"] = "test" -require File.expand_path('../../config/environment', __FILE__) -require 'rails/test_help' - -class ActiveSupport::TestCase - # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order. - # - # Note: You'll currently still have to declare fixtures explicitly in integration tests - # -- they do not yet inherit this setting - set_fixture_class :cves => Cve - - fixtures :all - - # Add more helper methods to be used by all tests here... - - def basic_auth_creds(user, password) - ActionController::HttpAuthentication::Basic.encode_credentials(user, password) - end - - # Logs in as a user. Available users are - # :user, :admin, :contributor, :padawan, :full_member, :confidential_member, :locked_user - def log_in_as(who) - user = nil - case who - when :user - user = users(:test_user).login - when :locked_user - user = users(:test_locked).login - when :admin - user = users(:test_admin).login - when :contributor - user = users(:test_contributor).login - when :padawan - user = users(:test_padawan).login - when :full_member - user = users(:test_member).login - when :confidential_member - user = users(:test_confidential_member).login - end - - raise "Invalid user" if user.nil? - @request.env['HTTP_AUTHORIZATION'] = basic_auth_creds(user, GLSAMAKER_DEVEL_PASSWORD) - end - - def assert_access_denied(message = nil) - assert_redirected_to({:controller => '/index', :action => 'error', :type => 'access'}, message) - end -end diff --git a/test/unit/.gitkeep b/test/unit/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/test/unit/bug_test.rb b/test/unit/bug_test.rb deleted file mode 100644 index 14af505..0000000 --- a/test/unit/bug_test.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'test_helper' - -class BugTest < ActiveSupport::TestCase - # Replace this with your real tests. - test "the truth" do - assert true - end -end diff --git a/test/unit/comment_test.rb b/test/unit/comment_test.rb deleted file mode 100644 index 6e0de8b..0000000 --- a/test/unit/comment_test.rb +++ /dev/null @@ -1,54 +0,0 @@ -require 'test_helper' - -class CommentTest < ActiveSupport::TestCase - fixtures :all - - test "padawans should not be able to make approvals" do - c = Comment.new - c.glsa_id = 1 - c.user = users(:test_padawan) - c.text = "test" - c.rating = "approval" - c.save - - assert c.errors.any? - assert_includes c.errors[:rating], "You may not approve or reject drafts" - end - - test "padawans should not be able to make rejections" do - c = Comment.new - c.glsa_id = 1 - c.user = users(:test_padawan) - c.text = "test" - c.rating = "rejection" - c.save - - assert c.errors.any? - assert_includes c.errors[:rating], "You may not approve or reject drafts" - end - - test "advisory owners should not be able to approve their own drafts" do - c = Comment.new - c.user_id = 1 - c.text = "test" - c.rating = "approval" - c.glsa_id = 2 - c.save - - assert c.errors.any? - assert_equal ["The owner of a draft cannot make approvals or rejections"], c.errors[:rating] - end - - test "users should not be able to approve a draft twice" do - # second comment loaded from fixtures - c = Comment.new - c.user_id = 7 - c.text = "test" - c.rating = "approval" - c.glsa_id = 2 - c.save - - assert c.errors.any? - assert_equal ["You have already approved or rejected this draft"], c.errors[:rating] - end -end diff --git a/test/unit/cpe_test.rb b/test/unit/cpe_test.rb deleted file mode 100644 index e671d82..0000000 --- a/test/unit/cpe_test.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'test_helper' - -class CpeTest < ActiveSupport::TestCase - # Replace this with your real tests. - test "the truth" do - assert true - end -end diff --git a/test/unit/cve_assignment_test.rb b/test/unit/cve_assignment_test.rb deleted file mode 100644 index 9c132b2..0000000 --- a/test/unit/cve_assignment_test.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'test_helper' - -class CveAssignmentTest < ActiveSupport::TestCase - # Replace this with your real tests. - test "the truth" do - assert true - end -end diff --git a/test/unit/cve_change_test.rb b/test/unit/cve_change_test.rb deleted file mode 100644 index 6d34a62..0000000 --- a/test/unit/cve_change_test.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'test_helper' - -class CveChangeTest < ActiveSupport::TestCase - # Replace this with your real tests. - test "the truth" do - assert true - end -end diff --git a/test/unit/cve_comment_test.rb b/test/unit/cve_comment_test.rb deleted file mode 100644 index a6ee432..0000000 --- a/test/unit/cve_comment_test.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'test_helper' - -class CveCommentTest < ActiveSupport::TestCase - # Replace this with your real tests. - test "the truth" do - assert true - end -end diff --git a/test/unit/cve_reference_test.rb b/test/unit/cve_reference_test.rb deleted file mode 100644 index f2462ab..0000000 --- a/test/unit/cve_reference_test.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'test_helper' - -class CveReferenceTest < ActiveSupport::TestCase - # Replace this with your real tests. - test "the truth" do - assert true - end -end diff --git a/test/unit/cve_test.rb b/test/unit/cve_test.rb deleted file mode 100644 index c874e9b..0000000 --- a/test/unit/cve_test.rb +++ /dev/null @@ -1,92 +0,0 @@ -require 'test_helper' - -class CveTest < ActiveSupport::TestCase - test "URL generation" do - cve = cves(:cve_one) - - assert_equal('https://nvd.nist.gov/vuln/detail/CVE-2004-1776', cve.url) - assert_equal('https://nvd.nist.gov/vuln/detail/CVE-2004-1776', cve.url(:nvd)) - assert_equal('https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2004-1776', cve.url(:mitre)) - assert_raise(ArgumentError) { cve.url(:invalid_site) } - end - - test "to_s" do - assert_equal( - "CVE-2004-1776 (https://nvd.nist.gov/vuln/detail/CVE-2004-1776):\n Cisco IOS 12.1(3) and 12.1(3)T allows remote attackers to read and modify\n device configuration data via the cable-docsis read-write community string\n used by the Data Over Cable Service Interface Specification (DOCSIS)\n standard.", - cves(:cve_one).to_s - ) - end - - test "assigning" do - cve = cves(:cve_two) - user = users(:test_user) - - assert_nothing_raised(Exception) { - cve.assign(99999, user) - } - - assert_equal("ASSIGNED", cve.state) - assert_equal(user.id, cve.cve_changes.first.user_id) - assert_equal(99999, cve.assignments.first.bug) - end - - test "nfu" do - cve = cves(:cve_two) - user = users(:test_user) - - assert_nothing_raised(Exception) { - cve.nfu(user) - } - - assert_equal("NFU", cve.state) - assert_equal(user.id, cve.cve_changes.first.user_id) - end - - test "invalid" do - cve = cves(:cve_two) - user = users(:test_user) - - assert_nothing_raised(Exception) { - cve.invalidate(user) - } - - assert_equal("INVALID", cve.state) - assert_equal(user.id, cve.cve_changes.first.user_id) - end - - test "later" do - cve = cves(:cve_two) - user = users(:test_user) - - assert_nothing_raised(Exception) { - cve.later(user) - } - - assert_equal("LATER", cve.state) - assert_equal(user.id, cve.cve_changes.first.user_id) - end - - test "mark as new" do - cve = cves(:cve_two) - user = users(:test_user) - - assert_nothing_raised(Exception) { - cve.mark_new(user) - } - - assert_equal("NEW", cve.state) - assert_equal(user.id, cve.cve_changes.first.user_id) - end - - test "add comment" do - cve = cves(:cve_two) - user = users(:test_user) - - assert_nothing_raised(Exception) { - cve.add_comment(user, "Comment Text") - } - - assert_equal("Comment Text", cve.comments.first.comment) - assert_equal(user.id, cve.comments.first.user_id) - end -end diff --git a/test/unit/glsa_mailer_test.rb b/test/unit/glsa_mailer_test.rb deleted file mode 100644 index 2c554fc..0000000 --- a/test/unit/glsa_mailer_test.rb +++ /dev/null @@ -1,4 +0,0 @@ -require 'test_helper' - -class GlsaMailerTest < ActionMailer::TestCase -end diff --git a/test/unit/glsa_test.rb b/test/unit/glsa_test.rb deleted file mode 100644 index 15bd63d..0000000 --- a/test/unit/glsa_test.rb +++ /dev/null @@ -1,55 +0,0 @@ -require 'test_helper' - -class GlsaTest < ActiveSupport::TestCase - fixtures :glsas, :users - - test "uniqueness" do - glsa = Glsa.new(:glsa_id => glsas(:glsa_one).glsa_id) - - assert !glsa.save - assert glsa.invalid?(:glsa_id) - end - - test "successful creation" do - glsa = Glsa.new(:glsa_id => "GLSA-2004-99") - - glsa.submitter = users(:test_user) - glsa.requester = users(:test_user) - glsa.bugreadymaker = users(:test_user) - - assert glsa.save - end - - test "new request" do - glsa = Glsa.new_request( - "Some title", - "236060, 260006", - "some comment", - "public", - false, - users(:test_user) - ) - - assert_equal(glsa.last_revision.title, "Some title") - assert_equal(glsa.last_revision.bugs.map{|bug| bug.bug_id}.sort, [236060, 260006]) - assert !glsa.restricted - end - - test "adding bulk references" do - glsa = glsas(:glsa_two) - - glsa.add_references([ - {:title => "REF1", :url => "http://ref1/"}, - {:title => "REF2", :url => "http://ref2/"} - ]) - - assert glsa.valid? - - rev = glsa.last_revision - assert rev.valid? - assert_equal 'REF1', rev.references[0].title - assert_equal 'http://ref1/', rev.references[0].url - assert_equal 'REF2', rev.references[1].title - assert_equal 'http://ref2/', rev.references[1].url - end -end diff --git a/test/unit/helpers/bug_helper_test.rb b/test/unit/helpers/bug_helper_test.rb deleted file mode 100644 index 6074d6d..0000000 --- a/test/unit/helpers/bug_helper_test.rb +++ /dev/null @@ -1,4 +0,0 @@ -require 'test_helper' - -class BugHelperTest < ActionView::TestCase -end diff --git a/test/unit/helpers/bugs_helper_test.rb b/test/unit/helpers/bugs_helper_test.rb deleted file mode 100644 index 1f3a2a5..0000000 --- a/test/unit/helpers/bugs_helper_test.rb +++ /dev/null @@ -1,4 +0,0 @@ -require 'test_helper' - -class BugsHelperTest < ActionView::TestCase -end diff --git a/test/unit/helpers/comments_helper_test.rb b/test/unit/helpers/comments_helper_test.rb deleted file mode 100644 index 2518c16..0000000 --- a/test/unit/helpers/comments_helper_test.rb +++ /dev/null @@ -1,4 +0,0 @@ -require 'test_helper' - -class CommentsHelperTest < ActionView::TestCase -end diff --git a/test/unit/helpers/cve_helper_test.rb b/test/unit/helpers/cve_helper_test.rb deleted file mode 100644 index ea901ba..0000000 --- a/test/unit/helpers/cve_helper_test.rb +++ /dev/null @@ -1,4 +0,0 @@ -require 'test_helper' - -class CveHelperTest < ActionView::TestCase -end diff --git a/test/unit/helpers/glsa_helper_test.rb b/test/unit/helpers/glsa_helper_test.rb deleted file mode 100644 index de7b8ef..0000000 --- a/test/unit/helpers/glsa_helper_test.rb +++ /dev/null @@ -1,4 +0,0 @@ -require 'test_helper' - -class GlsaHelperTest < ActionView::TestCase -end diff --git a/test/unit/helpers/index_helper_test.rb b/test/unit/helpers/index_helper_test.rb deleted file mode 100644 index 104f529..0000000 --- a/test/unit/helpers/index_helper_test.rb +++ /dev/null @@ -1,4 +0,0 @@ -require 'test_helper' - -class IndexHelperTest < ActionView::TestCase -end diff --git a/test/unit/helpers/search_helper_test.rb b/test/unit/helpers/search_helper_test.rb deleted file mode 100644 index 3034163..0000000 --- a/test/unit/helpers/search_helper_test.rb +++ /dev/null @@ -1,4 +0,0 @@ -require 'test_helper' - -class SearchHelperTest < ActionView::TestCase -end diff --git a/test/unit/helpers/templates_helper_test.rb b/test/unit/helpers/templates_helper_test.rb deleted file mode 100644 index 6aa6ac7..0000000 --- a/test/unit/helpers/templates_helper_test.rb +++ /dev/null @@ -1,4 +0,0 @@ -require 'test_helper' - -class TemplatesHelperTest < ActionView::TestCase -end diff --git a/test/unit/helpers/tools_helper_test.rb b/test/unit/helpers/tools_helper_test.rb deleted file mode 100644 index 0677abe..0000000 --- a/test/unit/helpers/tools_helper_test.rb +++ /dev/null @@ -1,4 +0,0 @@ -require 'test_helper' - -class ToolsHelperTest < ActionView::TestCase -end diff --git a/test/unit/helpers/user_helper_test.rb b/test/unit/helpers/user_helper_test.rb deleted file mode 100644 index ad44a53..0000000 --- a/test/unit/helpers/user_helper_test.rb +++ /dev/null @@ -1,4 +0,0 @@ -require 'test_helper' - -class UserHelperTest < ActionView::TestCase -end diff --git a/test/unit/package_test.rb b/test/unit/package_test.rb deleted file mode 100644 index 7fb7c58..0000000 --- a/test/unit/package_test.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'test_helper' - -class PackageTest < ActiveSupport::TestCase - # Replace this with your real tests. - test "the truth" do - assert true - end -end diff --git a/test/unit/reference_test.rb b/test/unit/reference_test.rb deleted file mode 100644 index 77911d9..0000000 --- a/test/unit/reference_test.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'test_helper' - -class ReferenceTest < ActiveSupport::TestCase - # Replace this with your real tests. - test "the truth" do - assert true - end -end diff --git a/test/unit/revision_test.rb b/test/unit/revision_test.rb deleted file mode 100644 index 52016dd..0000000 --- a/test/unit/revision_test.rb +++ /dev/null @@ -1,47 +0,0 @@ -require 'test_helper' - -class RevisionTest < ActiveSupport::TestCase - test "deep copy" do - revision = revisions(:revision_one) - new_revision = revision.deep_copy - - assert_equal(revision.title, new_revision.title) - assert_equal(revision.glsa_id, new_revision.glsa_id) - assert_equal(revision.access, new_revision.access) - assert_equal(revision.product, new_revision.product) - assert_equal(revision.category, new_revision.category) - assert_equal(revision.severity, new_revision.severity) - assert_equal(revision.synopsis, new_revision.synopsis) - assert_equal(revision.background, new_revision.background) - assert_equal(revision.description, new_revision.description) - assert_equal(revision.impact, new_revision.impact) - assert_equal(revision.workaround, new_revision.workaround) - assert_equal(revision.resolution, new_revision.resolution) - - # Assuming that if the bug ID is copied, so is the rest - assert_equal(revision.bugs.map{|bug| bug.bug_id}.sort, new_revision.bugs.map{|bug| bug.bug_id}.sort) - - assert_equal(revision.references.map{|ref| ref.url}.sort, new_revision.references.map{|ref| ref.url}.sort) - assert_equal( - revision.packages.map{|pkg| "#{pkg.comp}#{pkg.atom}-#{pkg.version}"}.sort, - new_revision.packages.map{|pkg| "#{pkg.comp}#{pkg.atom}-#{pkg.version}"}.sort - ) - end - - test "linked bugs" do - assert_equal([236060, 260006], revisions(:revision_one).get_linked_bugs.sort) - end - - test "malformed XML" do - revision = revisions(:revision_one) - revision.description = "

      hi" - - revision.save - #assert revision.errors.any? - #assert_equal [:description, "is not well-formed XML"], revision.errors.first - - revision.description = "hi" - revision.save - #assert_equal false, revision.errors.any? - end -end diff --git a/test/unit/template_test.rb b/test/unit/template_test.rb deleted file mode 100644 index a8346d6..0000000 --- a/test/unit/template_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class TemplateTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/unit/user_test.rb b/test/unit/user_test.rb deleted file mode 100644 index 8ca01c5..0000000 --- a/test/unit/user_test.rb +++ /dev/null @@ -1,47 +0,0 @@ -# GLSAMaker v2 -# Copyright (C) 2009-2011 Alex Legler -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; version 2 of the License. -# -# For more information, see the LICENSE file. - -require 'test_helper' - -class UserTest < ActiveSupport::TestCase - fixtures :users - - test "invalid user name" do - user = User.new - assert !user.valid? - assert user.invalid?(:login) - end - - test "unique user name" do - user = User.new(:login => users(:test_user).login, - :name => "Mr. T", - :email => "foo@gentoo.org") - - assert !user.save - assert_equal ["User name must be unique"], user.errors[:login] - end - - test "invalid email" do - user = User.new(:login => 'notyetthere', - :name => 'doesntmatteranyway', - :email => 'THIScouldNEVERbeAvalidEMAIL@ADDRESS') - - assert !user.valid? - assert user.invalid?(:email) - end - - test "successful creation" do - user = User.new(:login => 'not_yet_taken_login', - :name => 'doesntmatteranyway', - :email => 'foo@bar.org', - :access => 0) - - assert user.save - end -end diff --git a/tmp/cache/.gitignore b/tmp/cache/.gitignore deleted file mode 100644 index e69de29..0000000 diff --git a/tmp/pids/.gitignore b/tmp/pids/.gitignore deleted file mode 100644 index e69de29..0000000 diff --git a/tmp/sessions/.gitignore b/tmp/sessions/.gitignore deleted file mode 100644 index e69de29..0000000 diff --git a/tmp/sockets/.gitignore b/tmp/sockets/.gitignore deleted file mode 100644 index e69de29..0000000 diff --git a/vendor/assets/stylesheets/.gitkeep b/vendor/assets/stylesheets/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/vendor/dictionaries/README_en_US.txt b/vendor/dictionaries/README_en_US.txt deleted file mode 100644 index f6d3631..0000000 --- a/vendor/dictionaries/README_en_US.txt +++ /dev/null @@ -1,278 +0,0 @@ -Additional vulnerability-related terms by a3li@gentoo.org - -Wordlist en_US spelling and morphological dictionary for OpenOffice.org -Version 2008-12-18 - -Based on Wordlist Hunspell dictionaries version 2008-12-05 -and Wordlist POS and AGID data created by Kevin Atkinson -and released on http://wordlist.sourceforge.net. - -Other fixes: - -OOo Issue 48060 - add numbers with affixes by COMPOUNDRULE (1st, 111th, 1990s etc.) -New REP items (better suggestions for accented words and a few mistakes) -OOo Issue 63541 - remove *dessicated, *dessication - -László Németh - -Original license: - -2008-12-05 Release - -README file for en_US and en_CA Hunspell dictionaries - -These dictionaries are created using the speller/make-hunspell-dict -dictionary in SCOWL, SVN revision 74. - -The NOSUGGEST flag was added to certain taboo words. While I made an -honest attempt to flag the strongest taboo words with the NOSUGGEST -flag, I MAKE NO GUARANTEE THAT I FLAGGED EVERY POSSIBLE TABOO WORD. -The list was originally derived from N�meth L�szl�, however I removed -some words which, while being considered taboo by some dictionaries, -are not really considered swear words in today's society. - -You can find SCOWL and friend at http://wordlist.sourceforge.net/. -Bug reports should go to the Issue Tracker found on the previously -mentioned web site. General discussion should go to the -wordlist-devel at sourceforge net mailing list. - -COPYRIGHT, SOURCES, and CREDITS: - -The en_US and en_CA dictionaries come directly from SCOWL (up to level -60) and is thus under the same copyright of SCOWL. The affix file is -a heavily modified version of the original english.aff file which was -released as part of Geoff Kuenning's Ispell and as such is covered by -his BSD license. Part of SCOWL is also based on Ispell thus the -Ispell copyright is included with the SCOWL copyright. - -The collective work is Copyright 2000-2007 by Kevin Atkinson as well -as any of the copyrights mentioned below: - - Copyright 2000-2007 by Kevin Atkinson - - Permission to use, copy, modify, distribute and sell these word - lists, the associated scripts, the output created from the scripts, - and its documentation for any purpose is hereby granted without fee, - provided that the above copyright notice appears in all copies and - that both that copyright notice and this permission notice appear in - supporting documentation. Kevin Atkinson makes no representations - about the suitability of this array for any purpose. It is provided - "as is" without express or implied warranty. - -Alan Beale also deserves special credit as he has, -in addition to providing the 12Dicts package and being a major -contributor to the ENABLE word list, given me an incredible amount of -feedback and created a number of special lists (those found in the -Supplement) in order to help improve the overall quality of SCOWL. - -The 10 level includes the 1000 most common English words (according to -the Moby (TM) Words II [MWords] package), a subset of the 1000 most -common words on the Internet (again, according to Moby Words II), and -frequently class 16 from Brian Kelk's "UK English Wordlist -with Frequency Classification". - -The MWords package was explicitly placed in the public domain: - - The Moby lexicon project is complete and has - been place into the public domain. Use, sell, - rework, excerpt and use in any way on any platform. - - Placing this material on internal or public servers is - also encouraged. The compiler is not aware of any - export restrictions so freely distribute world-wide. - - You can verify the public domain status by contacting - - Grady Ward - 3449 Martha Ct. - Arcata, CA 95521-4884 - - grady@netcom.com - grady@northcoast.com - -The "UK English Wordlist With Frequency Classification" is also in the -Public Domain: - - Date: Sat, 08 Jul 2000 20:27:21 +0100 - From: Brian Kelk - - > I was wondering what the copyright status of your "UK English - > Wordlist With Frequency Classification" word list as it seems to - > be lacking any copyright notice. - - There were many many sources in total, but any text marked - "copyright" was avoided. Locally-written documentation was one - source. An earlier version of the list resided in a filespace called - PUBLIC on the University mainframe, because it was considered public - domain. - - Date: Tue, 11 Jul 2000 19:31:34 +0100 - - > So are you saying your word list is also in the public domain? - - That is the intention. - -The 20 level includes frequency classes 7-15 from Brian's word list. - -The 35 level includes frequency classes 2-6 and words appearing in at -least 11 of 12 dictionaries as indicated in the 12Dicts package. All -words from the 12Dicts package have had likely inflections added via -my inflection database. - -The 12Dicts package and Supplement is in the Public Domain. - -The WordNet database, which was used in the creation of the -Inflections database, is under the following copyright: - - This software and database is being provided to you, the LICENSEE, - by Princeton University under the following license. By obtaining, - using and/or copying this software and database, you agree that you - have read, understood, and will comply with these terms and - conditions.: - - Permission to use, copy, modify and distribute this software and - database and its documentation for any purpose and without fee or - royalty is hereby granted, provided that you agree to comply with - the following copyright notice and statements, including the - disclaimer, and that the same appear on ALL copies of the software, - database and documentation, including modifications that you make - for internal use or for distribution. - - WordNet 1.6 Copyright 1997 by Princeton University. All rights - reserved. - - THIS SOFTWARE AND DATABASE IS PROVIDED "AS IS" AND PRINCETON - UNIVERSITY MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR - IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PRINCETON - UNIVERSITY MAKES NO REPRESENTATIONS OR WARRANTIES OF MERCHANT- - ABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE - LICENSED SOFTWARE, DATABASE OR DOCUMENTATION WILL NOT INFRINGE ANY - THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. - - The name of Princeton University or Princeton may not be used in - advertising or publicity pertaining to distribution of the software - and/or database. Title to copyright in this software, database and - any associated documentation shall at all times remain with - Princeton University and LICENSEE agrees to preserve same. - -The 40 level includes words from Alan's 3esl list found in version 4.0 -of his 12dicts package. Like his other stuff the 3esl list is also in the -public domain. - -The 50 level includes Brian's frequency class 1, words words appearing -in at least 5 of 12 of the dictionaries as indicated in the 12Dicts -package, and uppercase words in at least 4 of the previous 12 -dictionaries. A decent number of proper names is also included: The -top 1000 male, female, and Last names from the 1990 Census report; a -list of names sent to me by Alan Beale; and a few names that I added -myself. Finally a small list of abbreviations not commonly found in -other word lists is included. - -The name files form the Census report is a government document which I -don't think can be copyrighted. - -The file special-jargon.50 uses common.lst and word.lst from the -"Unofficial Jargon File Word Lists" which is derived from "The Jargon -File". All of which is in the Public Domain. This file also contain -a few extra UNIX terms which are found in the file "unix-terms" in the -special/ directory. - -The 55 level includes words from Alan's 2of4brif list found in version -4.0 of his 12dicts package. Like his other stuff the 2of4brif is also -in the public domain. - -The 60 level includes Brian's frequency class 0 and all words -appearing in at least 2 of the 12 dictionaries as indicated by the -12Dicts package. A large number of names are also included: The 4,946 -female names and the 3,897 male names from the MWords package. - -The 70 level includes the 74,550 common dictionary words and the -21,986 names list from the MWords package The common dictionary words, -like those from the 12Dicts package, have had all likely inflections -added. The 70 level also included the 5desk list from version 4.0 of -the 12Dics package which is the public domain - -The 80 level includes the ENABLE word list, all the lists in the -ENABLE supplement package (except for ABLE), the "UK Advanced Cryptics -Dictionary" (UKACD), the list of signature words in from YAWL package, -and the 10,196 places list from the MWords package. - -The ENABLE package, mainted by M\Cooper , -is in the Public Domain: - - The ENABLE master word list, WORD.LST, is herewith formally released - into the Public Domain. Anyone is free to use it or distribute it in - any manner they see fit. No fee or registration is required for its - use nor are "contributions" solicited (if you feel you absolutely - must contribute something for your own peace of mind, the authors of - the ENABLE list ask that you make a donation on their behalf to your - favorite charity). This word list is our gift to the Scrabble - community, as an alternate to "official" word lists. Game designers - may feel free to incorporate the WORD.LST into their games. Please - mention the source and credit us as originators of the list. Note - that if you, as a game designer, use the WORD.LST in your product, - you may still copyright and protect your product, but you may *not* - legally copyright or in any way restrict redistribution of the - WORD.LST portion of your product. This *may* under law restrict your - rights to restrict your users' rights, but that is only fair. - -UKACD, by J Ross Beresford , is under the -following copyright: - - Copyright (c) J Ross Beresford 1993-1999. All Rights Reserved. - - The following restriction is placed on the use of this publication: - if The UK Advanced Cryptics Dictionary is used in a software package - or redistributed in any form, the copyright notice must be - prominently displayed and the text of this document must be included - verbatim. - - There are no other restrictions: I would like to see the list - distributed as widely as possible. - -The 95 level includes the 354,984 single words and 256,772 compound -words from the MWords package, ABLE.LST from the ENABLE Supplement, -and some additional words found in my part-of-speech database that -were not found anywhere else. - -Accent information was taken from UKACD. - -My VARCON package was used to create the American, British, and -Canadian word list. - -Since the original word lists used used in the VARCON package came -from the Ispell distribution they are under the Ispell copyright: - - Copyright 1993, Geoff Kuenning, Granada Hills, CA - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. All modifications to the source code must be clearly marked as - such. Binary redistributions based on modified source code - must be clearly marked as modified versions in the documentation - and/or other materials provided with the distribution. - (clause 4 removed with permission from Geoff Kuenning) - 5. The name of Geoff Kuenning may not be used to endorse or promote - products derived from this software without specific prior - written permission. - - THIS SOFTWARE IS PROVIDED BY GEOFF KUENNING AND CONTRIBUTORS ``AS - IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GEOFF - KUENNING OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/dictionaries/en_US.aff b/vendor/dictionaries/en_US.aff deleted file mode 100644 index 4f4222f..0000000 --- a/vendor/dictionaries/en_US.aff +++ /dev/null @@ -1,3107 +0,0 @@ -FLAG num -AF 589 -AF 2,3 # 1 -AF 2 # 2 -AF 1 # 3 -AF 4,2 # 4 -AF 3,5,6,7 # 5 -AF 8,7,9 # 6 -AF 5,11,6 # 7 -AF 10 # 8 -AF 12 # 9 -AF 3 # 10 -AF 5,6,7 # 11 -AF 7,13,14 # 12 -AF 15,16,7 # 13 -AF 7,9 # 14 -AF 2,17 # 15 -AF 10,18,19 # 16 -AF 20,21,22 # 17 -AF 2,3,7 # 18 -AF 22 # 19 -AF 18,19,2,3 # 20 -AF 23,24,10,18,19 # 21 -AF 4,2,5,11,6 # 22 -AF 2,3,5,6,7 # 23 -AF 10,5,6,7 # 24 -AF 10,18,19,20,21,2,3 # 25 -AF 23,24,10,18,25,19,2,3,5,6,7 # 26 -AF 10,18,19,20,21 # 27 -AF 2,3,8,7,9 # 28 -AF 18,19,22 # 29 -AF 10,2,3 # 30 -AF 6,26,27 # 31 -AF 3,28 # 32 -AF 18,19 # 33 -AF 29,30 # 34 -AF 31,3,28 # 35 -AF 10,18,19,2,3 # 36 -AF 10,2 # 37 -AF 23,24,10,18,19,2,3 # 38 -AF 31 # 39 -AF 11,4,2 # 40 -AF 20,21,2,3 # 41 -AF 2,17,29,30 # 42 -AF 3,8,7,9 # 43 -AF 23 # 44 -AF 10,20,21 # 45 -AF 8,6,7 # 46 -AF 2,3,32,33,7 # 47 -AF 20,2,3 # 48 -AF 29,30,34,35 # 49 -AF 29,30,36,34,35 # 50 -AF 2,3,31 # 51 -AF 23,24,10,18,19,2,3,5,6,7 # 52 -AF 37,2 # 53 -AF 10,2,3,8,7,9 # 54 -AF 18,22 # 55 -AF 2,17,6,26,27 # 56 -AF 37,2,3 # 57 -AF 7 # 58 -AF 29,30,36 # 59 -AF 17 # 60 -AF 41,42,7 # 61 -AF 2,3,5,7 # 62 -AF 2,3,8,6,7 # 63 -AF 2,3,43,44,7 # 64 -AF 2,3,45 # 65 -AF 4,2,46 # 66 -AF 10,18,19,8,7,9 # 67 -AF 10,8,7,9 # 68 -AF 2,3,28,31 # 69 -AF 3,7 # 70 -AF 4,2,3 # 71 -AF 36,34,35 # 72 -AF 2,3,7,9 # 73 -AF 23,24,10,18,19,4,2,5,11,6 # 74 -AF 23,24,10 # 75 -AF 47,7,9 # 76 -AF 2,3,8,7 # 77 -AF 23,2,3,5,6,7 # 78 -AF 38,39,40 # 79 -AF 2,3,200 # 80 -AF 4,2,48 # 81 -AF 22,2,3 # 82 -AF 10,18 # 83 -AF 18,19,20,21 # 84 -AF 49,50,10,18,19 # 85 -AF 2,3,6,7 # 86 -AF 2,17,29,30,6,26,27 # 87 -AF 7,14 # 88 -AF 4 # 89 -AF 7,51,9,52 # 90 -AF 23,2,3,7 # 91 -AF 2,3,53,54,7 # 92 -AF 7,51,9 # 93 -AF 10,18,19,3 # 94 -AF 2,56,57,10,18,19 # 95 -AF 20,2,3,7 # 96 -AF 17,29,30,36,34,35 # 97 -AF 23,24,10,18,19,5,6,7 # 98 -AF 59,2,3,60,61,7 # 99 -AF 2,58 # 100 -AF 17,29,30,6,26,27 # 101 -AF 49,50 # 102 -AF 15,16,7,2,3 # 103 -AF 10,18,19,20,21,8,7,9 # 104 -AF 32,33,7 # 105 -AF 23,24,18,19,2,3 # 106 -AF 10,18,19,20,21,2,3,8,7,9 # 107 -AF 2,5,6 # 108 -AF 2,3,7,13,14 # 109 -AF 62,6 # 110 -AF 29,30,34,35,2 # 111 -AF 2,3,62,6,7 # 112 -AF 2,3,65,66,7 # 113 -AF 63,64,7 # 114 -AF 2,3,67,5,6,7 # 115 -AF 62,6,7 # 116 -AF 53,54,7 # 117 -AF 3,53,54,7 # 118 -AF 61,7 # 119 -AF 2,67 # 120 -AF 6,7 # 121 -AF 8,7 # 122 -AF 2,3,67 # 123 -AF 2,3,6,7,68 # 124 -AF 11,6 # 125 -AF 5,6,47,7 # 126 -AF 7,69,9 # 127 -AF 2,3,7,14 # 128 -AF 23,2,3 # 129 -AF 2,3,28 # 130 -AF 2,3,70,66,7 # 131 -AF 71,72,18,19 # 132 -AF 2,3,60,61,7 # 133 -AF 2,3,7,51,9,52 # 134 -AF 23,24,10,18,19,2,3,28,7 # 135 -AF 2,3,73,55,7 # 136 -AF 2,17,6,27 # 137 -AF 2,3,28,7 # 138 -AF 20,2,3,8,7,9 # 139 -AF 34,35 # 140 -AF 3,6,7 # 141 -AF 6 # 142 -AF 29,30,36,34,35,6,26,27 # 143 -AF 2,3,6,47,7 # 144 -AF 73,55,7 # 145 -AF 18,19,20,21,2,3,8,7,9 # 146 -AF 23,4,2,5,11,6 # 147 -AF 2,17,26,27 # 148 -AF 2,8 # 149 -AF 20,21 # 150 -AF 10,18,25,19 # 151 -AF 2,3,53,54,7,71 # 152 -AF 18 # 153 -AF 37,76,2,3 # 154 -AF 75,2 # 155 -AF 4,5,11,6 # 156 -AF 39 # 157 -AF 10,18,19,5,6,7 # 158 -AF 23,24,10,18,25,19,3,28 # 159 -AF 2,3,63,64,7 # 160 -AF 23,2 # 161 -AF 18,19,20,21,2 # 162 -AF 29,30,35,2 # 163 -AF 10,2,3,7 # 164 -AF 23,24,18,19,2,3,5,6,7 # 165 -AF 23,24 # 166 -AF 2,17,27 # 167 -AF 2,3,7,13,14,200 # 168 -AF 29,30,6,26,27 # 169 -AF 2,3,63,64,7,77,78 # 170 -AF 2,3,5,6,7,79 # 171 -AF 4,2,5,11,6,38 # 172 -AF 2,5 # 173 -AF 18,19,29,30,36,80,34,35,6,26,27 # 174 -AF 3,7,13,14,81 # 175 -AF 23,4,2 # 176 -AF 10,18,19,5,11,6 # 177 -AF 23,24,18,19 # 178 -AF 23,24,2,3,5,6,7 # 179 -AF 2,3,60,61,7,82 # 180 -AF 4,2,12,5,11,6,38,39,40 # 181 -AF 11,6,4,2 # 182 -AF 23,24,10,2,3 # 183 -AF 2,46 # 184 -AF 2,3,28,5,6,7 # 185 -AF 83,2,3 # 186 -AF 23,24,18,19,2 # 187 -AF 23,24,2,3 # 188 -AF 3,200 # 189 -AF 23,24,4,2 # 190 -AF 10,3 # 191 -AF 60,61,7 # 192 -AF 29,30,36,35 # 193 -AF 3,43,44,7 # 194 -AF 5 # 195 -AF 2,3,84 # 196 -AF 66 # 197 -AF 23,24,86,87,10,18,19,3,5,6,7 # 198 -AF 4,2,88 # 199 -AF 2,3,73,7 # 200 -AF 2,89 # 201 -AF 2,84 # 202 -AF 2,3,90,91,7 # 203 -AF 11,23,24,10,4,2 # 204 -AF 11 # 205 -AF 2,17,36 # 206 -AF 10,18,19,2,3,8,7,9 # 207 -AF 15,16,7,92 # 208 -AF 10,18,2,3 # 209 -AF 10,2,3,5,6,7 # 210 -AF 36 # 211 -AF 2,17,36,34,35 # 212 -AF 2,3,41,42,7 # 213 -AF 8 # 214 -AF 2,17,27,29,30,36,34,35 # 215 -AF 23,86,87,10,2,3,5,6,7 # 216 -AF 3,63,64,7 # 217 -AF 2,3,28,32,33,7 # 218 -AF 17,29,30 # 219 -AF 10,18,19,2,3,7 # 220 -AF 2,17,29,30,36,34,35 # 221 -AF 35 # 222 -AF 10,18,19,20,21,2 # 223 -AF 2,3,5,6,7,86,87,10 # 224 -AF 23,24,10,2 # 225 -AF 23,86,87,10,2,3,7 # 226 -AF 2,3,24,81,7,14 # 227 -AF 2,12 # 228 -AF 2,94 # 229 -AF 95,31 # 230 -AF 4,3 # 231 -AF 2,3,28,8,7,9 # 232 -AF 23,5,6,7 # 233 -AF 23,24,86,87,10,18,19,2 # 234 -AF 23,24,86,87,10,18,2 # 235 -AF 23,24,18,19,67 # 236 -AF 23,2,3,6,7,79 # 237 -AF 23,96,97 # 238 -AF 10,18,19,2 # 239 -AF 11,38,40 # 240 -AF 5,6 # 241 -AF 15,16,7,2,3,92 # 242 -AF 36,35 # 243 -AF 29,30,2 # 244 -AF 2,3,98,8,6,7 # 245 -AF 10,18,19,20,8,7,9 # 246 -AF 2,3,24,71,54,7 # 247 -AF 10,77,78,18,19,63,64,7 # 248 -AF 2,3,99,7 # 249 -AF 10,18,20,21 # 250 -AF 8,9 # 251 -AF 11,38,39,40,4,2,12 # 252 -AF 20,8,7,9 # 253 -AF 20,21,2,3,8,7,9 # 254 -AF 10,20,21,2,3 # 255 -AF 11,6,100,82,101,3 # 256 -AF 20,21,8,7,9 # 257 -AF 27 # 258 -AF 29,30,35 # 259 -AF 20,22,2,3,8,7,9 # 260 -AF 102,103,10,18,19,2,3,7 # 261 -AF 13 # 262 -AF 2,3,47,7,9 # 263 -AF 3,73,55,7 # 264 -AF 23,10,18,19,29,30,36,2,3,17,6,26,27 # 265 -AF 23,24,18,19,5,6,7 # 266 -AF 104,105,2,3,60,61,7 # 267 -AF 22,3 # 268 -AF 3,6,7,106 # 269 -AF 2,3,8,6,7,9 # 270 -AF 23,24,5,6,7 # 271 -AF 4,2,3,5,11,6,7 # 272 -AF 2,5,6,7 # 273 -AF 65,66,7 # 274 -AF 2,17,29,30,36,34,35,6,26,27 # 275 -AF 31,3 # 276 -AF 11,23,4,2 # 277 -AF 23,24,49,50,10,18,19,2,3 # 278 -AF 10,4,2,5,11,6 # 279 -AF 23,24,86,87,10 # 280 -AF 23,24,10,18,19,2,3,6,7 # 281 -AF 2,17,29,30,34,35,6,26,27 # 282 -AF 107,108 # 283 -AF 23,24,18,25,19,2,3,5,6,7 # 284 -AF 18,19,81,109,2,3,7,13 # 285 -AF 2,17,29,30,34,35 # 286 -AF 4,2,46,5,11,6 # 287 -AF 23,24,2,3,7 # 288 -AF 18,19,20,21,22 # 289 -AF 2,110 # 290 -AF 2,3,60,7 # 291 -AF 10,18,19,81,109,2,3,7,13,14 # 292 -AF 23,24,4,2,5,11,6 # 293 -AF 6,7,114 # 294 -AF 115,116,2,3,32,33,7 # 295 -AF 115,2,3,32,33,7 # 296 -AF 6,117,26,27,118 # 297 -AF 70,66,7 # 298 -AF 21,2,3 # 299 -AF 23,18,19 # 300 -AF 6,47,7 # 301 -AF 11,6,100 # 302 -AF 23,24,10,18 # 303 -AF 10,20,21,3,8,6,7 # 304 -AF 23,24,10,5,6,7 # 305 -AF 111,112,113,2,110 # 306 -AF 2,3,54,7 # 307 -AF 2,3,5,6,7,200 # 308 -AF 200 # 309 -AF 104,105,2 # 310 -AF 3,65,66,7 # 311 -AF 6,7,119 # 312 -AF 3,58 # 313 -AF 23,24,10,18,19,36,2,3 # 314 -AF 3,8,6,7 # 315 -AF 18,19,20,21,22,3,8,7,9 # 316 -AF 7,9,52 # 317 -AF 2,3,5,6,7,68 # 318 -AF 3,5,6,7,68 # 319 -AF 2,3,56,57,86,87,10,18,19,7 # 320 -AF 2,88 # 321 -AF 102,103,10,18,19 # 322 -AF 2,45 # 323 -AF 10,77,78,18,19 # 324 -AF 11,6,100,23,4,2,3 # 325 -AF 2,3,28,86,87,10,18,19 # 326 -AF 102,2,3,73,55,7 # 327 -AF 10,18,19,20,21,2,3,8,47,7,9 # 328 -AF 2,3,65,7 # 329 -AF 2,8,9 # 330 -AF 2,3,28,7,13,14 # 331 -AF 43,44,7 # 332 -AF 5,6,41,42,7 # 333 -AF 2,6 # 334 -AF 2,3,63,64,7,77 # 335 -AF 20 # 336 -AF 2,3,9 # 337 -AF 67 # 338 -AF 115,116 # 339 -AF 2,3,7,69,51,9 # 340 -AF 12,38,39,40 # 341 -AF 2,3,86,87,10,20,8,7,9 # 342 -AF 18,19,2 # 343 -AF 2,85,17 # 344 -AF 10,18,19,81,109,7,13,14 # 345 -AF 18,19,20,21,22,8,7,9 # 346 -AF 31,7 # 347 -AF 18,25,19,2,3 # 348 -AF 4,2,120 # 349 -AF 104,2,3 # 350 -AF 6,7,106 # 351 -AF 22,2 # 352 -AF 2,3,6,7,119 # 353 -AF 2,121,122 # 354 -AF 23,10,2,3 # 355 -AF 15,16,7,24 # 356 -AF 3,7,9 # 357 -AF 10,4,2 # 358 -AF 11,4,2,88 # 359 -AF 2,8,7,9 # 360 -AF 2,3,53,7 # 361 -AF 17,6,26,27 # 362 -AF 29,30,36,34,35,2 # 363 -AF 2,123,124 # 364 -AF 29,30,34,35,6,26,27 # 365 -AF 2,3,7,69,9 # 366 -AF 83,2 # 367 -AF 2,3,125 # 368 -AF 23,24,86,87,10,18,25,19,2,3 # 369 -AF 3,6,47,7 # 370 -AF 23,24,10,3 # 371 -AF 2,126,127 # 372 -AF 128,2 # 373 -AF 24 # 374 -AF 2,5,6,43,44 # 375 -AF 8,47,7,9 # 376 -AF 2,3,7,51,9 # 377 -AF 3,81 # 378 -AF 23,24,10,18,19,5,11,6 # 379 -AF 23,24,10,18,19,46 # 380 -AF 23,2,3,6,7,119 # 381 -AF 6,7,68 # 382 -AF 10,18,19,2,3,5,6,7 # 383 -AF 129,2 # 384 -AF 2,3,86,87,10,18,25,19,20,21,8,7,9 # 385 -AF 23,24,18,19,3,5,6,7 # 386 -AF 2,3,32,7 # 387 -AF 2,130 # 388 -AF 81 # 389 -AF 86,87,10,20,21,8,7,9 # 390 -AF 3,45,7 # 391 -AF 86,87,10,20 # 392 -AF 23,24,5,11,6 # 393 -AF 32,33,7,3 # 394 -AF 7,9,131 # 395 -AF 23,24,86,87,10,18,19 # 396 -AF 23,24,86,87,10,18,19,2,3,5,6,7 # 397 -AF 11,23,24,10,18,19,4,2 # 398 -AF 56,57,10,18,19,66,7 # 399 -AF 2,60,61,7,86,87,10 # 400 -AF 2,45,93 # 401 -AF 132,2 # 402 -AF 2,3,7,13,14,81 # 403 -AF 10,20,21,8,7,9 # 404 -AF 2,3,133 # 405 -AF 2,82 # 406 -AF 23,24,10,18,19,2,3,6,7,79 # 407 -AF 23,2,3,6,7 # 408 -AF 10,20,21,2,3,7 # 409 -AF 23,24,10,18,19,2 # 410 -AF 2,36 # 411 -AF 2,3,6,7,79 # 412 -AF 11,6,100,134 # 413 -AF 23,3,5,6,7 # 414 -AF 2,3,24,65,66,7 # 415 -AF 45 # 416 -AF 2,3,45,5,6,7 # 417 -AF 18,2 # 418 -AF 136,22,2,3 # 419 -AF 2,3,77,7 # 420 -AF 11,38,39,40 # 421 -AF 137,2 # 422 -AF 17,29,30,34,35 # 423 -AF 33 # 424 -AF 17,27 # 425 -AF 23,24,86,87,10,18,19,5,6,7 # 426 -AF 23,5,6 # 427 -AF 23,24,10,18,19,7 # 428 -AF 2,3,7,200 # 429 -AF 18,19,20,21,22,2,3 # 430 -AF 11,38,40,4 # 431 -AF 10,18,19,2,3,8,7 # 432 -AF 10,18,20,21,3,8,7,9 # 433 -AF 23,24,10,18,19,3,28 # 434 -AF 87,10 # 435 -AF 10,18,19,20,21,3,8,7,9 # 436 -AF 18,2,3 # 437 -AF 18,3 # 438 -AF 66,7 # 439 -AF 2,3,66,7 # 440 -AF 6,117,27,118 # 441 -AF 2,3,61,7 # 442 -AF 137,4,2 # 443 -AF 45,93 # 444 -AF 15,16,7,23,2,3 # 445 -AF 20,3,8,7,9 # 446 -AF 20,21,3 # 447 -AF 23,2,3,5,6,7,119 # 448 -AF 2,3,60,61,7,79 # 449 -AF 4,2,89 # 450 -AF 2,3,28,43,44,7 # 451 -AF 4,2,3,5,11,6 # 452 -AF 2,9 # 453 -AF 49,50,10 # 454 -AF 23,24,10,18,19,2,3,7 # 455 -AF 44,7 # 456 -AF 20,21,22,2,3 # 457 -AF 5,7 # 458 -AF 23,10,2,3,5,6,7 # 459 -AF 18,20,2,3,8,7,9 # 460 -AF 2,17,29,30,36 # 461 -AF 2,3,5,6,63,64,7 # 462 -AF 2,3,139 # 463 -AF 5,11,6,7 # 464 -AF 10,18,19,20,21,5 # 465 -AF 20,21,2,3,7 # 466 -AF 22,2,3,8,7,9 # 467 -AF 37,76,2 # 468 -AF 2,3,56,57,7 # 469 -AF 10,18,25,19,3 # 470 -AF 23,24,10,18,19,4,2 # 471 -AF 17,29,30,36,34,35,6,26,27 # 472 -AF 140,2,3,5,6,7 # 473 -AF 3,66,7 # 474 -AF 9 # 475 -AF 56,57,18,19,7 # 476 -AF 13,14 # 477 -AF 2,3,5,6,7,119 # 478 -AF 3,7,13,14 # 479 -AF 18,19,8,7,9 # 480 -AF 6,68 # 481 -AF 2,3,7,141,142 # 482 -AF 10,20,2,3,8,7,9 # 483 -AF 2,3,7,9,52 # 484 -AF 136,143,22,2,3,8,7,9 # 485 -AF 2,17,27,29,30 # 486 -AF 2,3,77,78 # 487 -AF 11,56,57,10,18,19 # 488 -AF 18,19,3 # 489 -AF 2,3,81 # 490 -AF 2,3,6,7,119,144 # 491 -AF 99 # 492 -AF 29,30,36,2 # 493 -AF 23,24,10,2,3,7 # 494 -AF 20,2,3,6,47,7 # 495 -AF 18,19,5,6,7 # 496 -AF 3,6,7,68 # 497 -AF 145,2,3 # 498 -AF 106 # 499 -AF 2,3,8,47,7,9 # 500 -AF 2,3,7,14,200 # 501 -AF 29,30,200 # 502 -AF 2,3,6,7,114 # 503 -AF 2,3,5,6,47,7 # 504 -AF 3,7,14 # 505 -AF 2,17,23,24,10,18,19,29,30,6,26,27 # 506 -AF 23,24,86,87,10,18,25,19,3,5,6,7 # 507 -AF 59,2,3 # 508 -AF 2,3,130 # 509 -AF 84 # 510 -AF 18,19,22,2,3,28,8,7,9 # 511 -AF 23,18,2,3,5,6,7 # 512 -AF 104,2,3,60,61,7 # 513 -AF 23,24,10,18,19,2,3,28,5,6,7 # 514 -AF 2,3,7,13 # 515 -AF 63,64,7,77,78,18,19 # 516 -AF 18,19,29,30 # 517 -AF 23,24,18,19,2,3,7 # 518 -AF 2,3,5,6,7,106 # 519 -AF 23,24,10,18,19,3,5,6,7 # 520 -AF 71,72,10,18,19 # 521 -AF 2,3,53,54,7,71,72,10,18,19 # 522 -AF 43,44 # 523 -AF 2,17,34,35 # 524 -AF 23,2,5,6 # 525 -AF 10,18,19,20,21,2,3,7 # 526 -AF 23,147,10,18,2,3 # 527 -AF 10,29,30 # 528 -AF 18,19,81,109,2,3,7,13,14 # 529 -AF 20,21,22,2,3,8,7,9 # 530 -AF 2,3,71,7 # 531 -AF 18,19,20,21,8,7,9 # 532 -AF 23,24,4,5,11,6 # 533 -AF 23,24,10,18,19,4,5,11,6 # 534 -AF 27,29,30,36,34,35 # 535 -AF 2,3,99 # 536 -AF 3,60,61,7 # 537 -AF 11,4 # 538 -AF 85,17 # 539 -AF 18,19,20,21,136,22 # 540 -AF 11,38,40,4,2 # 541 -AF 10,2,3,28 # 542 -AF 2,3,64,7 # 543 -AF 3,95,31 # 544 -AF 18,19,22,2,3 # 545 -AF 30 # 546 -AF 11,6,4 # 547 -AF 7,148,149 # 548 -AF 29,2 # 549 -AF 10,3,28 # 550 -AF 23,24,10,18,25,19,2 # 551 -AF 10,104,18,19,105,60,61,7 # 552 -AF 41,42 # 553 -AF 2,3,28,53,54,7 # 554 -AF 2,71,72 # 555 -AF 10,77,78,18,19,2,3,63,64,7 # 556 -AF 23,2,3,60,61,7 # 557 -AF 18,19,7,13,14 # 558 -AF 23,24,10,2,3,5,6,7 # 559 -AF 63,64 # 560 -AF 86,87,10,18,19 # 561 -AF 115,32,33,7,3 # 562 -AF 11,53,54,4,2 # 563 -AF 2,3,67,7 # 564 -AF 10,104,18,19,105 # 565 -AF 23,10,18,19,2,3,5,6,7 # 566 -AF 4,2,5,62,11,6 # 567 -AF 23,24,86,87,10,18,25,19 # 568 -AF 56,65,66,7 # 569 -AF 20,21,2,3,8,6,7 # 570 -AF 18,19,2,3,5,6,7 # 571 -AF 5,6,7,68 # 572 -AF 10,18,19,81,109,2,3,7,14 # 573 -AF 8,6,7,9 # 574 -AF 10,18,19,20,21,3 # 575 -AF 2,3,86,87,10,20,21,8,7,9 # 576 -AF 14,150,2,3,28 # 577 -AF 2,67,5,6,7 # 578 -AF 3,7,200 # 579 -AF 2,3,28,23,5,6,7 # 580 -AF 2,3,86,87,10 # 581 -AF 20,21,3,28 # 582 -AF 23,24,2 # 583 -AF 2,17,27,29,30,34,35 # 584 -AF 201,204 # 585 -AF 205,203 # 586 -AF 201,202 # 587 -AF 205 # 588 -AF 203,300 # 589 -AM 1829 -AM ts:0 -AM st:abatis ts:Ns -AM ts:0 al:abode -AM ts:0 st:abide -AM st:ax ts:Ns -AM st:addendum ts:Ns -AM ts:0 al:addenda -AM ts:0 al:admen -AM st:adman ts:Ns -AM ts:0 al:afterlives -AM st:afterlife ts:Ns -AM st:agendum ts:Ns's -AM st:agendum ts:Ns -AM ts:0 al:aircraftmen -AM st:aircraftman ts:Ns -AM ts:0 al:airmen -AM st:airman ts:Ns -AM ts:0 al:airwomen -AM st:airwoman ts:Ns -AM ts:0 al:aldermen -AM st:alderman ts:Ns -AM ts:0 al:alderwomen -AM st:alderwoman ts:Ns -AM ts:0 al:alewives -AM st:alewife ts:Ns -AM st:algum ts:Ns's -AM st:algum ts:Ns -AM st:aluminum ts:Ns's -AM st:aluminum ts:Ns -AM ts:0 al:alumina al:alumina's -AM st:alumnus ts:Ns -AM ts:0 al:alumni -AM st:Alyssum ts:Ns's -AM st:Alyssum ts:Ns -AM st:amanuensis ts:Ns -AM ts:0 al:amanuenses -AM ts:0 al:ambulancemen -AM st:ambulanceman ts:Ns -AM ts:0 al:ambulancewomen -AM st:ambulancewoman ts:Ns -AM st:ammonium ts:Ns's -AM st:ammonium ts:Ns -AM ts:0 al:ammonia al:ammonia's -AM st:amniocentesis ts:Ns -AM ts:0 al:amniocenteses -AM st:be ts:Vd -AM ts:0 al:anchormen -AM st:anchorman ts:Ns -AM st:anchorperson ts:Ns -AM ts:0 al:anchorpeople -AM ts:0 al:anchorwomen -AM st:anchorwoman ts:Ns -AM st:annulus ts:Ns -AM ts:0 al:annuli -AM st:antis ts:Ns -AM ts:0 al:antes -AM st:antithesis ts:Ns -AM ts:0 al:antitheses -AM st:aphelion ts:Ns -AM ts:0 al:aphelia -AM st:Apium ts:Ns -AM st:apocryphon ts:Ns's -AM st:apocryphon ts:Ns -AM st:apotheosis ts:Ns -AM ts:0 al:apotheoses -AM st:apsis ts:Ns -AM st:Aquilon ts:Ns -AM st:arcanum ts:Ns -AM ts:0 al:arose -AM st:arise ts:Vd -AM ts:0 al:artillerymen -AM st:artilleryman ts:Ns -AM ts:0 al:assemblymen -AM st:assemblyman ts:Ns -AM ts:0 al:assemblywomen -AM st:assemblywoman ts:Ns -AM st:on ts:Ns -AM st:eat ts:Vd -AM st:Atlantis ts:Ns -AM ts:0 al:Atlantes -AM st:atrium ts:Ns -AM ts:0 al:atria -AM st:aurum ts:Ns's -AM st:aurum ts:Ns -AM st:auspex ts:Ns -AM ts:0 al:awoke al:awoken -AM st:awake ts:Vd -AM ts:0 al:aces -AM st:axis ts:Ns -AM ts:0 al:axes -AM st:babysit ts:Vd -AM ts:0 al:babysat -AM st:bacillus ts:Ns -AM ts:0 al:bacilli -AM ts:0 al:backwoodsmen -AM st:backwoodsman ts:Ns -AM st:bacterium ts:Ns's -AM st:bacterium ts:Ns -AM ts:0 al:bacteria al:bacteria's -AM ts:0 al:worse al:worst -AM st:bid ts:Vd -AM ts:0 al:badmen -AM st:badman ts:Ns -AM ts:0 al:bailsmen -AM st:bailsman ts:Ns -AM ts:0 al:bandsmen -AM st:bandsman ts:Ns -AM ts:0 al:bargemen -AM st:bargeman ts:Ns -AM ts:0 al:barmen -AM st:barman ts:Ns -AM ts:0 al:basemen -AM st:baseman ts:Ns -AM st:basis ts:Ns -AM st:basilicon ts:Ns's -AM st:basilicon ts:Ns -AM ts:0 al:bases -AM st:Batis ts:Ns -AM ts:0 al:batmen -AM st:batman ts:Ns -AM ts:0 al:batsmen -AM st:batsman ts:Ns -AM ts:0 al:am al:are al:art al:is al:was al:wast al:were -AM ts:0 al:bore al:born al:borne -AM st:become ts:Vd -AM ts:0 al:became -AM ts:0 al:befell -AM st:befall ts:Vd -AM st:begin ts:Vd -AM ts:0 al:begot al:begotten -AM ts:0 al:began al:begun -AM st:beget ts:Vd -AM st:behold ts:Vd -AM ts:0 al:beheld -AM ts:0 al:belying -AM ts:0 al:bellmen -AM st:bellman ts:Ns -AM st:belie ts:Vd -AM ts:0 al:bereft -AM st:bereave ts:Vd -AM ts:0 al:besought -AM st:beseech ts:Vd -AM ts:0 al:bespoke al:bespoken -AM st:bespeak ts:Vd -AM ts:0 al:bestrode -AM st:bestride ts:Vd -AM st:well ts:0 -AM ts:0 al:betook -AM st:beton ts:Ns's -AM st:beton ts:Ns -AM ts:0 al:bethought -AM st:bethink ts:Vd -AM st:betake ts:Vd -AM ts:0 al:bade -AM ts:0 al:bode -AM st:by ts:0 -AM ts:0 al:bound -AM ts:0 al:binmen -AM st:binman ts:Ns -AM st:bus ts:Ns's -AM st:bus ts:Ns -AM st:Blackfoot ts:Ns -AM ts:0 al:Blackfeet -AM st:bleed ts:Vd -AM ts:0 al:bled -AM st:blow ts:Vd -AM ts:0 al:blew -AM st:boon ts:Ns's -AM st:boon ts:Ns -AM ts:0 al:boatmen -AM st:boatman ts:Ns -AM st:bide ts:Vd -AM ts:0 al:bogeymen -AM st:bogeyman ts:Ns -AM ts:0 al:bogymen -AM st:bogyman ts:Ns -AM ts:0 al:bondmen -AM st:bondman ts:Ns -AM ts:0 al:bondsmen -AM st:bondsman ts:Ns -AM ts:0 al:bondwomen -AM st:bondwoman ts:Ns -AM ts:0 al:bonier al:boniest -AM st:boney ts:0 -AM ts:0 al:boogeymen -AM st:boogeyman ts:Ns -AM ts:0 al:boa al:boa's -AM st:boozey ts:0 -AM st:bear ts:Vd -AM st:buy ts:Vd -AM st:bind ts:Vd -AM ts:0 al:bowmen -AM st:bowman ts:Ns -AM ts:0 al:brakemen -AM st:brakeman ts:Ns -AM ts:0 al:broke al:broken -AM st:breastfeed ts:Vd -AM ts:0 al:breastfed -AM st:breed ts:Vd -AM ts:0 al:bred -AM st:brother ts:Ns -AM ts:0 al:brought -AM st:break ts:Vd -AM st:bronchus ts:Ns -AM ts:0 al:bronchi -AM ts:0 al:brethren -AM st:bring ts:Vd -AM st:bucktooth ts:Ns -AM ts:0 al:buckteeth -AM st:burley ts:0 -AM ts:0 al:bi al:bi's -AM ts:0 al:bushmen -AM st:bushman ts:Ns -AM ts:0 al:businessmen -AM st:businessman ts:Ns -AM st:businessperson ts:Ns -AM ts:0 al:businesspeople -AM ts:0 al:businesswomen -AM st:businesswoman ts:Ns -AM st:busman ts:Ns -AM ts:0 al:bought -AM ts:0 al:bier -AM st:cactus ts:Ns -AM ts:0 al:cacti -AM st:caddie ts:Vd -AM st:caduceus ts:Ns -AM ts:0 al:caducei -AM ts:0 al:caves -AM ts:0 al:cagier al:cagiest -AM st:cagey ts:0 -AM st:calculus ts:Ns -AM ts:0 al:calculi -AM ts:0 al:cameramen -AM st:cameraman ts:Ns -AM ts:0 al:camerawomen -AM st:camerawoman ts:Ns -AM st:come ts:Vd -AM ts:0 al:could -AM st:candelabrum ts:Ns's -AM st:candelabrum ts:Ns -AM ts:0 al:candelabra al:candelabra's -AM st:Carum ts:Ns's -AM st:Carum ts:Ns -AM st:carpus ts:Ns -AM ts:0 al:carpi -AM ts:0 al:caught -AM st:catharsis ts:Ns -AM ts:0 al:catharses -AM ts:0 al:cattlemen -AM st:cattleman ts:Ns -AM st:catch ts:Vd -AM ts:0 al:cavalrymen -AM st:cavalryman ts:Ns -AM ts:0 al:cavemen -AM st:caveman ts:Ns -AM st:cafe ts:Ns -AM st:cecum ts:Ns -AM ts:0 al:ceca -AM st:cedis ts:Ns -AM st:cerebrum ts:Ns -AM ts:0 al:cerebra -AM ts:0 al:chairmen -AM st:chairman ts:Ns -AM ts:0 al:chairwomen -AM st:chairwoman ts:Ns -AM st:chancey ts:0 -AM ts:0 al:charwomen -AM st:charwoman ts:Ns -AM ts:0 al:chessmen -AM st:chessman ts:Ns -AM st:chilis ts:Ns -AM st:chinchillon ts:Ns's -AM st:chinchillon ts:Ns -AM ts:0 al:chose al:chosen -AM ts:0 al:choosier al:choosiest -AM st:choosey ts:0 -AM st:choose ts:Vd -AM ts:0 al:churchmen -AM st:churchman ts:Ns -AM ts:0 al:churchwomen -AM st:churchwoman ts:Ns -AM st:cilium ts:Ns -AM ts:0 al:cilia -AM st:Cincinnatus ts:Ns -AM st:cirrus ts:Ns -AM ts:0 al:cirri -AM st:Co ts:Ns -AM st:clothe ts:Vd -AM ts:0 al:clansmen -AM st:clansman ts:Ns -AM ts:0 al:clanswomen -AM st:clanswoman ts:Ns -AM st:classis ts:Ns -AM ts:0 al:clayier al:clayiest -AM st:clayey ts:0 -AM ts:0 al:cleft al:clove al:cloven -AM ts:0 st:cleave -AM ts:0 al:clergymen -AM st:clergyman ts:Ns -AM ts:0 al:clergywomen -AM st:clergywoman ts:Ns -AM ts:0 al:clung -AM ts:0 al:cliquier al:cliquiest -AM st:cliquey ts:0 -AM ts:0 al:clad -AM st:cleave ts:Vd -AM st:clubfoot ts:Ns -AM ts:0 al:clubfeet -AM st:cling ts:Vd -AM ts:0 al:Ci -AM ts:0 al:coachmen -AM st:coachman ts:Ns -AM ts:0 st:coccus -AM ts:0 al:cocci -AM st:cocoon ts:Ns's -AM st:cocoon ts:Ns -AM ts:0 al:cocoa al:cocoa's -AM st:codon ts:Ns's -AM st:codon ts:Ns -AM ts:0 al:codices -AM st:codex ts:Ns -AM st:colon ts:Ns's -AM st:colon ts:Ns -AM ts:0 al:cola al:cola's -AM st:colossus ts:Ns -AM ts:0 al:colossi -AM ts:0 al:came -AM st:common ts:Ns's -AM st:common ts:Ns -AM ts:0 al:committeemen -AM st:committeeman ts:Ns -AM ts:0 al:committeewomen -AM st:committeewoman ts:Ns -AM ts:0 al:comma al:comma's -AM ts:0 al:congressmen -AM st:congressman ts:Ns -AM st:congressperson ts:Ns -AM ts:0 al:congresspeople -AM ts:0 al:congresswomen -AM st:congresswoman ts:Ns -AM st:consortium ts:Ns -AM ts:0 al:consortia -AM st:continuum ts:Ns -AM ts:0 al:continua -AM st:corneum ts:Ns's -AM st:corneum ts:Ns -AM st:corpus ts:Ns -AM ts:0 al:corpsmen -AM st:corpsman ts:Ns -AM ts:0 al:corpora -AM st:corrigendum ts:Ns -AM ts:0 al:cortices -AM st:cortex ts:Ns -AM st:can ts:Vd -AM ts:0 al:councilmen -AM st:councilman ts:Ns -AM ts:0 al:councilwomen -AM st:councilwoman ts:Ns -AM ts:0 al:countermen -AM st:counterman ts:Ns -AM ts:0 al:countersunk -AM st:countersink ts:Vd -AM ts:0 al:countrymen -AM st:countryman ts:Ns -AM ts:0 al:countrywomen -AM st:countrywoman ts:Ns -AM ts:0 al:kine -AM ts:0 al:cowmen -AM st:cowman ts:Ns -AM st:cozey ts:0 -AM ts:0 al:craftsmen -AM st:craftsman ts:Ns -AM st:craftsperson ts:Ns -AM ts:0 al:craftswomen -AM st:craftswoman ts:Ns -AM ts:0 al:crept -AM st:crematorium ts:Ns -AM ts:0 al:crematoria -AM st:creep ts:Vd -AM ts:0 al:crewmen -AM st:crewman ts:Ns -AM st:crisis ts:Ns -AM ts:0 al:crises -AM st:criterium ts:Ns -AM ts:0 al:criteria -AM ts:0 al:crossbowmen -AM st:crossbowman ts:Ns -AM st:crossbreed ts:Vd -AM ts:0 al:crossbred -AM st:crowfoot ts:Ns -AM ts:0 al:crowfeet -AM st:cumulus ts:Ns -AM st:cumulonimbus ts:Ns -AM ts:0 al:cumulonimbi -AM ts:0 al:cumuli -AM st:curium ts:Ns's -AM st:curium ts:Ns -AM ts:0 al:curia al:curia's -AM st:curriculum ts:Ns -AM ts:0 al:curricula -AM st:currie ts:Vd -AM st:curvey ts:0 -AM ts:0 al:dairymen -AM st:dairyman ts:Ns -AM ts:0 al:dairywomen -AM st:dairywoman ts:Ns -AM st:dalis ts:Ns -AM ts:0 al:durst -AM st:daris ts:Ns -AM st:dashis ts:Ns -AM st:datum ts:Ns -AM ts:0 al:data -AM ts:0 al:deliverymen -AM st:deliveryman ts:Ns -AM st:desideratum ts:Ns -AM ts:0 al:desiderata -AM st:diaeresis ts:Ns -AM ts:0 al:diaereses -AM st:diagnosis ts:Ns -AM ts:0 al:diagnoses -AM st:dex ts:Ns -AM ts:0 al:dicier al:diciest -AM st:dicey ts:0 -AM ts:0 al:dickier al:dickiest -AM st:dickey ts:0 -AM st:dictum ts:Ns -AM ts:0 al:dicta -AM st:do ts:Vd -AM ts:0 al:dying -AM st:dieresis ts:Ns -AM ts:0 al:diereses -AM ts:0 al:dug -AM st:dingey ts:0 -AM st:dinkey ts:0 -AM ts:0 al:dove -AM ts:0 al:did al:didst -AM st:dodecahedron ts:Ns -AM ts:0 al:dodecahedra -AM st:dolman ts:Ns's -AM st:dolman ts:Ns -AM ts:0 al:doormen -AM st:doorman ts:Ns -AM ts:0 al:dopier al:dopiest -AM st:dopey ts:0 -AM st:dormouse ts:Ns -AM ts:0 al:dormice -AM st:dive ts:Vd -AM ts:0 al:draftsmen -AM st:draftsman ts:Ns -AM ts:0 al:draftswomen -AM st:draftswoman ts:Ns -AM st:drink ts:Vd -AM ts:0 al:drew -AM st:draw ts:Vd -AM ts:0 st:drey -AM st:drey ts:0 -AM ts:0 al:drank al:drunk -AM ts:0 al:drove -AM st:drive ts:Vd -AM st:dig ts:Vd -AM st:duodenum ts:Ns -AM ts:0 al:duodena -AM st:dare ts:Vd -AM ts:0 al:dustmen -AM st:dustman ts:Ns -AM ts:0 al:Dutchmen -AM st:Dutchman ts:Ns -AM ts:0 st:die -AM st:eon ts:Ns -AM ts:0 al:ate -AM st:eclipsis ts:Ns -AM st:effluvium ts:Ns -AM ts:0 al:effluvia -AM st:old ts:0 -AM st:ellipsis ts:Ns -AM ts:0 al:ellipses -AM st:emphasis ts:Ns -AM ts:0 al:emphases -AM ts:0 al:Englishmen -AM st:Englishman ts:Ns -AM ts:0 al:Englishwomen -AM st:Englishwoman ts:Ns -AM ts:0 al:ea -AM st:ephemeron ts:Ns's -AM st:ephemeron ts:Ns -AM st:epiphenomenon ts:Ns -AM ts:0 al:epiphenomena -AM st:erratum ts:Ns's -AM st:erratum ts:Ns -AM ts:0 al:errata al:errata's -AM st:esophagus ts:Ns -AM ts:0 al:esophagi -AM st:eucalyptus ts:Ns -AM ts:0 al:eucalypti -AM ts:0 al:ices -AM st:exegesis ts:Ns -AM ts:0 al:exegeses -AM st:extremum ts:Ns -AM st:eyetooth ts:Ns -AM ts:0 al:eyeteeth -AM ts:0 al:fell -AM st:fantasie ts:Vd -AM ts:0 al:further al:furthest -AM st:fon ts:Ns's -AM st:fon ts:Ns -AM st:feed ts:Vd -AM ts:0 al:fed -AM ts:0 al:felt -AM st:feis ts:Ns -AM st:foot ts:Ns -AM ts:0 st:fellon -AM ts:0 al:fellowmen -AM st:fellowman ts:Ns -AM st:fall ts:Vd -AM st:feel ts:Vd -AM ts:0 al:ferrymen -AM st:ferryman ts:Ns -AM st:fiddley ts:0 -AM ts:0 al:fieldsmen -AM st:fieldsman ts:Ns -AM ts:0 al:fives -AM ts:0 al:fought -AM ts:0 al:found -AM st:finis ts:Ns -AM ts:0 al:fines -AM ts:0 al:firemen -AM st:fireman ts:Ns -AM ts:0 al:fishermen -AM st:fisherman ts:Ns -AM ts:0 al:fishwives -AM st:fishwife ts:Ns -AM st:fife ts:Ns -AM st:flagellum ts:Ns -AM ts:0 al:flagella -AM ts:0 al:flagmen -AM st:flagman ts:Ns -AM st:flakey ts:0 -AM st:flatfoot ts:Ns -AM ts:0 al:flatfeet -AM ts:0 st:fley -AM st:fley ts:0 -AM ts:0 al:flung -AM ts:0 al:floodlit -AM st:floodlight ts:Vd -AM ts:0 al:flukier al:flukiest -AM st:flukey ts:0 -AM st:fling ts:Vd -AM ts:0 al:feet -AM ts:0 al:footmen -AM st:footman ts:Ns -AM st:forum ts:Ns -AM st:forbid ts:Vd -AM ts:0 al:forbore al:forborne -AM ts:0 al:forbade -AM st:forbear ts:Vd -AM st:forefoot ts:Ns -AM ts:0 al:forefeet -AM st:foreknow ts:Vd -AM ts:0 al:foreknew -AM ts:0 al:foremen -AM st:foreman ts:Ns -AM st:foresee ts:Vd -AM ts:0 al:foresaw -AM ts:0 al:foreswore al:foresworn -AM st:foreswear ts:Vd -AM ts:0 al:foretold -AM ts:0 st:forethink -AM st:foretell ts:Vd -AM st:forego ts:Vd -AM ts:0 al:forewomen -AM st:forewoman ts:Ns -AM st:forgive ts:Vd -AM ts:0 al:forgot al:forgotten -AM ts:0 al:forgave -AM ts:0 al:forwent -AM st:forget ts:Vd -AM ts:0 al:forsook -AM st:forsake ts:Vd -AM ts:0 al:forswore al:forsworn -AM st:forswear ts:Vd -AM st:fortis ts:Ns -AM ts:0 al:fora -AM st:forgo ts:Vd -AM st:fight ts:Vd -AM st:find ts:Vd -AM st:Francis ts:Ns -AM ts:0 al:Frances -AM ts:0 al:freedmen -AM st:freedman ts:Ns -AM ts:0 al:freemen -AM st:freeman ts:Ns -AM ts:0 al:froze al:frozen -AM ts:0 al:Frenchmen -AM st:Frenchman ts:Ns -AM ts:0 al:Frenchwomen -AM st:Frenchwoman ts:Ns -AM ts:0 al:freshmen -AM st:freshman ts:Ns -AM ts:0 al:frogmen -AM st:frogman ts:Ns -AM ts:0 al:frontiersmen -AM st:frontiersman ts:Ns -AM ts:0 al:frontierswomen -AM st:frontierswoman ts:Ns -AM st:freeze ts:Vd -AM st:fungus ts:Ns -AM ts:0 al:fungi -AM ts:0 al:funnymen -AM st:funnyman ts:Ns -AM st:far ts:0 -AM st:gamesman ts:Ns -AM ts:0 al:gamier al:gamiest -AM st:gamey ts:0 -AM st:gammon ts:Ns's -AM st:gammon ts:Ns -AM ts:0 al:gamma al:gamma's -AM st:ganglion ts:Ns -AM ts:0 al:ganglia -AM ts:0 al:gasmen -AM st:gasman ts:Ns -AM st:give ts:Vd -AM st:goose ts:Ns -AM st:genus ts:Ns -AM st:genesis ts:Ns -AM ts:0 al:geneses -AM st:genius ts:Ns -AM ts:0 al:genii -AM ts:0 al:gentlemen -AM st:gentleman ts:Ns -AM ts:0 al:gentlewomen -AM st:gentlewoman ts:Ns -AM ts:0 al:genera -AM ts:0 al:got al:gotten -AM ts:0 al:ghostwrote -AM st:ghostwrite ts:Vd -AM ts:0 al:gave -AM st:glacis ts:Ns -AM st:gladiolus ts:Ns -AM ts:0 al:gladioli -AM ts:0 al:gluier al:gluiest -AM st:gluey ts:0 -AM ts:0 al:went -AM ts:0 al:best al:better -AM ts:0 al:gooier al:gooiest -AM st:gooey ts:0 -AM ts:0 al:geese -AM st:get ts:Vd -AM st:gratis ts:Ns -AM ts:0 al:grates -AM st:grow ts:Vd -AM ts:0 al:ground -AM ts:0 al:groomsmen -AM st:groomsman ts:Ns -AM ts:0 al:groundsmen -AM st:groundsman ts:Ns -AM st:grind ts:Vd -AM ts:0 al:grew -AM ts:0 al:guardsmen -AM st:guardsman ts:Ns -AM ts:0 al:gunmen -AM st:gunman ts:Ns -AM st:gussie ts:Vd -AM st:hadjis ts:Ns -AM ts:0 al:hadjes -AM st:have ts:Vd -AM st:hajjis ts:Ns -AM ts:0 al:hajjes -AM st:halfpenny ts:Ns -AM ts:0 al:halfpence,17 -AM ts:0 al:hamstrung -AM st:hamstring ts:Vd -AM ts:0 al:handymen -AM st:handyman ts:Ns -AM ts:0 al:hung -AM ts:0 al:hangmen -AM st:hangman ts:Ns -AM st:harmonicon ts:Ns's -AM st:harmonicon ts:Ns -AM st:hum ts:Ns -AM ts:0 al:had al:hadst al:has al:hast al:hath -AM ts:0 al:headmen -AM st:headman ts:Ns -AM ts:0 al:headsmen -AM st:headsman ts:Ns -AM ts:0 al:heartbroken -AM st:heartbreak ts:Vd -AM ts:0 al:hove -AM st:hold ts:Vd -AM ts:0 al:helmsmen -AM st:helmsman ts:Ns -AM ts:0 al:henchmen -AM st:henchman ts:Ns -AM ts:0 al:herdsmen -AM st:herdsman ts:Ns -AM st:his ts:Ns -AM ts:0 al:hying -AM ts:0 al:highwaymen -AM st:highwayman ts:Ns -AM st:Hindus ts:Ns -AM ts:0 al:Hindi -AM ts:0 al:hes -AM ts:0 al:hogtying -AM st:hogtie ts:Vd -AM ts:0 al:hokier al:hokiest -AM st:hokey ts:0 -AM ts:0 al:held -AM ts:0 al:holier al:holiest -AM st:holey ts:0 -AM ts:0 al:homier al:homiest -AM st:homey ts:0 -AM ts:0 al:ha -AM ts:0 al:horsemen -AM st:horseman ts:Ns -AM ts:0 al:horsewomen -AM st:horsewoman ts:Ns -AM ts:0 al:horsier al:horsiest -AM st:horsey ts:0 -AM ts:0 al:housebroke al:housebroken -AM st:housebreak ts:Vd -AM ts:0 al:housemen -AM st:houseman ts:Ns -AM ts:0 al:housewives -AM st:housewife ts:Ns -AM st:heave ts:Vd -AM st:humerus ts:Ns -AM ts:0 al:humeri -AM st:hang ts:Vd -AM st:hunkey ts:0 -AM ts:0 al:huntsmen -AM st:huntsman ts:Ns -AM ts:0 al:husbandmen -AM st:husbandman ts:Ns -AM st:hie ts:Vd -AM st:hypnosis ts:Ns -AM ts:0 al:hypnoses -AM st:hypochondrium ts:Ns's -AM st:hypochondrium ts:Ns -AM st:hypothalamus ts:Ns -AM ts:0 al:hypothalami -AM st:hypothesis ts:Ns -AM ts:0 al:hypotheses -AM st:iambus ts:Ns -AM ts:0 al:iambi -AM ts:0 al:icemen -AM st:iceman ts:Ns -AM st:ex ts:Ns -AM st:icosahedron ts:Ns -AM ts:0 al:icosahedra -AM st:ileum ts:Ns -AM ts:0 al:ilea -AM st:ilium ts:Ns -AM ts:0 al:ilia -AM st:inbreed ts:Vd -AM ts:0 al:inbred -AM st:incunabulum ts:Ns -AM ts:0 al:incunabula -AM ts:0 al:infantrymen -AM st:infantryman ts:Ns -AM st:interbreed ts:Vd -AM ts:0 al:interbred -AM ts:0 al:interwove al:interwoven -AM st:interweave ts:Vd -AM ts:0 al:Irishmen -AM st:Irishman ts:Ns -AM ts:0 al:Irishwomen -AM st:Irishwoman ts:Ns -AM st:us ts:Ns -AM ts:0 al:jackknives -AM st:jackknife ts:Ns -AM st:Jacobus ts:Ns -AM st:jejunum ts:Ns -AM ts:0 al:jejuna -AM st:jimmie ts:Vd -AM ts:0 al:jokier al:jokiest -AM st:jokey ts:0 -AM ts:0 al:journeymen -AM st:journeyman ts:Ns -AM ts:0 al:joyrode -AM st:joyride ts:Vd -AM ts:0 al:jurymen -AM st:juryman ts:Ns -AM ts:0 al:jurywomen -AM st:jurywoman ts:Ns -AM ts:0 al:kept -AM st:keep ts:Vd -AM st:cow ts:Ns -AM ts:0 al:kinsmen -AM st:kinsman ts:Ns -AM ts:0 al:kinswomen -AM st:kinswoman ts:Ns -AM ts:0 al:knelt -AM st:kneel ts:Vd -AM st:know ts:Vd -AM ts:0 al:knives -AM st:knife ts:Ns -AM ts:0 al:knew -AM st:labium ts:Ns -AM ts:0 al:labia -AM st:lacey ts:0 -AM st:lie ts:Vd -AM ts:0 al:landsmen -AM st:landsman ts:Ns -AM st:lum ts:Ns's -AM st:lum ts:Ns -AM ts:0 al:latices -AM st:lathis ts:Ns -AM st:latex ts:Ns -AM ts:0 al:laundrymen -AM st:laundryman ts:Ns -AM ts:0 al:laundrywomen -AM st:laundrywoman ts:Ns -AM st:Laurus ts:Ns's -AM st:Laurus ts:Ns -AM ts:0 al:lawmen -AM st:lawman ts:Ns -AM ts:0 al:laymen -AM st:layman ts:Ns -AM st:layperson ts:Ns -AM ts:0 al:laypeople -AM ts:0 al:laywomen -AM st:laywoman ts:Ns -AM ts:0 al:led -AM ts:0 st:little -AM ts:0 al:left -AM st:Ledum ts:Ns -AM st:lead ts:Vd -AM st:leis ts:Ns -AM st:leave ts:Vd -AM ts:0 al:legmen -AM st:legman ts:Ns -AM ts:0 al:lees -AM st:lepton ts:Ns -AM ts:0 al:lepta -AM ts:0 al:least -AM st:little ts:0 -AM st:louse ts:Ns -AM ts:0 al:lain al:lay al:lying -AM ts:0 al:lives -AM st:lifeboatman ts:Ns -AM ts:0 al:lit -AM st:Lilium ts:Ns's -AM st:Lilium ts:Ns -AM ts:0 al:limier al:limiest -AM st:limey ts:0 -AM ts:0 al:linemen -AM st:lineman ts:Ns -AM ts:0 al:linesmen -AM st:linesman ts:Ns -AM ts:0 al:linkmen -AM st:linkman ts:Ns -AM st:literatus ts:Ns's -AM st:literatus ts:Ns -AM st:light ts:Vd -AM ts:0 al:least al:less al:lesser -AM ts:0 al:liverymen -AM st:liveryman ts:Ns -AM st:life ts:Ns -AM st:locus ts:Ns -AM ts:0 al:loci -AM ts:0 al:longshoremen -AM st:longshoreman ts:Ns -AM ts:0 al:loonies al:loonier al:looniest -AM st:looney ts:0 -AM st:looney ts:Ns -AM ts:0 al:lice -AM ts:0 al:lumbermen -AM st:lumberman ts:Ns -AM st:lungis ts:Ns -AM ts:0 st:lie -AM ts:0 al:mesdames -AM ts:0 al:mesdemoiselles -AM st:make ts:Vd -AM ts:0 al:madmen -AM st:madman ts:Ns -AM ts:0 al:madwomen -AM st:madwoman ts:Ns -AM st:magus ts:Ns's -AM st:magus ts:Ns -AM st:Magus ts:Ns -AM st:magnesium ts:Ns's -AM st:magnesium ts:Ns -AM ts:0 al:magnesia al:magnesia's -AM ts:0 al:Magi -AM st:Mahabharatum ts:Ns's -AM st:Mahabharatum ts:Ns -AM ts:0 al:mailmen -AM st:mailman ts:Ns -AM ts:0 al:made -AM st:malis ts:Ns -AM st:Malus ts:Ns -AM st:mammon ts:Ns's -AM st:mammon ts:Ns -AM ts:0 al:mamma al:mamma's -AM ts:0 al:men -AM st:mangey ts:0 -AM ts:0 al:menservants -AM st:mantis ts:Ns -AM ts:0 al:mantes -AM ts:0 al:more al:most -AM st:Marathon ts:Ns's -AM st:Marathon ts:Ns -AM ts:0 al:Maratha al:Maratha's -AM st:Marion ts:Ns's -AM st:Marion ts:Ns -AM ts:0 al:Maria al:Maria's -AM ts:0 al:marksmen -AM st:marksman ts:Ns -AM st:mascaron ts:Ns's -AM st:mascaron ts:Ns -AM st:mum ts:Ns's -AM st:mum ts:Ns -AM st:maxis ts:Ns -AM ts:0 al:maxes -AM ts:0 al:might -AM st:medium ts:Ns's -AM st:medium ts:Ns -AM ts:0 al:media al:media's -AM ts:0 al:met -AM ts:0 al:molten -AM st:meniscus ts:Ns -AM ts:0 al:menisci -AM st:manservant ts:Ns -AM st:man ts:Ns -AM ts:0 al:merchantmen -AM st:merchantman ts:Ns -AM st:meris ts:Ns -AM ts:0 al:mermen -AM st:merman ts:Ns -AM st:meson ts:Ns's -AM st:meson ts:Ns -AM st:madame ts:Ns -AM st:mademoiselle ts:Ns -AM ts:0 al:mesa al:mesa's -AM st:monseigneur ts:Ns -AM st:monsieur ts:Ns -AM st:metacarpus ts:Ns -AM ts:0 al:metacarpi -AM st:metamorphosis ts:Ns -AM ts:0 al:metamorphoses -AM st:metastasis ts:Ns -AM ts:0 al:metastases -AM st:metatarsus ts:Ns -AM ts:0 al:metatarsi -AM st:metathesis ts:Ns -AM ts:0 al:metatheses -AM st:metempsychosis ts:Ns -AM ts:0 al:metempsychoses -AM st:metis ts:Ns -AM ts:0 al:methought -AM st:methinks ts:Vd -AM st:meet ts:Vd -AM st:mouse ts:Ns -AM st:microanalysis ts:Ns -AM ts:0 al:middlemen -AM st:middleman ts:Ns -AM ts:0 al:midshipmen -AM st:midshipman ts:Ns -AM ts:0 al:midwives -AM st:midwife ts:Ns -AM st:may ts:Vd -AM ts:0 al:militiamen -AM st:militiaman ts:Ns -AM ts:0 al:milkmen -AM st:milkman ts:Ns -AM st:Mimus ts:Ns's -AM st:Mimus ts:Ns -AM st:minis ts:Ns -AM st:minus ts:Ns's -AM st:minus ts:Ns -AM ts:0 al:mines -AM ts:0 al:mini al:mini's -AM ts:0 al:minutemen -AM st:minuteman ts:Ns -AM st:misdiagnosis ts:Ns -AM ts:0 al:misdiagnoses -AM ts:0 al:misled -AM st:mislead ts:Vd -AM st:missis ts:Ns -AM ts:0 al:misses -AM ts:0 al:misspoke al:misspoken -AM st:misspeak ts:Vd -AM ts:0 al:mistook -AM st:mistake ts:Vd -AM ts:0 al:misunderstood -AM st:misunderstand ts:Vd -AM st:mitis ts:Ns -AM st:mitochondrion ts:Ns -AM st:mitosis ts:Ns -AM ts:0 al:mitoses -AM st:modulus ts:Ns -AM ts:0 al:moduli -AM st:melt ts:Vd -AM st:momentum ts:Ns -AM ts:0 al:momenta -AM ts:0 al:monies -AM st:money ts:Ns -AM ts:0 al:messeigneurs -AM ts:0 al:messieurs -AM ts:0 al:moonlit -AM st:moonlight ts:Vd -AM ts:0 al:mopier al:mopiest -AM st:mopey ts:0 -AM st:much ts:0 -AM ts:0 st:much -AM ts:0 al:motlier al:motliest -AM st:motley ts:0 -AM ts:0 al:motormen -AM st:motorman ts:Ns -AM ts:0 al:mice -AM ts:0 al:mousier al:mousiest -AM st:mousey ts:0 -AM ts:0 al:ma al:ma's -AM ts:0 al:musclemen -AM st:muscleman ts:Ns -AM st:narcosis ts:Ns -AM ts:0 al:narcoses -AM st:necrosis ts:Ns -AM ts:0 al:necroses -AM ts:0 al:needlewomen -AM st:needlewoman ts:Ns -AM st:nemesis ts:Ns -AM ts:0 al:nemeses -AM st:neurosis ts:Ns -AM ts:0 al:neuroses -AM st:nevus ts:Ns -AM ts:0 al:nevi -AM ts:0 al:newsmen -AM st:newsman ts:Ns -AM ts:0 al:newspapermen -AM st:newspaperman ts:Ns -AM ts:0 al:newspaperwomen -AM st:newspaperwoman ts:Ns -AM ts:0 al:newswomen -AM st:newswoman ts:Ns -AM st:nimbus ts:Ns -AM ts:0 al:nimbi -AM st:No ts:Ns -AM ts:0 al:Ni -AM ts:0 al:noblemen -AM st:nobleman ts:Ns -AM ts:0 al:noblewomen -AM st:noblewoman ts:Ns -AM ts:0 al:Norsemen -AM st:Norseman ts:Ns -AM st:nosey ts:0 -AM st:novum ts:Ns's -AM st:novum ts:Ns -AM st:nucleus ts:Ns -AM st:nucleolus ts:Ns -AM ts:0 al:nucleoli -AM ts:0 al:nuclei -AM ts:0 al:nurserymen -AM st:nurseryman ts:Ns -AM ts:0 al:oarsmen -AM st:oarsman ts:Ns -AM ts:0 al:oarswomen -AM st:oarswoman ts:Ns -AM st:oasis ts:Ns -AM ts:0 al:oases -AM ts:0 al:oilmen -AM st:oilman ts:Ns -AM st:ous ts:Ns -AM ts:0 al:elder al:eldest -AM ts:0 al:ombudsmen -AM st:ombudsman ts:Ns -AM ts:0 al:a -AM st:opus ts:Ns's -AM st:opus ts:Ns -AM st:optimum ts:Ns -AM ts:0 al:optima -AM ts:0 al:opera al:opera's -AM ts:0 al:outdrew -AM st:outdraw ts:Vd -AM ts:0 al:outfought -AM st:outfight ts:Vd -AM st:outgrow ts:Vd -AM ts:0 al:outgrew -AM st:outlie ts:Vd -AM st:outrun ts:Vd -AM ts:0 al:outran -AM ts:0 al:outsold -AM ts:0 al:outshone -AM st:outshine ts:Vd -AM st:outsell ts:Vd -AM ts:0 st:outspeak -AM ts:0 al:outwore al:outworn -AM st:outwear ts:Vd -AM st:ovum ts:Ns -AM st:overeat ts:Vd -AM ts:0 al:overbore al:overborne -AM st:overbear ts:Vd -AM st:overbuy ts:Vd -AM ts:0 al:overbought -AM st:overcome ts:Vd -AM ts:0 al:overcame -AM ts:0 al:overdrew -AM st:overdraw ts:Vd -AM ts:0 al:overate -AM st:overfeed ts:Vd -AM ts:0 al:overfed -AM st:overgrow ts:Vd -AM ts:0 al:overgrew -AM ts:0 al:overhung -AM st:overhang ts:Vd -AM st:overlie ts:Vd -AM ts:0 al:overlain al:overlay al:overlying -AM st:overrun ts:Vd -AM ts:0 al:overrode -AM st:override ts:Vd -AM ts:0 al:overran -AM st:oversee ts:Vd -AM ts:0 al:oversaw -AM ts:0 al:oversold -AM ts:0 al:overshot -AM st:overshoot ts:Vd -AM ts:0 al:overslept -AM st:oversleep ts:Vd -AM st:oversell ts:Vd -AM ts:0 al:overtook -AM st:overthrow ts:Vd -AM ts:0 al:overthrew -AM st:overtake ts:Vd -AM ts:0 al:overwrought -AM ts:0 al:overwrote -AM st:overwrite ts:Vd -AM st:overwork ts:Vd -AM ts:0 al:ova -AM st:oxymoron ts:Ns -AM ts:0 al:oxymora -AM ts:0 al:pacier al:paciest -AM st:pacey ts:0 -AM st:papillon ts:Ns's -AM st:papillon ts:Ns -AM st:papyrus ts:Ns -AM ts:0 al:papyri -AM st:paramecium ts:Ns -AM ts:0 al:paramecia -AM st:paraphrasis ts:Ns -AM st:parenthesis ts:Ns -AM ts:0 al:parentheses -AM st:paresis ts:Ns -AM ts:0 al:pareses -AM st:paris ts:Ns -AM ts:0 al:partook -AM st:partake ts:Vd -AM ts:0 al:passersby -AM st:passerby ts:Ns -AM st:pastis ts:Ns -AM ts:0 al:pastes -AM ts:0 al:patresfamilias -AM st:paterfamilias ts:Ns -AM ts:0 al:patrolmen -AM st:patrolman ts:Ns -AM ts:0 al:patrolwomen -AM st:patrolwoman ts:Ns -AM st:pavis ts:Ns -AM st:peon ts:Ns's -AM st:peon ts:Ns -AM st:penny ts:Ns -AM ts:0 al:penknives -AM st:penknife ts:Ns -AM ts:0 al:penmen -AM st:penman ts:Ns -AM ts:0 al:pence,17 -AM ts:0 al:pea al:pea's -AM st:person ts:Ns's -AM st:person ts:Ns -AM st:pericardium ts:Ns -AM ts:0 al:pericardia -AM st:perihelion ts:Ns -AM ts:0 al:perihelia -AM st:perineum ts:Ns -AM ts:0 al:perinea -AM st:periphrasis ts:Ns -AM ts:0 al:periphrases -AM st:peristalsis ts:Ns -AM ts:0 al:peristalses -AM ts:0 al:people al:people's -AM st:phallus ts:Ns -AM ts:0 al:phalli -AM st:phasis ts:Ns -AM st:phenomenon ts:Ns -AM ts:0 al:phenomena -AM ts:0 al:phonier al:phoniest -AM st:phoney ts:0 -AM st:phylum ts:Ns -AM ts:0 al:phyla -AM st:pikis ts:Ns -AM st:pilis ts:Ns -AM ts:0 al:pinier al:piniest -AM st:piney ts:0 -AM st:pipis ts:Ns -AM st:Pisum ts:Ns -AM st:pus ts:Ns's -AM st:pus ts:Ns -AM st:piton ts:Ns's -AM st:piton ts:Ns -AM ts:0 al:pitchmen -AM st:pitchman ts:Ns -AM ts:0 al:pita al:pita's -AM st:placeman ts:Ns -AM ts:0 al:plainclothesmen -AM st:plainclothesman ts:Ns -AM ts:0 al:plainsmen -AM st:plainsman ts:Ns -AM st:plasmon ts:Ns's -AM st:plasmon ts:Ns -AM st:pleon ts:Ns's -AM st:pleon ts:Ns -AM st:plectrum ts:Ns -AM ts:0 al:plectra -AM st:pleuron ts:Ns's -AM st:pleuron ts:Ns -AM ts:0 al:plowmen -AM st:plowman ts:Ns -AM st:plie ts:Vd -AM ts:0 al:pocketknives -AM st:pocketknife ts:Ns -AM ts:0 al:pokier al:pokiest -AM st:pokey ts:0 -AM st:polis ts:Ns -AM ts:0 al:policemen -AM st:policeman ts:Ns -AM ts:0 al:policewomen -AM st:policewoman ts:Ns -AM ts:0 al:postmen -AM st:postman ts:Ns -AM ts:0 al:postwomen -AM st:postwoman ts:Ns -AM st:preshrink ts:Vd -AM ts:0 al:preshrank al:preshrunk -AM st:presidium ts:Ns -AM ts:0 al:presidia -AM ts:0 al:pressmen -AM st:pressman ts:Ns -AM ts:0 al:prier al:priest -AM st:prex ts:Ns -AM ts:0 al:pricier al:priciest -AM st:pricey ts:0 -AM ts:0 st:prey -AM st:prey ts:0 -AM st:prognosis ts:Ns -AM ts:0 al:prognoses -AM st:prophylaxis ts:Ns -AM ts:0 al:prophylaxes -AM st:prosthesis ts:Ns -AM ts:0 al:prostheses -AM st:protozoon ts:Ns -AM ts:0 al:protozoa -AM st:pseudopodium ts:Ns -AM st:psychoneurosis ts:Ns -AM ts:0 al:psychoneuroses -AM st:psychosis ts:Ns -AM ts:0 al:psychoses -AM st:pubis ts:Ns's -AM st:pubis ts:Ns -AM ts:0 al:pubes al:pubes's -AM st:pudendum ts:Ns -AM ts:0 al:pudenda -AM st:pulis ts:Ns -AM ts:0 al:pi al:pi's -AM st:puttie ts:Vd -AM st:pylorus ts:Ns -AM ts:0 al:pylori -AM st:pyxis ts:Ns -AM st:quantum ts:Ns -AM ts:0 al:quanta -AM st:quarryman ts:Ns -AM ts:0 al:quarterstaves -AM st:quarterstaff ts:Ns -AM st:quotum ts:Ns's -AM st:quotum ts:Ns -AM st:radius ts:Ns -AM ts:0 al:radiomen -AM st:radioman ts:Ns -AM ts:0 al:radii -AM st:ragis ts:Ns -AM ts:0 al:railwaymen -AM st:railwayman ts:Ns -AM st:rakis ts:Ns -AM st:ring ts:Vd -AM st:run ts:Vd -AM st:Ron ts:Ns's -AM st:Ron ts:Ns -AM ts:0 al:rebound -AM ts:0 st:rebind -AM ts:0 al:redrew -AM st:redraw ts:Vd -AM ts:0 al:rove -AM ts:0 al:refroze al:refrozen -AM st:refreeze ts:Vd -AM st:regrow ts:Vd -AM ts:0 al:reground -AM st:regrind ts:Vd -AM ts:0 al:regrew -AM ts:0 al:rehung -AM st:rehang ts:Vd -AM st:remake ts:Vd -AM ts:0 al:remade -AM ts:0 al:repairmen -AM st:repairman ts:Ns -AM st:replicon ts:Ns's -AM st:replicon ts:Ns -AM st:rerun ts:Vd -AM ts:0 al:reran -AM st:resit ts:Vd -AM ts:0 al:resold -AM st:residuum ts:Ns -AM ts:0 al:residua -AM ts:0 al:resat -AM st:resell ts:Vd -AM ts:0 al:restrung -AM st:restring ts:Vd -AM ts:0 al:retook -AM st:reteach ts:Vd -AM ts:0 al:retaught -AM ts:0 al:retold -AM ts:0 al:rethought -AM st:rethink ts:Vd -AM ts:0 al:retying -AM st:retell ts:Vd -AM st:retake ts:Vd -AM ts:0 al:retrod al:retrodden -AM st:retread ts:Vd -AM st:retie ts:Vd -AM st:reversis ts:Ns -AM ts:0 al:rewove al:rewoven -AM ts:0 al:rewound -AM st:rewind ts:Vd -AM st:reweave ts:Vd -AM ts:0 al:rewrote -AM st:rewrite ts:Vd -AM st:rheum ts:Ns's -AM st:rheum ts:Ns -AM st:Rheum ts:Ns -AM ts:0 al:rhea al:rhea's -AM st:rex ts:Ns -AM ts:0 al:rode -AM ts:0 al:rives -AM ts:0 al:riflemen -AM st:rifleman ts:Ns -AM ts:0 al:rang al:rung -AM ts:0 al:rose -AM st:rife ts:Ns -AM st:ride ts:Vd -AM ts:0 al:Ra al:Ra's -AM ts:0 al:ropier al:ropiest -AM st:ropey ts:0 -AM st:rise ts:Vd -AM st:reeve ts:Vd -AM ts:0 al:ran -AM ts:0 st:ring -AM st:sacrum ts:Ns -AM ts:0 al:sacra -AM st:sadis ts:Ns -AM ts:0 al:saves -AM st:sagum ts:Ns's -AM st:sagum ts:Ns -AM st:sakis ts:Ns -AM ts:0 al:salesmen -AM st:salesman ts:Ns -AM st:salesperson ts:Ns's -AM st:salesperson ts:Ns -AM ts:0 al:salespeople al:salespeople's -AM ts:0 al:saleswomen -AM st:saleswoman ts:Ns -AM ts:0 al:sandmen -AM st:sandman ts:Ns -AM st:sing ts:Vd -AM st:sink ts:Vd -AM st:Sarum ts:Ns's -AM st:Sarum ts:Ns -AM st:sarcophagus ts:Ns -AM ts:0 al:sarcophagi -AM st:sarus ts:Ns's -AM st:sarus ts:Ns -AM st:satis ts:Ns -AM st:sit ts:Vd -AM st:safe ts:Ns -AM st:see ts:Vd -AM st:scaley ts:0 -AM ts:0 al:scarier al:scariest -AM st:scarey ts:0 -AM st:sclerosis ts:Ns -AM ts:0 al:scleroses -AM ts:0 al:Scotchmen -AM st:Scotchman ts:Ns -AM ts:0 al:Scotchwomen -AM st:Scotchwoman ts:Ns -AM ts:0 al:Scotsmen -AM st:Scotsman ts:Ns -AM ts:0 al:Scotswomen -AM st:Scotswoman ts:Ns -AM st:scrotum ts:Ns -AM ts:0 al:scrota -AM ts:0 al:seamen -AM st:seaman ts:Ns -AM ts:0 al:saw -AM ts:0 al:sought -AM ts:0 al:sod al:sodden -AM ts:0 al:selectmen -AM st:selectman ts:Ns -AM ts:0 al:sold -AM st:sepium ts:Ns's -AM st:sepium ts:Ns -AM st:septum ts:Ns -AM ts:0 al:septa -AM ts:0 al:servicemen -AM st:serviceman ts:Ns -AM ts:0 al:servicewomen -AM st:servicewoman ts:Ns -AM ts:0 al:shook -AM ts:0 al:should -AM st:shit ts:Vd -AM st:sheeney ts:0 -AM ts:0 al:shone -AM ts:0 al:shat -AM st:shine ts:Vd -AM st:shake ts:Vd -AM ts:0 al:shot -AM st:Shoshonis ts:Ns -AM ts:0 al:Shoshones -AM st:shoot ts:Vd -AM st:shall ts:Vd -AM ts:0 al:showmen -AM st:showman ts:Ns -AM st:shrink ts:Vd -AM ts:0 al:shrank al:shrunk al:shrunken -AM ts:0 al:sidemen -AM st:sideman ts:Ns -AM ts:0 al:signalmen -AM st:signalman ts:Ns -AM st:silicon ts:Ns's -AM st:silicon ts:Ns -AM ts:0 al:silica al:silica's -AM st:simulacrum ts:Ns -AM ts:0 al:simulacra -AM ts:0 al:sang al:sung -AM ts:0 al:sank al:sunk al:sunken -AM st:siris ts:Ns -AM st:Sus ts:Ns -AM ts:0 al:sat -AM ts:0 al:slew,146 -AM ts:0 al:slept -AM st:sleep ts:Vd -AM ts:0 st:slay -AM st:sley ts:0 -AM ts:0 al:slung -AM ts:0 al:slunk -AM st:sling ts:Vd -AM st:slink ts:Vd -AM ts:0 al:smote -AM ts:0 al:smokier al:smokiest -AM st:smokey ts:0 -AM st:smite ts:Vd -AM st:snakey ts:0 -AM ts:0 al:snowmen -AM st:snowman ts:Ns -AM ts:0 st:seethe -AM st:seethe ts:Vd -AM st:solarium ts:Ns -AM ts:0 al:solaria -AM st:sell ts:Vd -AM st:solidus ts:Ns -AM ts:0 al:solidi -AM st:seek ts:Vd -AM ts:0 al:spacemen -AM st:spaceman ts:Ns -AM ts:0 al:spacewomen -AM st:spacewoman ts:Ns -AM ts:0 al:spacier al:spaciest -AM st:spacey ts:0 -AM st:speak ts:Vd -AM st:spit ts:Vd -AM ts:0 al:spake al:spoke al:spoken -AM st:spectrum ts:Ns -AM ts:0 al:spectra -AM st:speed ts:Vd -AM ts:0 al:sped -AM ts:0 al:spellbound -AM st:spellbind ts:Vd -AM st:spermatozoon ts:Ns -AM ts:0 al:spermatozoa -AM st:spicey ts:0 -AM st:spikey ts:0 -AM ts:0 al:spun -AM ts:0 al:spat -AM st:splayfoot ts:Ns -AM ts:0 al:splayfeet -AM ts:0 al:spokesmen -AM st:spokesman ts:Ns -AM st:spokesperson ts:Ns -AM ts:0 al:spokespeople -AM ts:0 al:spokeswomen -AM st:spokeswoman ts:Ns -AM ts:0 al:sportsmen -AM st:sportsman ts:Ns -AM ts:0 al:sportswomen -AM st:sportswoman ts:Ns -AM ts:0 al:spotlit -AM st:spotlight ts:Vd -AM st:spring ts:Vd -AM ts:0 al:sprang al:sprung -AM st:spin ts:Vd -AM st:sputum ts:Ns -AM ts:0 al:sputa -AM ts:0 al:stablemen -AM st:stableman ts:Ns -AM ts:0 al:stagier al:stagiest -AM st:stagey ts:0 -AM ts:0 al:stood -AM st:stink ts:Vd -AM st:staphylococcus ts:Ns -AM ts:0 al:staphylococci -AM ts:0 al:statesmen -AM st:statesman ts:Ns -AM ts:0 al:stateswomen -AM st:stateswoman ts:Ns -AM ts:0 al:stove -AM ts:0 al:stole al:stolen -AM ts:0 al:steersmen -AM st:steersman ts:Ns -AM st:stegosaurus ts:Ns -AM ts:0 al:stegosauri -AM ts:0 al:stuck -AM st:stimulus ts:Ns -AM ts:0 al:stimuli -AM ts:0 al:stung -AM ts:0 al:stank al:stunk -AM st:steal ts:Vd -AM ts:0 al:stonier al:stoniest -AM st:stoney ts:0 -AM st:stand ts:Vd -AM st:stave ts:Vd -AM st:stratum ts:Ns -AM st:stratus ts:Ns -AM ts:0 al:strata -AM ts:0 al:strati -AM st:streptococcus ts:Ns -AM ts:0 al:streptococci -AM st:strike ts:Vd -AM ts:0 al:strode -AM ts:0 al:strives -AM ts:0 al:stricken al:struck -AM ts:0 al:strung -AM ts:0 al:strove -AM st:strife ts:Ns -AM st:stride ts:Vd -AM ts:0 al:strongmen -AM st:strongman ts:Ns -AM st:strive ts:Vd -AM st:string ts:Vd -AM st:stick ts:Vd -AM st:sting ts:Vd -AM ts:0 al:stuntmen -AM st:stuntman ts:Ns -AM st:stylus ts:Ns -AM ts:0 al:styli -AM st:substratum ts:Ns -AM ts:0 al:substrata -AM st:succubus ts:Ns -AM ts:0 al:succubi -AM ts:0 al:supermen -AM st:superman ts:Ns -AM ts:0 al:superwomen -AM st:superwoman ts:Ns -AM st:swim ts:Vd -AM ts:0 al:swore al:sworn -AM ts:0 al:swept -AM ts:0 al:swollen -AM st:sweep ts:Vd -AM ts:0 al:swam al:swum -AM ts:0 al:swung -AM st:swell ts:Vd -AM ts:0 al:swordsmen -AM st:swordsman ts:Ns -AM st:swear ts:Vd -AM st:swing ts:Vd -AM st:symbiosis ts:Ns -AM ts:0 al:symbioses -AM st:synapsis ts:Ns -AM st:synopsis ts:Ns -AM ts:0 al:synopses -AM st:synthesis ts:Ns -AM ts:0 al:syntheses -AM st:tackey ts:0 -AM ts:0 al:took -AM st:talus ts:Ns -AM ts:0 al:tali -AM st:tamis ts:Ns -AM st:Tamus ts:Ns's -AM st:Tamus ts:Ns -AM st:tantrum ts:Ns's -AM st:tantrum ts:Ns -AM ts:0 al:tantra al:tantra's -AM st:tapis ts:Ns -AM st:tarsus ts:Ns -AM ts:0 al:tarsi -AM st:tum ts:Ns -AM st:teach ts:Vd -AM st:tawney ts:0 -AM st:taxis ts:Ns -AM st:taxus ts:Ns's -AM ts:0 al:taxes -AM st:taxus ts:Ns -AM ts:0 al:taxmen -AM st:taxman ts:Ns -AM ts:0 al:taught -AM ts:0 al:tore al:torn -AM st:tooth ts:Ns -AM ts:0 al:told -AM st:terminus ts:Ns -AM ts:0 al:termini -AM st:testis ts:Ns -AM ts:0 al:testes -AM st:thalamus ts:Ns -AM ts:0 al:thalami -AM st:thesaurus ts:Ns -AM ts:0 al:thesauri -AM st:thesis ts:Ns -AM ts:0 al:theses -AM ts:0 al:thought -AM st:think ts:Vd -AM st:throw ts:Vd -AM st:thrombus ts:Ns -AM st:thrombosis ts:Ns -AM ts:0 al:thromboses -AM ts:0 al:thrombi -AM ts:0 al:threw -AM st:thunderstrike ts:Vd -AM ts:0 al:tying -AM st:tikis ts:Ns -AM st:titmouse ts:Ns -AM ts:0 al:titmice -AM st:tell ts:Vd -AM st:toney ts:0 -AM st:take ts:Vd -AM ts:0 al:teeth -AM st:tear ts:Vd -AM st:torus ts:Ns -AM ts:0 al:tori -AM ts:0 al:townsmen -AM st:townsman ts:Ns -AM ts:0 al:townswomen -AM st:townswoman ts:Ns -AM ts:0 al:tradesmen -AM st:tradesman ts:Ns -AM st:tradesperson ts:Ns's -AM st:tradesperson ts:Ns -AM ts:0 al:tradeswomen -AM st:tradeswoman ts:Ns -AM ts:0 al:trainmen -AM st:trainman ts:Ns -AM ts:0 al:trod al:trodden -AM ts:0 al:trenchermen -AM st:trencherman ts:Ns -AM ts:0 al:tribesmen -AM st:tribesman ts:Ns -AM ts:0 al:tribeswomen -AM st:tribeswoman ts:Ns -AM st:trivium ts:Ns's -AM st:trivium ts:Ns -AM ts:0 al:trivia al:trivia's -AM st:tread ts:Vd -AM ts:0 al:troubleshot -AM st:troubleshoot ts:Vd -AM ts:0 st:trie -AM ts:0 al:ta -AM st:tie ts:Vd -AM ts:0 al:typewrote -AM st:typewrite ts:Vd -AM st:umbilicus ts:Ns -AM ts:0 al:umbilici -AM ts:0 al:unbound -AM st:unbear ts:Vd -AM st:unbind ts:Vd -AM st:unclothe ts:Vd -AM ts:0 al:unclad -AM ts:0 al:underclassmen -AM st:underclassman ts:Ns -AM st:underfeed ts:Vd -AM ts:0 al:underfed -AM ts:0 al:underwent -AM st:underlie ts:Vd -AM ts:0 st:underlie -AM ts:0 al:underlain al:underlay al:underlying -AM ts:0 al:undersold -AM ts:0 al:undershot -AM st:undershoot ts:Vd -AM st:undersell ts:Vd -AM ts:0 al:understood -AM st:understand ts:Vd -AM ts:0 al:undertook -AM st:undertake ts:Vd -AM st:undergo ts:Vd -AM ts:0 al:underwrote -AM st:underwrite ts:Vd -AM ts:0 al:unfroze al:unfrozen -AM st:unfreeze ts:Vd -AM st:unmake ts:Vd -AM ts:0 al:unmade -AM st:unperson ts:Ns -AM ts:0 al:unpeople -AM st:unsell ts:Vd -AM st:unspeak ts:Vd -AM st:unstring ts:Vd -AM st:unstick ts:Vd -AM st:unteach ts:Vd -AM ts:0 al:untying -AM st:untread ts:Vd -AM st:untie ts:Vd -AM ts:0 al:unwound -AM st:unwind ts:Vd -AM st:unweave ts:Vd -AM st:uphold ts:Vd -AM ts:0 al:upheld -AM ts:0 al:upperclassmen -AM st:upperclassman ts:Ns -AM ts:0 st:upshoot -AM st:urinalysis ts:Ns -AM ts:0 al:urinalyses -AM ts:0 al:i -AM st:uterus ts:Ns -AM ts:0 al:uteri -AM st:valis ts:Ns -AM st:velum ts:Ns -AM ts:0 al:vela -AM ts:0 al:veniremen -AM st:venireman ts:Ns -AM st:venturis ts:Ns -AM ts:0 al:vestrymen -AM st:vestryman ts:Ns -AM ts:0 al:vying -AM st:villus ts:Ns -AM ts:0 al:villi -AM st:vison ts:Ns's -AM st:vison ts:Ns -AM st:viscus ts:Ns -AM ts:0 al:viscera -AM st:vivarium ts:Ns -AM ts:0 al:vivaria -AM st:vie ts:Vd -AM st:wadis ts:Ns -AM ts:0 al:wades -AM st:waitperson ts:Ns -AM ts:0 al:waitpeople -AM ts:0 al:woke al:woken -AM st:walis ts:Ns -AM ts:0 al:washerwomen -AM st:washerwoman ts:Ns -AM ts:0 al:watchmen -AM st:watchman ts:Ns -AM st:wavey ts:0 -AM ts:0 al:wore al:worn -AM ts:0 al:weathermen -AM st:weatherman ts:Ns -AM ts:0 al:wove al:woven -AM st:webfoot ts:Ns -AM ts:0 al:webfeet -AM ts:0 al:wept -AM ts:0 al:Welshmen -AM st:Welshman ts:Ns -AM st:go ts:Vd -AM st:weep ts:Vd -AM st:whiney ts:0 -AM ts:0 al:wives -AM ts:0 al:would al:wouldst -AM ts:0 al:won -AM ts:0 al:wound -AM st:winey ts:0 -AM ts:0 al:wost al:wot -AM ts:0 al:withdrew -AM st:withdraw ts:Vd -AM st:withhold ts:Vd -AM ts:0 al:withheld -AM ts:0 al:withstood -AM st:withstand ts:Vd -AM st:wife ts:Ns -AM st:wake ts:Vd -AM ts:0 al:women -AM st:woman ts:Ns -AM st:win ts:Vd -AM ts:0 al:woodmen -AM st:woodman ts:Ns -AM ts:0 al:woodsmen -AM st:woodsman ts:Ns -AM st:wear ts:Vd -AM ts:0 al:wrought -AM ts:0 al:workingmen -AM st:workingman ts:Ns -AM ts:0 al:workingwomen -AM st:workingwoman ts:Ns -AM ts:0 al:workmen -AM st:workman ts:Ns -AM st:ill ts:0 -AM st:wit ts:Vd -AM st:will ts:Vd -AM st:wind ts:Vd -AM st:weave ts:Vd -AM ts:0 al:wrung -AM ts:0 al:wrote -AM st:write ts:Vd -AM st:work ts:Vd -AM st:wring ts:Vd -AM ts:0 al:yachtsmen -AM st:yachtsman ts:Ns -AM ts:0 al:yachtswomen -AM st:yachtswoman ts:Ns -AM ts:0 al:yardmen -AM st:yardman ts:Ns -AM st:yum ts:Ns -AM ts:0 al:yeomen -AM st:yeoman ts:Ns -AM ts:0 al:ya -AM is:Ns -AM is:At -AM is:N's -AM is:Vd -AM is:Aness's -AM is:Vs -AM is:Ar -AM is:Nm's -AM is:Vg -AM is:Ns's -AM is:Aness is:s -AM is:Ay -AM is:Nm -AM is:Aness -AM is:'s -SET UTF-8 -TRY esianrtolcdugmphbyfvkwzESIANRTOLCDUGMPHBYFVKWZ' -WORDCHARS 0123456789'.-’ -NOSUGGEST 200 - -# ordinal numbers -COMPOUNDMIN 1 -# only in compounds: 1th, 2th, 3th -ONLYINCOMPOUND 300 -# compound rules: -# 1. [0-9]*1[0-9]th (10th, 11th, 12th, 56714th, etc.) -# 2. [0-9]*[02-9](1st|2nd|3rd|[4-9]th) (21st, 22nd, 123rd, 1234th, etc.) -COMPOUNDRULE 2 -COMPOUNDRULE (201)*(202)(203) -COMPOUNDRULE (201)*(204)(205) - -REP 94 -REP nt n't -REP alot a_lot -REP avengence a_vengeance -REP ninties 1990s -REP teached taught -REP rised rose -REP a ei -REP ei a -REP a ey -REP ey a -REP ai ie -REP ie ai -REP are air -REP are ear -REP are eir -REP air are -REP air ere -REP ere air -REP ere ear -REP ere eir -REP ear are -REP ear air -REP ear ere -REP eir are -REP eir ere -REP ch te -REP te ch -REP ch ti -REP ti ch -REP ch tu -REP tu ch -REP ch s -REP s ch -REP ch k -REP k ch -REP f ph -REP ph f -REP gh f -REP f gh -REP i igh -REP igh i -REP i uy -REP uy i -REP i ee -REP ee i -REP j di -REP di j -REP j gg -REP gg j -REP j ge -REP ge j -REP s ti -REP ti s -REP s ci -REP ci s -REP k cc -REP cc k -REP k qu -REP qu k -REP kw qu -REP o eau -REP eau o -REP o ew -REP ew o -REP oo ew -REP ew oo -REP ew ui -REP ui ew -REP oo ui -REP ui oo -REP ew u -REP u ew -REP oo u -REP u oo -REP u oe -REP oe u -REP u ieu -REP ieu u -REP ue ew -REP ew ue -REP uff ough -REP oo ieu -REP ieu oo -REP ier ear -REP ear ier -REP ear air -REP air ear -REP w qu -REP qu w -REP z ss -REP ss z -REP shun tion -REP shun sion -REP shun cion -SFX 123 N 1 -SFX 123 i 0 i 1815 -SFX 50 N 1 -SFX 50 0 lest . 1816 -SFX 137 N 1 -SFX 137 0 en . 1815 -SFX 124 N 1 -SFX 124 i 's i 1817 -SFX 72 N 1 -SFX 72 0 gest . 1816 -SFX 148 N 1 -SFX 148 0 Ted . 1818 -SFX 34 N 1 -SFX 34 y iness's y 1819 -SFX 65 N 1 -SFX 65 0 ded . 1818 -SFX 41 N 1 -SFX 41 0 led . 1818 -SFX 112 N 1 -SFX 112 0 zes . 1820 -SFX 69 N 1 -SFX 69 e den e 1818 -SFX 13 N 1 -SFX 13 0 ted . 1818 -SFX 67 N 1 -SFX 67 f ves f 1815 -SFX 52 N 1 -SFX 52 e ten e 1818 -SFX 63 N 1 -SFX 63 0 med . 1818 -SFX 136 N 1 -SFX 136 e ier e 1821 -SFX 47 N 1 -SFX 47 0 n . 1818 -SFX 4 N 1 -SFX 4 0 es . 1815 -SFX 145 N 1 -SFX 145 0 im's . 1822 -SFX 54 N 1 -SFX 54 0 ging . 1823 -SFX 62 N 1 -SFX 62 0 en . 1818 -SFX 149 N 1 -SFX 149 0 Ting . 1823 -SFX 115 N 1 -SFX 115 0 per . 1821 -SFX 55 N 1 -SFX 55 0 bing . 1823 -SFX 9 N 1 -SFX 9 e ing e 1823 -SFX 135 N 1 -SFX 135 0 ses's . 1824 -SFX 33 N 1 -SFX 33 0 ping . 1823 -SFX 25 N 1 -SFX 25 0 nesses . 1825 -SFX 103 N 1 -SFX 103 0 best . 1816 -SFX 36 N 1 -SFX 36 y ily y 1826 -SFX 31 N 1 -SFX 31 0 ally . 1826 -SFX 116 N 1 -SFX 116 0 pest . 1816 -SFX 98 N 1 -SFX 98 e ce e 1815 -SFX 94 N 1 -SFX 94 s es s 1815 -SFX 46 N 1 -SFX 46 x ces x 1815 -SFX 44 N 1 -SFX 44 0 king . 1823 -SFX 80 N 1 -SFX 80 y inesses y 1825 -SFX 27 N 1 -SFX 27 y ies y 1820 -SFX 7 N 1 -SFX 7 0 s . 1820 -SFX 28 N 1 -SFX 28 0 s's . 1824 -SFX 6 N 1 -SFX 6 0 ing . 1823 -SFX 97 N 1 -SFX 97 0 fest . 1816 -SFX 75 N 1 -SFX 75 0 ren . 1815 -SFX 109 N 1 -SFX 109 0 test . 1816 -SFX 99 N 1 -SFX 99 0 ta . 1815 -SFX 39 N 1 -SFX 39 0 ses . 1820 -SFX 11 N 1 -SFX 11 0 es . 1820 -SFX 134 N 1 -SFX 134 o id o 1818 -SFX 90 N 1 -SFX 90 0 fed . 1818 -SFX 83 N 1 -SFX 83 0 im . 1827 -SFX 60 N 1 -SFX 60 0 ned . 1818 -SFX 141 N 1 -SFX 141 0 ved . 1818 -SFX 70 N 1 -SFX 70 0 den . 1818 -SFX 85 N 1 -SFX 85 y ies's y 1824 -SFX 119 N 1 -SFX 119 y id y 1818 -SFX 68 N 1 -SFX 68 d t d 1818 -SFX 95 N 1 -SFX 95 0 allier . 1821 -SFX 21 N 1 -SFX 21 0 st . 1816 -SFX 30 N 1 -SFX 30 y iest y 1816 -SFX 110 N 1 -SFX 110 0 zes . 1815 -SFX 91 N 1 -SFX 91 0 fing . 1823 -SFX 128 N 1 -SFX 128 0 r . 1815 -SFX 92 N 1 -SFX 92 0 rer . 1821 -SFX 14 N 1 -SFX 14 0 ting . 1823 -SFX 106 N 1 -SFX 106 l t l 1818 -SFX 59 N 1 -SFX 59 0 i . 1815 -SFX 20 N 1 -SFX 20 0 r . 1821 -SFX 12 N 1 -SFX 12 0 ses . 1815 -SFX 18 N 1 -SFX 18 0 ness . 1828 -SFX 84 N 1 -SFX 84 e i e 1815 -SFX 10 N 1 -SFX 10 0 ly . 1826 -SFX 76 N 1 -SFX 76 0 e's . 1824 -SFX 139 N 1 -SFX 139 n 0 n 1815 -SFX 53 N 1 -SFX 53 0 ged . 1818 -SFX 24 N 1 -SFX 24 0 est . 1816 -SFX 79 N 1 -SFX 79 0 t . 1818 -SFX 131 N 1 -SFX 131 e t e 1818 -SFX 102 N 1 -SFX 102 0 ber . 1821 -SFX 17 N 1 -SFX 17 y ies y 1815 -SFX 37 N 1 -SFX 37 0 e . 1815 -SFX 126 N 1 -SFX 126 a or a 1815 -SFX 146 N 1 -SFX 146 y in y 1818 -SFX 74 N 1 -SFX 74 0 ser . 1821 -SFX 150 N 1 -SFX 150 t st t 1818 -SFX 40 N 1 -SFX 40 0 sing . 1823 -SFX 121 N 1 -SFX 121 e ia e 1815 -SFX 3 N 1 -SFX 3 0 s . 1815 -SFX 93 N 1 -SFX 93 o i's o 1824 -SFX 61 N 1 -SFX 61 0 ning . 1823 -SFX 32 N 1 -SFX 32 0 ped . 1818 -SFX 105 N 1 -SFX 105 0 nest . 1816 -SFX 132 N 1 -SFX 132 0 a . 1815 -SFX 29 N 1 -SFX 29 y ier y 1821 -SFX 140 N 1 -SFX 140 0 rest . 1816 -SFX 56 N 1 -SFX 56 0 der . 1821 -SFX 82 N 1 -SFX 82 0 st . 1818 -SFX 49 N 1 -SFX 49 0 ler . 1821 -SFX 45 N 1 -SFX 45 o i o 1815 -SFX 108 N 1 -SFX 108 0 thest . 1816 -SFX 81 N 1 -SFX 81 0 ter . 1821 -SFX 58 N 1 -SFX 58 0 x . 1815 -SFX 23 N 1 -SFX 23 0 er . 1821 -SFX 48 N 1 -SFX 48 s ntes s 1815 -SFX 89 N 1 -SFX 89 x ges x 1815 -SFX 118 N 1 -SFX 118 y own y 1818 -SFX 51 N 1 -SFX 51 e 0 e 1818 -SFX 127 N 1 -SFX 127 a ur a 1815 -SFX 86 N 1 -SFX 86 0 lier . 1821 -SFX 66 N 1 -SFX 66 0 ding . 1823 -SFX 73 N 1 -SFX 73 0 bed . 1818 -SFX 16 N 1 -SFX 16 0 ring . 1823 -SFX 57 N 1 -SFX 57 0 dest . 1816 -SFX 143 N 1 -SFX 143 e iest e 1816 -SFX 138 N 1 -SFX 138 0 es's . 1824 -SFX 15 N 1 -SFX 15 0 red . 1818 -SFX 122 N 1 -SFX 122 e ia's e 1824 -SFX 111 N 1 -SFX 111 0 zed . 1818 -SFX 64 N 1 -SFX 64 0 ming . 1823 -SFX 1 N 1 -SFX 1 0 's . 1829 -SFX 133 N 1 -SFX 133 0 t . 1815 -SFX 78 N 1 -SFX 78 0 mest . 1816 -SFX 87 N 1 -SFX 87 0 liest . 1816 -SFX 142 N 1 -SFX 142 0 ving . 1823 -SFX 77 N 1 -SFX 77 0 mer . 1821 -SFX 125 N 1 -SFX 125 a i a 1815 -SFX 104 N 1 -SFX 104 0 ner . 1821 -SFX 2 N 1 -SFX 2 0 's . 1817 -SFX 120 N 1 -SFX 120 o ines o 1815 -SFX 117 N 1 -SFX 117 y ew y 1818 -SFX 35 N 1 -SFX 35 y iness y 1828 -SFX 129 N 1 -SFX 129 0 er . 1815 -SFX 26 N 1 -SFX 26 y ied y 1818 -SFX 19 N 1 -SFX 19 0 ness's . 1819 -SFX 101 N 1 -SFX 101 0 th . 1818 -SFX 8 N 1 -SFX 8 0 d . 1818 -SFX 43 N 1 -SFX 43 0 ked . 1818 -SFX 22 N 1 -SFX 22 e y e 1826 -SFX 114 N 1 -SFX 114 e d e 1818 -SFX 38 N 1 -SFX 38 0 sed . 1818 -SFX 147 N 1 -SFX 147 0 ist . 1816 -SFX 5 N 1 -SFX 5 0 ed . 1818 -SFX 107 N 1 -SFX 107 0 ther . 1821 -SFX 130 N 1 -SFX 130 a e a 1815 -SFX 96 N 1 -SFX 96 0 fer . 1821 -SFX 88 N 1 -SFX 88 s des s 1815 -SFX 100 N 1 -SFX 100 0 ne . 1818 -SFX 42 N 1 -SFX 42 0 ling . 1823 -SFX 144 N 1 -SFX 144 y ith y 1818 -SFX 113 N 1 -SFX 113 0 zing . 1823 -SFX 71 N 1 -SFX 71 0 ger . 1821 - -BREAK 3 -BREAK — -BREAK – -BREAK - - -ICONV 6 -ICONV ’ ' -ICONV ffi ffi -ICONV ffl ffl -ICONV ff ff -ICONV fi fi -ICONV fl fl - -OCONV 1 -OCONV ' ’ - -# PHONEtic_english.h - #PHONEtic transformation rules for use with #PHONEtic.c -# Copyright (C) 2000 Björn Jacke -# -# This rule set is based on Lawrence Phillips original metaPHONE -# algorithm with modifications made by Michael Kuhn in his -# C implantation, more modifications by Björn Jacke when -# converting the algorithm to a rule set and minor -# touch ups by Kevin Atkinson -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License version 2.1 as published by the Free Software Foundation; -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# Björn Jacke may be reached by email at bjoern.jacke@gmx.de -# -# Changelog: -# -# 2000-01-05 Björn Jacke -# - first version with translation rules derived from -# metaPHONE.cc distributed with aspell 0.28.3 -# - "TH" is now representated as "@" because "0" is a -# meta character -# - removed TH(!vowel) --> T; always use TH --> # instead -# - dropped "^AE" -> "E" (redundant) -# - "ing" is transformed to "N", not "NK" -# - "SCH(EO)" transforms to "SK" now -# - added R --> SILENT if (after a vowel) and no (vowel or -# "y" follows) like in "Marcy" or "abort" -# - H is SILENT in RH at beginning of words -# - H is SILENT if vowel leads and "Y" follows -# - some ".OUGH.." --> ...F exceptions added -# - "^V" transforms to "W" -# 2000-01-07 Kevin Atkinson -# Converted from header to data file. -# -# 2007-08-23 László Németh -# Add PHONE header and #PHONE keywords -# -# 2010-03-09 László Németh -# Temporarily removing acuted character É -# because of the missing UTF-8 support -# -# version 1.1 - -# Documentation: http://aspell.net/man-html/PHONEtic-Code.html - -PHONE 104 -PHONE AH(AEIOUY)-^ *H -PHONE AR(AEIOUY)-^ *R -PHONE A(HR)^ * -PHONE A^ * -PHONE AH(AEIOUY)- H -PHONE AR(AEIOUY)- R -PHONE A(HR) _ -PHONE BB- _ -PHONE B B -PHONE CQ- _ -PHONE CIA X -PHONE CH X -PHONE C(EIY)- S -PHONE CK K -PHONE COUGH^ KF -PHONE CC< C -PHONE C K -PHONE DG(EIY) K -PHONE DD- _ -PHONE D T -PHONE EH(AEIOUY)-^ *H -PHONE ER(AEIOUY)-^ *R -PHONE E(HR)^ * -PHONE ENOUGH^$ *NF -PHONE E^ * -PHONE EH(AEIOUY)- H -PHONE ER(AEIOUY)- R -PHONE E(HR) _ -PHONE FF- _ -PHONE F F -PHONE GN^ N -PHONE GN$ N -PHONE GNS$ NS -PHONE GNED$ N -PHONE GH(AEIOUY)- K -PHONE GH _ -PHONE GG9 K -PHONE G K -PHONE H H -PHONE IH(AEIOUY)-^ *H -PHONE IR(AEIOUY)-^ *R -PHONE I(HR)^ * -PHONE I^ * -PHONE ING6 N -PHONE IH(AEIOUY)- H -PHONE IR(AEIOUY)- R -PHONE I(HR) _ -PHONE J K -PHONE KN^ N -PHONE KK- _ -PHONE K K -PHONE LAUGH^ LF -PHONE LL- _ -PHONE L L -PHONE MB$ M -PHONE MM M -PHONE M M -PHONE NN- _ -PHONE N N -PHONE OH(AEIOUY)-^ *H -PHONE OR(AEIOUY)-^ *R -PHONE O(HR)^ * -PHONE O^ * -PHONE OH(AEIOUY)- H -PHONE OR(AEIOUY)- R -PHONE O(HR) _ -PHONE PH F -PHONE PN^ N -PHONE PP- _ -PHONE P P -PHONE Q K -PHONE RH^ R -PHONE ROUGH^ RF -PHONE RR- _ -PHONE R R -PHONE SCH(EOU)- SK -PHONE SC(IEY)- S -PHONE SH X -PHONE SI(AO)- X -PHONE SS- _ -PHONE S S -PHONE TI(AO)- X -PHONE TH @ -PHONE TCH-- _ -PHONE TOUGH^ TF -PHONE TT- _ -PHONE T T -PHONE UH(AEIOUY)-^ *H -PHONE UR(AEIOUY)-^ *R -PHONE U(HR)^ * -PHONE U^ * -PHONE UH(AEIOUY)- H -PHONE UR(AEIOUY)- R -PHONE U(HR) _ -PHONE V^ W -PHONE V F -PHONE WR^ R -PHONE WH^ W -PHONE W(AEIOU)- W -PHONE X^ S -PHONE X KS -PHONE Y(AEIOU)- Y -PHONE ZZ- _ -PHONE Z S - -#The rules in a different view: -# -# Exceptions: -# -# Beginning of word: "gn", "kn-", "pn-", "wr-" ----> drop first letter -# "Aebersold", "Gnagy", "Knuth", "Pniewski", "Wright" -# -# Beginning of word: "x" ----> change to "s" -# as in "Deng Xiaopeng" -# -# Beginning of word: "wh-" ----> change to "w" -# as in "Whalen" -# Beginning of word: leading vowels are transformed to "*" -# -# "[crt]ough" and "enough" are handled separately because of "F" sound -# -# -# A --> A at beginning -# _ otherwise -# -# B --> B unless at the end of word after "m", as in "dumb", "McComb" -# -# C --> X (sh) if "-cia-" or "-ch-" -# S if "-ci-", "-ce-", or "-cy-" -# SILENT if "-sci-", "-sce-", or "-scy-", or "-cq-" -# K otherwise, including in "-sch-" -# -# D --> K if in "-dge-", "-dgy-", or "-dgi-" -# T otherwise -# -# E --> A at beginnig -# _ SILENT otherwise -# -# F --> F -# -# G --> SILENT if in "-gh-" and not at end or before a vowel -# in "-gn" or "-gned" or "-gns" -# in "-dge-" etc., as in above rule -# K if before "i", or "e", or "y" if not double "gg" -# -# K otherwise (incl. "GG"!) -# -# H --> SILENT if after vowel and no vowel or "Y" follows -# or after "-ch-", "-sh-", "-ph-", "-th-", "-gh-" -# or after "rh-" at beginning -# H otherwise -# -# I --> A at beginning -# _ SILENT otherwise -# -# J --> K -# -# K --> SILENT if after "c" -# K otherwise -# -# L --> L -# -# M --> M -# -# N --> N -# -# O --> A at beginning -# _ SILENT otherwise -# -# P --> F if before "h" -# P otherwise -# -# Q --> K -# -# R --> SILENT if after vowel and no vowel or "Y" follows -# R otherwise -# -# S --> X (sh) if before "h" or in "-sio-" or "-sia-" -# SK if followed by "ch(eo)" (SCH(EO)) -# S otherwise -# -# T --> X (sh) if "-tia-" or "-tio-" -# 0 (th) if before "h" -# silent if in "-tch-" -# T otherwise -# -# U --> A at beginning -# _ SILENT otherwise -# -# V --> V if first letter of word -# F otherwise -# -# W --> SILENT if not followed by a vowel -# W if followed by a vowel -# -# X --> KS -# -# Y --> SILENT if not followed by a vowel -# Y if followed by a vowel -# -# Z --> S - diff --git a/vendor/dictionaries/en_US.dic b/vendor/dictionaries/en_US.dic deleted file mode 100644 index 84132e5..0000000 --- a/vendor/dictionaries/en_US.dic +++ /dev/null @@ -1,52895 +0,0 @@ -52890 -A/1 1 -AA/2 1 -AAA -Aachen -aah 1 -Aaliyah/3 -aardvark/1 1 -Aaron -ab -AB/2 1 -ABA -aback 1 -abacus/4 1 -abaft 1 -abalone/1 1 -abandon/5 1 -abandoned 1 -abandonment/2 1 -abase/6 1 -abasement/2 1 -abash/7 1 -abashed/8 1 -abashment/2 1 -abate/6 1 -abatement/2 1 -abates 2 -abattoir/1 1 -Abbas -Abbasid 1 -abbe/1 1 -abbes/9 1 -abbess/4 1 -abbey/1 1 -abbot/1 1 -Abbott/3 -abbr -abbrev/10 1 -abbreviate/6 1 -abbreviation/1 1 -Abby/3 -ABC/1 1 -abdicate/6 1 -abdication/1 1 -abdomen/1 1 -abdominal 1 -abduct/11 1 -abduction/1 1 -abductor/1 1 -Abdul/3 -Abe/3 -abeam 1 -abed 1 -Abel/2 1 -Abelard -Abelson/3 -Aberdeen/2 1 -Abernathy/3 -aberrant 1 -aberration/1 1 -aberrational -abet/12 1 -abetter/1 1 -abettor/1 1 -abeyance/2 1 -abhor/13 1 -abhorrence/2 1 -abhorrent/8 1 -abidance/2 1 -abide/14 3 -abiding/8 1 -Abidjan/2 1 -Abigail -Abilene -ability/15 1 -abject/16 1 -abjection/2 1 -abject 1 -abjuration/1 1 -abjuratory -abjure/6 1 -abjurer/1 1 -ablate/6 1 -ablation/1 1 -ablative/1 1 -ablaze 1 -able/17 1 -abloom 1 -ablution/1 1 -ABM/1 1 -abnegate/6 1 -abnegation/2 1 -Abner/3 -abnormal/8 1 -abnormality/15 1 -abnormal 1 -aboard 1 -abode/18 4 -abolish/7 1 -abolition/2 1 -abolitionism/2 1 -abolitionist/1 1 -abominable/19 1 -abominate/6 1 -abomination/1 1 -aboriginal/1 1 -aborigine/1 1 -Aborigine/1 1 -aborning -abort/11 1 -abortion/1 1 -abortionist/1 1 -abortive/8 1 -abound/11 1 -abounding 1 -about 1 -above/2 1 -aboveboard -above 1 -abracadabra/2 1 -abrade/6 1 -Abraham/2 1 -Abram/3 -Abrams -abrasion/1 1 -abrasive/20 1 -abrasively -abreast 1 -abridge/6 1 -abridgment/1 1 -abroad 1 -abrogate/6 1 -abrogation/1 1 -abrogator/1 1 -abrupt/21 1 -ABS -abs/2 1 -Absalom -abscess/22 1 -abscissa/1 1 -abscission/2 1 -abscond/11 1 -absconder/1 1 -abseil/23 1 -abseiler 1 -abseiling 1 -absence/1 1 -absent/24 1 -absentee/1 1 -absenteeism/2 1 -absentminded/16 1 -absinth/2 1 -absinthe/2 1 -absolute/25 1 -absolution/2 1 -absolutism/2 1 -absolutist/1 1 -absolve/6 1 -absorb/11 1 -absorbed 1 -absorbency/2 1 -absorbent/1 1 -absorber/10 1 -absorbing/8 1 -absorption/1 1 -absorptive 1 -absorptivity 1 -abstain/11 1 -abstainer/1 1 -abstemious/16 1 -abstention/1 1 -abstinence/2 1 -abstinent 1 -abstract/26 1 -abstracted/16 1 -abstracter 1 -abstraction/1 1 -abstruse/27 1 -absurd/21 1 -absurdity/15 1 -absurd 1 -Abuja -abundance/1 1 -abundant/8 1 -abuse/28 1 -abuser/1 1 -abusive/16 1 -abut/12 1 -abutment/1 1 -abuzz 1 -abysmal/8 1 -abyss/4 1 -abyssal 1 -Abyssinia/2 1 -Abyssinian/2 1 -ac -Ac/2 1 -AC/2 1 -acacia/1 1 -academe/2 1 -academia/2 1 -academic/1 1 -academical/8 1 -academician/1 1 -academy/15 1 -Acadia/2 1 -acanthus/4 1 -Acapulco/2 1 -accede/6 1 -accelerate/6 1 -accelerated 1 -acceleration/1 1 -accelerator/1 1 -accelerometer/10 1 -accent/23 1 -accentual 1 -accentuate/6 1 -accentuation/2 1 -Accenture/3 -accept/11 1 -acceptability/2 1 -acceptable/29 1 -acceptance/1 1 -acceptation/1 1 -accepted 1 -acceptor/10 1 -access/22 1 -accessibility/2 1 -accessible/19 1 -accession/23 1 -accessorize/6 1 -accessory/15 1 -accidence 1 -accident/1 1 -accidental/30 1 -acclaim/23 1 -acclamation/1 1 -acclimate/6 1 -acclimation/2 1 -acclimatisation 1 -acclimatise/6 1 -acclimatization/2 1 -acclimatize/6 1 -acclivity/15 1 -accolade/18 1 -accommodate/6 1 -accommodating/8 1 -accommodation/1 1 -accompaniment/1 1 -accompanist/1 1 -accompany/31 1 -accomplice/1 1 -accomplish/7 1 -accomplishment/1 1 -accord/23 1 -accordance/2 1 -accordant 1 -according/8 1 -accordion/1 1 -accordionist/1 1 -accost/23 1 -account/23 1 -accountability/2 1 -accountable 1 -accountancy/2 1 -accountant/1 1 -accounting/2 1 -accouter/11 1 -accouterments -accouterments's -accoutre/6 1 -accoutrement/32 1 -Accra/2 1 -accredit/11 1 -accreditation/2 1 -accreted -accretion/1 1 -accrual/1 1 -accrue/6 1 -acct -acculturate/6 1 -acculturation/2 1 -accumulate/6 1 -accumulation/1 1 -accumulative 1 -accumulator/1 1 -accuracy/15 1 -accurate/16 1 -accursed/33 1 -accurst 1 -accusal 1 -accusation/1 1 -accusative/1 1 -accusatory -accuse/6 1 -accuser/1 1 -accusing/8 1 -accustom/11 1 -accustomed 1 -ace/28 1 -acerbate/6 1 -acerbic -acerbically -acerbity/2 1 -aces 5 -acetaminophen/2 1 -acetate/1 1 -acetic -acetone/2 1 -acetonic -ace 1 -acetylene/2 1 -Acevedo/3 -Achaean/2 1 -ache/28 1 -Achebe/3 -achene/1 1 -Achernar -Acheson/3 -achievable -achieve/6 1 -achievement/1 1 -achiever/1 1 -Achilles/2 1 -aching/8 1 -achoo/3 -achromatic 1 -achy/34 1 -acid/30 1 -acidic -acidification 1 -acidify/31 1 -acidity/2 1 -acidophiles -acidosis/2 1 -acidulous 1 -acknowledge/6 1 -acknowledged 1 -acknowledgment/1 1 -ACLU -acme/1 1 -acne/2 1 -acolyte/1 1 -Aconcagua/2 1 -aconite/1 1 -acorn/1 1 -Acosta/3 -acoustic/32 1 -acoustical/8 1 -acquaint/11 1 -acquaintance/1 1 -acquaintanceship/2 1 -acquainted 1 -acquiesce/6 1 -acquiescence/2 1 -acquiescent/8 1 -acquirable -acquire/6 1 -acquirement/2 1 -acquirer/10 1 -acquisition/1 1 -acquisitive/16 1 -acquit/12 1 -acquittal/1 1 -acquittance 1 -acre/1 1 -acreage/1 1 -acrid/21 1 -acridity/2 1 -acrimonious/16 1 -acrimony/2 1 -acrobat/1 1 -acrobatic/35 1 -acronym/1 1 -acrophobia/2 1 -Acropolis -acropolis/4 1 -across 1 -acrostic/1 1 -Acrux/3 -acrylic/1 1 -ACT -act/23 1 -Actaeon 1 -ACTH/2 1 -acting/2 1 -actinides -actinium/2 1 -action/18 1 -actionable 1 -activate/6 1 -activation/1 1 -activator/1 1 -active/36 1 -activism/2 1 -activist/1 1 -activity/15 1 -Acton -actor/1 1 -actress/4 1 -Acts -actual/8 1 -actuality/15 1 -actualization/2 1 -actualize/6 1 -actual 1 -actuarial 1 -actuary/15 1 -actuate/6 1 -actuation/2 1 -actuator/1 1 -Acuff/3 -acuity/2 1 -acumen/2 1 -acupressure/2 1 -acupuncture/2 1 -acupuncturist/1 1 -acute/25 1 -acyclic 1 -acyclovir/2 1 -ad/1 1 -AD/2 1 -Ada/1 1 -adage/1 1 -adagio/1 1 -Adam/1 1 -adamant/37 1 -Adan/3 -Adana -adapt/11 1 -adaptability/2 1 -adaptable 1 -adaptation/1 1 -adapted 1 -adapter/1 1 -adaption/10 1 -adaptive/8 1 -adaptivity 1 -Adar/2 1 -ADC -ADD -add/11 1 -addable 1 -Addams -added 1 -addend/1 1 -addenda 6 -addendum/2 7 -adder/1 1 -Adderley/3 -addible 1 -addict/23 1 -addicted 1 -addiction/1 1 -addictive -addictiveness -Addie/3 -Addison -addition/1 1 -additional/8 1 -additive/30 1 -addle/6 1 -addling 1 -address/22 1 -addressable -addressee/1 1 -adduce/6 1 -Adela/3 -Adelaide/2 1 -Adele/3 -Adeline/3 -Aden/2 1 -Adenauer -adenine/2 1 -adenoid/1 1 -adenoidal -adept/38 1 -adequacy/2 1 -adequate/16 1 -Adhara/3 -adhere/6 1 -adherence/2 1 -adherent/1 1 -adherer/10 1 -adhesion/2 1 -adhesive/20 1 -adiabatic/39 1 -Adidas/3 -adieu/1 1 -adios 1 -adipose 1 -Adirondack/3 -Adirondacks/2 1 -adj -adjacency/2 1 -adjacent/8 1 -adjectival/8 1 -adjective/1 1 -adjoin/11 1 -adjourn/11 1 -adjournment/1 1 -adjudge/6 1 -adjudicate/6 1 -adjudication/1 1 -adjudicative -adjudicator/1 1 -adjudicatory -adjunct/1 1 -adjuration/1 1 -adjure/6 1 -adjust/11 1 -adjustable 1 -adjuster/1 1 -adjustment/1 1 -adjustor/1 1 -adjutant/1 1 -Adkins/3 -Adler -Adm -adman/2 8 -admen 9 -admin/10 1 -administer/11 1 -administrate/6 1 -administration/1 1 -administrative/8 1 -administrator/1 1 -admirable/19 1 -admiral/1 1 -admiralty/2 1 -Admiralty 1 -admiration/2 1 -admire/6 1 -admirer/1 1 -admiring/8 1 -admissibility/2 1 -admissible/19 1 -admission/1 1 -admit/12 1 -admittance/1 1 -admitted/8 1 -admix/7 1 -admixture/1 1 -admonish/7 1 -admonishing 1 -admonishment/1 1 -admonition/1 1 -admonitory 1 -ado/2 1 -adobe/1 1 -adolescence/1 1 -adolescent/1 1 -Adolf/3 -Adolfo/3 -Adolph/3 -Adonis/4 1 -adopt/11 1 -adoptable -adopter/1 1 -adoption/1 1 -adoptive 1 -adorable/29 1 -adoration/2 1 -adore/6 1 -adorer/1 1 -adoring/8 1 -adorn/11 1 -adornment/1 1 -ADP/2 1 -adrenal/1 1 -Adrenalin/1 1 -adrenalin/2 1 -adrenaline/2 1 -Adrian -Adriana/3 -Adriatic/2 1 -Adrienne/3 -adrift 1 -adroit/21 1 -adsorb/11 1 -adsorbent/1 1 -adsorption/1 1 -adulate/6 1 -adulation/2 1 -adulator/1 1 -adulatory -adult/1 1 -adulterant/1 1 -adulterate/6 1 -adulteration/1 1 -adulterer/1 1 -adulteress/4 1 -adulterous 1 -adultery/15 1 -adulthood/2 1 -adult 1 -adumbrate/6 1 -adumbration/2 1 -adv -advance/28 1 -advancement/1 1 -advance 1 -advancing 1 -advantage/28 1 -advantageous/8 1 -advent/1 1 -Advent/1 1 -Adventist/1 1 -adventitious/8 1 -adventure/28 1 -adventurer/1 1 -adventures/9 1 -adventuresome 1 -adventuress/4 1 -adventurism 1 -adventurist/10 1 -adventurous/16 1 -adverb/1 1 -adverbial/30 1 -adversarial -adversary/15 1 -adverse/27 1 -adversity/15 1 -advert/23 1 -advertise/6 1 -advertisement/1 1 -advertiser/1 1 -advertising/2 1 -advertize/6 1 -advertizement/1 1 -advertorial/1 1 -advice/1 1 -Advil/2 1 -advisability/2 1 -advisable/19 1 -advise/6 1 -advised/8 1 -advisement/2 1 -adviser/1 1 -advisory/15 1 -advocacy/2 1 -advocate/28 1 -advt -adz/40 1 -adze/18 1 -Aegean/2 1 -aegis/2 1 -Aelfric/3 -Aeneas/2 1 -Aeneid/2 1 -aeolian 1 -Aeolus/2 1 -aeon/1 1 -aerate/6 1 -aeration/2 1 -aerator/1 1 -aerial/30 1 -aerialist/1 1 -aerie/41 1 -aerobatic/32 1 -aerobic/35 1 -aerobraking -aerodrome/1 1 -aerodynamic/32 1 -aerodynamically -Aeroflot/3 -aerogram/10 1 -aerogramme/10 1 -aeronautic/32 1 -aeronautical 1 -aerosol/1 1 -aerospace/2 1 -aery/42 1 -Aeschylus/2 1 -Aesculapius/2 1 -Aesop/2 1 -aesthete/10 1 -aesthetic/32 1 -aesthetically -aestheticism/2 1 -aether 1 -aetiology 1 -AF -AFAIK/10 1 -afar 1 -AFB -AFC -AFDC -affability/2 1 -affable/17 1 -affair/1 1 -affect/23 1 -affectation/1 1 -affected/8 1 -affecting/8 1 -affection/18 1 -affectionate/8 1 -affective -afferent 1 -affiance/43 1 -affidavit/1 1 -affiliate/28 1 -affiliation/1 1 -affine 1 -affinity/15 1 -affirm/11 1 -affirmation/1 1 -affirmative/30 1 -affix/22 1 -afflatus/2 1 -afflict/11 1 -afflicted 1 -afflicting 1 -affliction/1 1 -affluence/2 1 -affluent/8 1 -afford/11 1 -affordability 1 -affordable -afforest/11 1 -afforestation/2 1 -affray/18 1 -affront/23 1 -affronted 1 -affronting 1 -afghan/1 1 -Afghan/1 1 -Afghanistan/2 1 -Afghan 1 -aficionado/1 1 -afield 1 -afire 1 -aflame 1 -afloat 1 -aflutter -AFN -afoot 1 -aforementioned -aforesaid -aforethought 1 -afoul 1 -Afr -afraid 1 -afresh 1 -Africa/2 1 -African/1 1 -Afrikaans/2 1 -Afrikaner/1 1 -Afro/1 1 -Afrocentric -Afrocentrism 1 -AFT -aft/44 1 -after/10 1 -afterbirth/1 1 -afterburner/1 1 -aftercare/2 1 -aftereffect/1 1 -afterglow/1 1 -afterimage/1 1 -afterlife/2 10 -afterlives 11 -aftermarket/1 1 -aftermath/1 1 -afternoon/1 1 -aftershave/1 1 -aftershock/1 1 -aftertaste/1 1 -afterthought/1 1 -afterward 1 -afterword/1 1 -Ag/2 1 -against -again 1 -Agamemnon/2 1 -Agana -agape/2 1 -agar/2 1 -Agassi/3 -Agassiz/3 -agate/1 1 -Agatha/3 -agave/2 1 -age/28 1 -aged 1 -ageism/2 1 -ageist/1 1 -ageless/33 1 -agelessly -ageless 1 -agency/15 1 -agenda/1 1 -agenda's 12 -agenda 13 -agent/18 1 -ageratum/2 1 -Aggie 1 -agglomerate/28 1 -agglomeration/1 1 -agglutinate/6 1 -agglutination/1 1 -agglutinative -aggrandize/6 1 -aggrandizement/2 1 -aggravate/6 1 -aggravating/8 1 -aggravation/1 1 -aggregate/28 1 -aggregation/1 1 -aggression/1 1 -aggressive/16 1 -aggressor/1 1 -aggrieve/6 1 -aggrieved/8 1 -aggro 1 -aghast 1 -agile/45 1 -agility/2 1 -aging/1 1 -agism 1 -agitate/6 1 -agitated/8 1 -agitation/1 1 -agitator/1 1 -agitprop/2 1 -Aglaia -agleam 1 -aglitter -aglow 1 -Agnes -Agnew/3 -Agni/2 1 -agnostic/1 1 -agnosticism/2 1 -agog 1 -agonize/6 1 -agonized 1 -agonizing/8 1 -agony/15 1 -agoraphobia/2 1 -agoraphobic/1 1 -ago 1 -agouti 1 -Agra -agrarian/1 1 -agrarianism/2 1 -agrarian 1 -agree/46 1 -agreeable/29 1 -agreeing 1 -agreement/1 1 -agribusiness/3 -agribusinesses -Agricola -agricultural/8 1 -agriculturalist/1 1 -agriculture/2 1 -agriculturist/1 1 -Agrippa/2 1 -Agrippina/3 -agrochemical/10 1 -agronomic 1 -agronomist/1 1 -agronomy/2 1 -aground 1 -Aguascalientes -ague/2 1 -Aguilar/3 -Aguinaldo/3 -Aguirre/3 -Agustin/3 -ah -Ahab/2 1 -aha 1 -ahchoo -ahead 1 -ahem 1 -Ahmad/3 -Ahmadabad -Ahmadinejad/3 -Ahmed/3 -ahoy 1 -Ahriman/2 1 -AI/1 1 -aid/23 1 -Aida/3 -aide/28 1 -aider/10 1 -AIDS/4 1 -aigrette/1 1 -Aiken -ail/5 1 -Aileen/3 -aileron/1 1 -ailing 1 -ailment/1 1 -aim/23 1 -Aimee/3 -aimless/16 1 -ain't -Ainu 1 -air/23 1 -airbag/1 1 -airbase/1 1 -airbed -airbeds -airborne 1 -airbrush/22 1 -airbus/4 1 -aircraft/2 1 -aircraftman 14 -aircraftmen 15 -aircrew/10 1 -airdrome/10 1 -airdrop/47 1 -Airedale/1 1 -airfare/1 1 -airfield/1 1 -airflow/2 1 -airfoil/1 1 -airframe/10 1 -airfreight/2 1 -airgun/10 1 -airhead/1 1 -airing/1 1 -airlessness/3 -airless 1 -airletter -airletters -airlift/23 1 -airline/48 1 -airliner/1 1 -airlock/1 1 -airmail/23 1 -airman/2 16 -airmen 17 -airplane/1 1 -airplay/2 1 -airport/1 1 -airship/1 1 -airshow/10 1 -airsick/33 1 -airspace/2 1 -airspeed 1 -airstream 1 -airstrike/1 1 -airstrip/1 1 -airtight 1 -airtime/2 1 -air 1 -airwaves -airwaves's -airway/1 1 -airwoman 18 -airwomen 19 -airworthy/49 1 -airy/50 1 -Aisha -aisle/18 1 -aitch/4 1 -ajar 1 -Ajax/2 1 -AK -aka -Akbar -Akhmatova/3 -Akihito -akimbo -akin 1 -Akita 1 -Akiva/3 -Akkad -Akron/2 1 -AL -Al/2 1 -Ala -Alabama/2 1 -Alabaman/1 1 -Alabamian/1 1 -alabaster/2 1 -alack 1 -alacrity/2 1 -Aladdin/2 1 -Alamo/2 1 -Alamogordo/3 -Alan/3 -Alana/3 -alanine 1 -Alar/2 1 -Alaric -alarm/23 1 -alarmed 1 -alarming/8 1 -alarmist/1 1 -Alas -Alaska/2 1 -Alaskan/1 1 -alas 1 -alb/1 1 -Alba -albacore/1 1 -Albania/2 1 -Albanian/1 1 -Albany/2 1 -albatross/4 1 -albedo 1 -Albee -albeit -Alberio/3 -Albert -Alberta/2 1 -Albertan 1 -Alberto/3 -Albigensian 1 -albinism/2 1 -albino/1 1 -Albion -Albireo/3 -album/1 1 -albumen/2 1 -albumin/2 1 -albuminous -Albuquerque/2 1 -Alcatraz -Alcestis -alchemical 1 -alchemist/1 1 -alchemy/2 1 -Alcibiades -Alcindor/3 -Alcmena/3 -Alcoa/3 -alcohol/1 1 -alcoholic/51 1 -alcoholism/2 1 -Alcott -alcove/1 1 -Alcuin -Alcyone -Aldan -Aldebaran/2 1 -aldehyde 1 -Alden -alder/1 1 -Alderamin/3 -alderman/2 20 -aldermen 21 -alderwoman/2 22 -alderwomen 23 -Aldo/3 -Aldrin/3 -ale/1 1 -aleatory -Alec/3 -alehouse/1 1 -Aleichem/3 -Alejandra/3 -Alejandro/3 -Alembert/3 -alembic/1 1 -Aleppo/2 1 -alert/52 1 -Aleut/1 1 -Aleutian/1 1 -alewife/2 24 -alewives 25 -Alex/3 -Alexander/1 1 -Alexandra -Alexandria/2 1 -Alexandrian 1 -Alexei/3 -Alexis -alfalfa/2 1 -Alfonso/3 -Alfonzo/3 -Alford/3 -Alfred -Alfreda/3 -Alfredo -alfresco -alga/53 1 -algal 1 -alga's 26 -alga 27 -algebra/1 1 -algebraic -algebraical/8 1 -algebraist 1 -Algenib/3 -Alger -Algeria/2 1 -Algerian/1 1 -Algieba/3 -Algiers/2 1 -Algol/2 1 -Algonquian/1 1 -Algonquin/1 1 -algorithm/1 1 -algorithmic -algorithmically -Alhambra -Alhena/3 -Ali -alias/22 1 -aliasing 1 -alias 1 -alibi/23 1 -alibis 1 -Alice/3 -Alicia/3 -alien/23 1 -alienable -alienate/6 1 -alienation/2 1 -alienist/1 1 -alien 1 -Alighieri/3 -alight/11 1 -align/11 1 -aligner/1 1 -alignment/1 1 -alike 1 -aliment/23 1 -alimentary -alimony/2 1 -Aline/3 -aline/6 1 -alinement/1 1 -Alioth/3 -aliphatic -aliquot/10 1 -Alisa/3 -Alisha/3 -Alison/3 -Alissa/3 -Alistair/3 -alive/33 1 -aliyah/1 1 -Alkaid/3 -alkali/4 1 -alkaline -alkalinity/2 1 -alkalize/6 1 -alkaloid/1 1 -alkyd/1 1 -all/2 1 -Allah/2 1 -Allahabad -Allan/3 -allay/11 1 -allaying 1 -allegation/1 1 -allege/6 1 -alleged/8 1 -Alleghenies/2 1 -Allegheny -allegiance/1 1 -allegoric -allegorical/8 1 -allegorist/1 1 -allegory/15 1 -Allegra/3 -allegretto/1 1 -allegri -allegro/1 1 -allele/1 1 -allelic -alleluia/1 1 -Allen -Allende/3 -Allentown -allergen/1 1 -allergenic -allergic -allergically -allergist/1 1 -allergy/15 1 -alleviate/6 1 -alleviation/1 1 -alley/1 1 -alleyway/1 1 -Allhallows/2 1 -alliance/1 1 -Allie/3 -Allies -alligator/18 1 -Allison/3 -alliterate/6 1 -alliteration/1 1 -alliterative/8 1 -allocatable -allocate/6 1 -allocation/1 1 -allocator/10 1 -allophones -allot/12 1 -allotment/1 1 -allotrope 1 -allotropic -allover 1 -allow/11 1 -allowable/19 1 -allowance/18 1 -allowed 1 -alloy/23 1 -allspice/2 1 -Allstate/3 -all 1 -allude/6 1 -allure/28 1 -allurement/1 1 -alluring/8 1 -allusion/1 1 -allusive/16 1 -alluvial/2 1 -alluvium/1 1 -Alma/3 -Almach/3 -almanac/1 1 -almanack/10 1 -Almaty/2 1 -Almighty/2 1 -almighty 1 -Almohad/3 -almond/1 1 -almoner/1 1 -Almoravid/3 -almost 1 -alms/2 1 -almshouse/1 1 -Alnilam/3 -Alnitak/3 -aloe/1 1 -aloft 1 -aloha/1 1 -alone 1 -alongshore -alongside -along 1 -Alonzo/3 -aloof/16 1 -aloud 1 -alp/1 1 -alpaca/1 1 -Alpert/3 -alpha/1 1 -alphabet/18 1 -alphabetic -alphabetical/8 1 -alphabetization/1 1 -alphabetize/6 1 -alphabetizer/1 1 -alphanumerical/8 1 -alphanumeric 1 -Alphard/3 -alpha 1 -Alphecca/3 -Alpheratz/3 -Alphonse/3 -Alphonso/3 -alpine/10 1 -Alpine 1 -Alpo/3 -Alps/2 1 -already 1 -alright 1 -Alsace/2 1 -Alsatian/1 1 -Alsop/3 -also 1 -Alston/3 -alt/10 1 -Alta -Altai/3 -Altaic/2 1 -Altair -Altamira -altar/1 1 -altarpiece/1 1 -alter/11 1 -alterable 1 -alteration/1 1 -altercate 1 -altercation/1 1 -alternate/54 1 -alternating 1 -alternation/1 1 -alternative/30 1 -alternator/1 1 -Althea/3 -altho 1 -although 1 -altimeter/1 1 -Altiplano/3 -altitude/1 1 -Altman/3 -alto/1 1 -altogether 1 -Altoids/3 -Alton/3 -alto 1 -altruism/2 1 -altruist/1 1 -altruistic/39 1 -Aludra/3 -alum/1 1 -alumina/2 1 -alumina's 28 -alumina 29 -aluminum/2 30 -alumna/53 1 -alumni 31 -alumnus/2 32 -Alva -Alvarado/3 -Alvarez/3 -Alvaro/3 -alveolar/10 1 -Alvin/3 -always -Alzheimer/3 -Alyce/3 -ally/31 1 -ally's -Allyson/3 -Alyson/3 -Alyssa's 33 -Alyssa 34 -Am/2 1 -AM/2 1 -AMA -Amadeus/3 -Amado/3 -amalgam/1 1 -amalgamate/6 1 -amalgamation/1 1 -Amalia/3 -Amanda/3 -amanuenses 35 -amanuensis/2 36 -amaranth/1 1 -amaretto/2 1 -Amarillo -Amaru/3 -amaryllis/4 1 -amass/7 1 -Amaterasu/2 1 -amateur/1 1 -amateurish/16 1 -amateurism/2 1 -Amati 1 -amatory -amaze/28 1 -amazed 1 -amazement/2 1 -amazing/8 1 -amazon/1 1 -Amazon/1 1 -amazonian -Amazonian -ambassador/1 1 -ambassadorial 1 -ambassadorship/1 1 -ambassadress/4 1 -Amber/3 -amber/2 1 -ambergris/2 1 -amber 1 -ambiance/1 1 -ambidexterity/2 1 -ambidextrous/8 1 -ambient 1 -ambiguity/15 1 -ambiguous/8 1 -ambition/18 1 -ambitious/16 1 -ambit 1 -ambivalence/2 1 -ambivalent -ambivalently -amble/28 1 -ambler/1 1 -ambling 1 -ambrosia/2 1 -ambrosial 1 -ambulance/1 1 -ambulanceman 37 -ambulancemen 38 -ambulancewoman 39 -ambulancewomen 40 -ambulant 1 -ambulate/6 1 -ambulation/1 1 -ambulatory/15 1 -ambuscade/28 1 -ambush/22 1 -ambushers -amebic -Amelia/3 -ameliorate/6 1 -amelioration/2 1 -ameliorative -Amen/2 1 -amenability/2 1 -amenable/19 1 -amend/11 1 -amendable -amendment/1 1 -Amenhotep/3 -amenity/15 1 -amen 1 -Amer -Amerasian 1 -amerce/6 1 -amercement/1 1 -America/1 1 -American/1 1 -Americana/2 1 -Americanism/1 1 -Americanization/1 1 -Americanize/6 1 -American 1 -americium/2 1 -Amerind/1 1 -Amerindian/1 1 -Ameslan/3 -amethyst/1 1 -amethystine -amethyst 1 -Amharic/2 1 -Amherst -amiability/2 1 -amiable/55 1 -amicability/2 1 -amicable/19 1 -amide/1 1 -amidships -amidst -amid 1 -Amie/3 -Amiga/3 -amigo/1 1 -amine/10 1 -amino -amir/1 1 -Amish/2 1 -amiss 1 -amity/2 1 -Amman/2 1 -ammeter/1 1 -ammo/2 1 -ammonia/2 1 -ammonia's 41 -ammonia 42 -ammonites -ammonium 43 -ammunition/2 1 -amnesia/2 1 -amnesiac/1 1 -amnesic/1 1 -amnesty/56 1 -amniocenteses 44 -amniocentesis/2 45 -amnion/1 1 -amniotic -Amoco/3 -amoeba/57 1 -amoebic -amok 1 -among -amongst -amontillado/1 1 -amoral/8 1 -amorality/2 1 -amorous/16 1 -amorphous/16 1 -amortizable -amortization/1 1 -amortize/6 1 -Amos -amount/23 1 -amour/1 1 -amp/18 1 -Amparo/3 -amperage/2 1 -Ampere/3 -ampere/1 1 -ampersand/1 1 -amphetamine/1 1 -amphibian/1 1 -amphibious/8 1 -amphitheater/1 1 -amphora/53 1 -ample/17 1 -amplification/1 1 -amplifier/1 1 -amplify/31 1 -amplitude/1 1 -ampoule/1 1 -ampul/1 1 -ampule/1 1 -amputate/6 1 -amputation/1 1 -amputee/1 1 -Amritsar -am 46 -Amsterdam/2 1 -amt -Amtrak -amulet/1 1 -Amundsen -Amur/2 1 -amuse/6 1 -amused 1 -amusement/1 1 -amusing/8 1 -Amway/3 -Amy/3 -amylase/2 1 -Ana/2 1 -Anabaptist/2 1 -Anabel/3 -anabolic -anabolism/2 1 -anachronism/1 1 -anachronistic/39 1 -Anacin/3 -anaconda/1 1 -Anacreon -anaerobe/1 1 -anaerobic/39 1 -anagram/18 1 -anagrammatic -anagrammatically -Anaheim -anal/8 1 -Analects/3 -analgesia/2 1 -analgesic/1 1 -analog/1 1 -analogical/8 1 -analogize/6 1 -analogous/16 1 -analogue/1 1 -analogy/15 1 -analysand/1 1 -analysis/2 1 -analyst/1 1 -analytical/8 1 -analytic 1 -analyzable -analyze/6 1 -analyzer/1 1 -anamorphic -Ananias/2 1 -anapaest/1 1 -anapest/1 1 -anapestic/1 1 -anaphora 1 -anaphoric -anarchic -anarchical/8 1 -anarchism/2 1 -anarchist/1 1 -anarchistic -anarchy/2 1 -Anasazi -Anastasia -anathema/1 1 -anathematize/6 1 -Anatole/3 -Anatolia/2 1 -Anatolian/2 1 -anatomic -anatomical/8 1 -anatomist/1 1 -anatomize/6 1 -anatomy/15 1 -Anaxagoras -ancestor/18 1 -ancestral/8 1 -ancestress/4 1 -ancestry/15 1 -anchor/23 1 -anchorage/1 1 -Anchorage/2 1 -anchorite/1 1 -anchorman/2 47 -anchormen 48 -anchorpeople 49 -anchorperson/1 50 -anchorwoman/2 51 -anchorwomen 52 -anchovy/15 1 -ancient/38 1 -ancillary/15 1 -Andalusia/2 1 -Andalusian 1 -Andaman -andante/1 1 -Andean 1 -Andersen/2 1 -Anderson -Andes/2 1 -andiron/1 1 -Andorra/2 1 -Andorran/1 1 -Andre/3 -Andrea/3 -Andrei/3 -Andres -Andretti/3 -Andrew/1 1 -Andrianampoinimerina/3 -androgen/2 1 -androgenic -androgynous -androgyny/2 1 -android/1 1 -Andromache -Andromeda/2 1 -Andropov -and 1 -Andy/3 -anecdotal 1 -anecdote/1 1 -anechoic -anemia/2 1 -anemic -anemically -anemometer/1 1 -anemone/1 1 -anent -aneroid 1 -anesthesia/2 1 -anesthesiologist/1 1 -anesthesiology/2 1 -anesthetic/1 1 -anesthetist/1 1 -anesthetization/2 1 -anesthetize/6 1 -aneurism/1 1 -aneurysm/1 1 -anew 1 -Angara -angel/1 1 -Angel/2 1 -angel/58 1 -Angela/3 -angelfish/4 1 -Angelia/3 -angelic -angelica/2 1 -angelical/8 1 -Angelica 1 -Angelico -Angelina/3 -Angeline/3 -Angelique/3 -Angelita/3 -Angelo/3 -Angelou -anger/23 1 -Angevin/2 1 -Angie/3 -angina/2 1 -angioplasty/15 1 -angiosperm/1 1 -Angkor -angle/1 1 -Angle/1 1 -angle/6 1 -anglepoise 1 -angler/1 1 -angleworm/1 1 -Anglia -Anglican/1 1 -Anglicanism/1 1 -Anglican 1 -Anglicism/1 1 -anglicism/10 1 -Anglicization 1 -anglicize/6 1 -Anglicize 1 -angling/2 1 -anglophile/10 1 -Anglophile 1 -Anglophil 1 -Anglophobe 1 -anglophone/10 1 -Anglo 1 -Angola/2 1 -Angolan/1 1 -angora/1 1 -Angora/1 1 -angostura 1 -angry/59 1 -angst/2 1 -angstrom/1 1 -Angstrom 1 -Anguilla/2 1 -anguish/22 1 -angularity/15 1 -angular 1 -Angus/2 1 -anhydrous 1 -Aniakchak/3 -Anibal/3 -aniline/2 1 -animadversion/1 1 -animadvert/11 1 -animal/1 1 -animalcule/1 1 -animal 1 -animate/6 1 -animated/8 1 -animate 1 -animating 1 -animation/1 1 -animator/1 1 -animism/2 1 -animist/1 1 -animistic -animosity/15 1 -animus/2 1 -anion/1 1 -anionic 1 -anise/2 1 -aniseed/2 1 -anisette/2 1 -anisotropic -anisotropy/60 1 -Anita/3 -Ankara/2 1 -ankh/1 1 -ankle/18 1 -anklebone/1 1 -anklet/1 1 -Ann/3 -Anna -Annabel/3 -Annabelle/3 -annal/32 1 -annalist/1 1 -Annam/2 1 -Annapolis/2 1 -Annapurna/2 1 -Anne -anneal/5 1 -annealer 1 -annealing 1 -annelid/1 1 -Annette/3 -annex/22 1 -annexation/1 1 -annexe/28 1 -Annie/3 -annihilate/6 1 -annihilation/2 1 -annihilator/1 1 -anniversary/15 1 -Annmarie/3 -annotate/6 1 -annotation/1 1 -annotative -annotator/1 1 -announce/6 1 -announcement/1 1 -announcer/1 1 -annoy/11 1 -annoyance/1 1 -annoying/8 1 -annoyware -annoywares -annual/30 1 -annualized -annuitant/1 1 -annuity/15 1 -annul/61 1 -annular 1 -annuli 53 -annulling 1 -annulment/1 1 -annulus 54 -annunciation/1 1 -Annunciation/1 1 -anode/1 1 -anodize/6 1 -anodyne/1 1 -anoint/11 1 -anointment/2 1 -anomalies -anomalous/8 1 -anomaly/3 -anon/10 1 -anonymity/2 1 -anonymous/8 1 -anopheles/2 1 -anorak/1 1 -anorectic/1 1 -anorexia/2 1 -anorexic/1 1 -another 1 -Anouilh -ans -Anselm -Anselmo/3 -Anshan/3 -ANSI/10 1 -answer/23 1 -answerable 1 -answerer 1 -answerphone/10 1 -ant/62 1 -antacid/1 1 -Antaeus -antagonism/1 1 -antagonist/1 1 -antagonistic/39 1 -antagonize/6 1 -Antananarivo/2 1 -antarctic -Antarctic/2 1 -Antarctica/2 1 -Antares/2 1 -ante/63 1 -anteater/1 1 -antebellum -antecedence/2 1 -antecedent/1 1 -antechamber/1 1 -antedate/43 1 -antediluvian 1 -antelope/1 1 -antenatal -antenna/57 1 -anterior 1 -anteroom/1 1 -antes 55 -ante 1 -anthem/18 1 -anther/1 1 -anthill/1 1 -anthologist/1 1 -anthologize/6 1 -anthology/15 1 -Anthony -anthracite/2 1 -anthrax/2 1 -anthropic -anthropocentric -anthropogenic -anthropoid/1 1 -anthropological/8 1 -anthropologist/1 1 -anthropology/2 1 -anthropometric -anthropomorphic/39 1 -anthropomorphism/2 1 -anthropomorphizing -anthropomorphous 1 -anti/1 1 -antiabortion -antiabortionist/1 1 -antiaircraft 1 -antibacterial/1 1 -antibiotic/1 1 -antibody/15 1 -antic/64 1 -anticancer -antichrist/1 1 -Antichrist/1 1 -anticipate/6 1 -anticipation/1 1 -anticipative 1 -anticipatory 1 -anticlerical 1 -anticlimactic -anticlimactically -anticlimax/4 1 -anticline/1 1 -anticlockwise -anticoagulant/1 1 -anticommunism/2 1 -anticommunist/1 1 -antic 1 -anticyclone/1 1 -anticyclonic -antidemocratic -antidepressant/1 1 -antidote/18 1 -Antietam -antifascist/1 1 -antifreeze/2 1 -antigen/1 1 -antigenic -antigenicity/2 1 -Antigone/2 1 -Antigua/2 1 -antihero/4 1 -antihistamine/1 1 -antiknock/2 1 -antilabor -Antillean -Antilles/2 1 -antilogarithm/1 1 -antimacassar/1 1 -antimalarial 1 -antimatter/2 1 -antimicrobial 1 -antimissile 1 -antimony/2 1 -antinuclear -Antioch -antioxidant/1 1 -antiparticle/1 1 -Antipas/3 -antipasto/65 1 -antipathetic -antipathy/15 1 -antipersonnel -antiperspirant/1 1 -antiphon/1 1 -antiphonal/30 1 -antipodal/10 1 -antipodean/1 1 -antipodes -Antipodes -antipodes's -antipollution 1 -antipoverty -antiquarian/1 1 -antiquarianism/2 1 -antiquary/15 1 -antiquate/6 1 -antiquated 1 -antique/28 1 -antiquity/15 1 -antirrhinum/10 1 -antisemitic -antisemitism/2 1 -antisepsis/2 1 -antiseptic/51 1 -antiserum/1 1 -antislavery 1 -antisocial/8 1 -antispasmodic/1 1 -antistatic 1 -antis 56 -antisubmarine -antisymmetric -antisymmetry -antitank -antitheses 57 -antithesis/2 58 -antithetic -antithetical/8 1 -antitoxin/1 1 -antitrust -anti 1 -antivenin/1 1 -antiviral/10 1 -antivivisectionist/1 1 -antiwar -antler/1 1 -antlered -Antofagasta/2 1 -Antoine/3 -Antoinette -Anton/3 -Antone/3 -Antonia/3 -Antoninus -Antonio/3 -Antonius -Antony/2 1 -antonym/1 1 -antonymous -antral -an 1 -antsy/34 1 -ant 1 -Antwan/3 -Antwerp/2 1 -Anubis/2 1 -anus/4 1 -anvil/18 1 -anxiety/15 1 -anxious/16 1 -Anzac 1 -ANZUS -anybody/15 1 -anyhow 1 -anymore 1 -anyone/2 1 -anyplace 1 -anything/1 1 -anytime 1 -any 1 -anyway/10 1 -anywhere 1 -anywise 1 -AOL/3 -aorist 1 -aorta/1 1 -aortic 1 -AP -apace 1 -Apache/1 1 -Apalachicola/2 1 -apartheid/2 1 -apartment/1 1 -apart 1 -apathetic/39 1 -apathy/2 1 -apatite/2 1 -APB -ape/28 1 -apelike -Apennines -aperiodic/39 1 -aperitif/1 1 -aperture/1 1 -apex/4 1 -aphasia/2 1 -aphasic/1 1 -aphelia 59 -aphelion/1 60 -aphid/1 1 -aphorism/1 1 -aphoristic/39 1 -aphrodisiac/1 1 -Aphrodite/2 1 -apiarist/1 1 -apiary/15 1 -Apia 61 -apical/8 1 -apiece 1 -apish/8 1 -aplenty 1 -aplomb/2 1 -apnea 1 -APO -apocalypse/1 1 -Apocalypse/2 1 -apocalyptic -Apocrypha/2 1 -apocryphal/8 1 -apocrypha's 62 -apocrypha 63 -apogee/1 1 -apolitical/8 1 -Apollinaire -Apollo/1 1 -Apollonian -apologetic/39 1 -apologia/1 1 -apologist/1 1 -apologize/6 1 -apology/15 1 -apoplectic 1 -apoplexy/15 1 -apostasy/15 1 -apostate/1 1 -apostatize/6 1 -apostle/1 1 -apostleship/2 1 -apostolic -apostrophe/1 1 -apostrophized -apothecary/15 1 -apothegm/1 1 -apotheoses 64 -apotheosis/2 65 -apotheosizes -app/10 1 -Appalachia/2 1 -Appalachian/10 1 -appall/11 1 -appalling/8 1 -appaloosa/1 1 -Appaloosa/1 1 -apparatchik/10 1 -apparatus/4 1 -apparel/23 1 -apparent/8 1 -apparition/1 1 -appeal/23 1 -appealing/8 1 -appear/11 1 -appearance/1 1 -appease/6 1 -appeasement/1 1 -appeaser/1 1 -appeasing 1 -appellant/1 1 -appellate -appellation/1 1 -append/11 1 -appendage/1 1 -appendectomy/15 1 -appendicitis/2 1 -appendix/66 1 -appertain/11 1 -appetite/1 1 -appetizer/1 1 -appetizing/8 1 -applaud/11 1 -applauder/1 1 -applause/2 1 -Apple/3 -apple/1 1 -applecart 1 -applejack/2 1 -applesauce/2 1 -Appleseed -applet/1 1 -Appleton -appliance/1 1 -applicability/2 1 -applicable/19 1 -applicant/1 1 -application/1 1 -applicative 1 -applicator/1 1 -applier/1 1 -applique/63 1 -apply/31 1 -appoint/11 1 -appointee/1 1 -appointive -appointment/1 1 -Appomattox -apportion/11 1 -apportionment/2 1 -appose/6 1 -apposite/16 1 -apposition/2 1 -appositive/1 1 -appraisal/1 1 -appraise/6 1 -appraisees -appraiser/1 1 -appraising 1 -appreciable/19 1 -appreciate/6 1 -appreciation/1 1 -appreciative/8 1 -appreciator/1 1 -appreciatory 1 -apprehend/11 1 -apprehension/1 1 -apprehensive/16 1 -apprentice/28 1 -apprenticeship/1 1 -apprise/6 1 -apprize/6 1 -apprizing 1 -approach/22 1 -approachability 1 -approachable 1 -approbation/1 1 -appropriate/67 1 -appropriation/1 1 -appropriator/1 1 -approval/1 1 -approve/6 1 -approved 1 -approving/8 1 -approx -approximate/68 1 -approximation/1 1 -appurtenance/1 1 -appurtenant 1 -APR -Apr/2 1 -apricot/1 1 -April/1 1 -apron/18 1 -apropos -apse/1 1 -apses 66 -apt/21 1 -aptitude/1 1 -Apuleius -aqua/1 1 -aquaculture/2 1 -Aquafresh/3 -aqualung/1 1 -aquamarine/1 1 -aquanaut/1 1 -aquaplane/28 1 -aquarium/1 1 -Aquarius/4 1 -aquatic/69 1 -aquatint/70 1 -aqua 1 -aquavit/2 1 -aqueduct/1 1 -aqueous 1 -aquiculture/2 1 -aquifer/1 1 -Aquila 67 -aquiline -Aquinas/2 1 -Aquino/3 -Aquitaine/2 1 -AR -Ar/4 1 -Ara/2 1 -Arab/1 1 -arabesque/1 1 -Arabia/2 1 -Arabian/1 1 -Arabic/2 1 -arability/2 1 -Arabist/1 1 -arable 1 -Araby -Araceli/3 -arachnid/1 1 -arachnoid 1 -arachnophobia 1 -Arafat/3 -Araguaya/3 -Aral/3 -Aramaic/2 1 -Aramco/3 -Arapaho/71 1 -Arapahoe/1 1 -Ararat/2 1 -Araucanian 1 -Arawak/2 1 -Arawakan/2 1 -arbiter/1 1 -arbitrage/28 1 -arbitrager/1 1 -arbitrageur/1 1 -arbitrament/1 1 -arbitrary/72 1 -arbitrate/6 1 -arbitration/2 1 -arbitrator/1 1 -Arbitron/3 -arbor/71 1 -arboreal 1 -arboretum/1 1 -arborvitae/1 1 -arbutus/4 1 -ARC -arc/23 1 -arcade/73 1 -Arcadia/2 1 -Arcadian/2 1 -arcading 1 -arcana 68 -arcanely -arcaneness -arcane 1 -arch/74 1 -archaeological/8 1 -archaeologist/1 1 -archaic/39 1 -archaism/1 1 -archaist/1 1 -archangel/1 1 -archbishop/1 1 -archbishopric/1 1 -archdeacon/1 1 -archdeaconry 1 -archdiocesan -archdiocese/1 1 -archduchess/4 1 -archduke/1 1 -Archean -archenemy/15 1 -archeological 1 -archeologist/1 1 -archeology/2 1 -archeopteryx 1 -archer/1 1 -archery/2 1 -archetypal 1 -archetype/1 1 -archetypical 1 -archfiend/1 1 -Archibald/3 -Archie/3 -archiepiscopal 1 -Archimedes -arching 1 -archipelago/1 1 -architect/18 1 -architectonic/32 1 -architectural/8 1 -architecture/1 1 -architrave/1 1 -archival -archive/28 1 -archivist/1 1 -archway/1 1 -arcing 1 -arctic/1 1 -Arctic/2 1 -arctic 1 -Arctic 1 -Arcturus/2 1 -Ardabil -Ardebil -Arden -ardency 1 -ardent/8 1 -ardor/1 1 -arduous/16 1 -are/1 1 -area/1 1 -areal 1 -arena/1 1 -aren't -Arequipa -are 46 -argent/2 1 -Argentina/2 1 -Argentinean 1 -Argentine 1 -Argentinian/1 1 -argent 1 -Argo/10 1 -argon/2 1 -Argonaut/1 1 -Argonne/2 1 -argosy/15 1 -argot/1 1 -arguable/19 1 -argue/6 1 -arguer/1 1 -argument/1 1 -argumentation/2 1 -argumentative/16 1 -Argus/2 1 -argyle/1 1 -aria/1 1 -Ariadne/2 1 -Arianism/2 1 -arid/75 1 -aridity/2 1 -Ariel -Aries/4 1 -aright 1 -Ariosto -arise/76 69 -arising 1 -Aristarchus/2 1 -Aristides -aristocracy/15 1 -aristocrat/1 1 -aristocratically -aristocratic 1 -Aristophanes/2 1 -Aristotelian/2 1 -Aristotle/2 1 -arithmetic/2 1 -arithmetical/8 1 -arithmetician/1 1 -Arius/2 1 -Ariz -Arizona/2 1 -Arizonan/1 1 -Arizonian/1 1 -Arjuna -Ark -ark/1 1 -Arkansan/1 1 -Arkansas/2 1 -Arkhangelsk -Arkwright -Arlene/3 -Arline/3 -Arlington -arm/23 1 -armada/1 1 -armadillo/1 1 -Armageddon/1 1 -Armagnac/2 1 -armament/1 1 -Armand/3 -Armando/3 -Armani/3 -armature/18 1 -armband/1 1 -armchair/1 1 -Armenia/2 1 -Armenian/1 1 -armful/1 1 -armhole/1 1 -arming 1 -Arminius/2 1 -armistice/1 1 -armless 1 -armlet/1 1 -armload/10 1 -Armonk/3 -armor/23 1 -armorer/1 1 -armorial 1 -armory/15 1 -Armour/3 -armpit/1 1 -armrest/1 1 -Armstrong/2 1 -army/15 1 -Arneb/3 -Arnhem -Arno/2 1 -Arnold -Arnulfo/3 -aroma/1 1 -aromatherapist/1 1 -aromatherapy/2 1 -aromatic/51 1 -aromaticity 1 -Aron/3 -arose 70 -around 1 -arousal/2 1 -arouse/6 1 -arpeggio/1 1 -arr -arraign/11 1 -arraigning 1 -arraignment/1 1 -arrange/6 1 -arrangeable -arrangement/1 1 -arranger/1 1 -arrant 1 -arras/4 1 -array/23 1 -arrears -arrears's -arrest/23 1 -arrestable -arresting 1 -Arrhenius -arrhythmia/2 1 -arrhythmical 1 -arrhythmic 1 -arrival/1 1 -arrive/6 1 -arrogance/2 1 -arrogant/8 1 -arrogate/6 1 -arrogation/2 1 -Arron/3 -arrow/23 1 -arrowhead/1 1 -arrowroot/2 1 -arroyo/1 1 -arsed -arsenal/1 1 -arsenic/2 1 -arsenide 1 -arsing -arson/2 1 -arsonist/1 1 -Art/3 -art/18 1 -Artaxerxes/3 -artefactual -Artemis/2 1 -arterial 1 -arteriole/1 1 -arteriosclerosis/2 1 -artery/15 1 -artful/16 1 -arthritic/1 1 -arthritis/2 1 -arthropod/1 1 -arthroscope/1 1 -arthroscopic -Arthur/2 1 -Arthurian -artichoke/1 1 -article/77 1 -articulacy 1 -articular 1 -articulate/67 1 -articulation/1 1 -articulatory 1 -Artie/3 -artifact/1 1 -artifice/1 1 -artificer/1 1 -artificial/8 1 -artificiality/2 1 -artillery/2 1 -artilleryman/2 71 -artillerymen 72 -artisan/1 1 -artist/1 1 -artiste/1 1 -artistic/39 1 -artistry/2 1 -artless/16 1 -art 46 -artsy/34 1 -Arturo/3 -artwork/1 1 -arty/49 1 -Aruba/2 1 -arugula 1 -arum/1 1 -Aryan/1 1 -Asama/3 -asap -ASAP -asbestos/2 1 -asbestosis 1 -Ascella/3 -ascend/11 1 -ascendance/2 1 -ascendancy/2 1 -ascendant/1 1 -ascendency/2 1 -ascendent/1 1 -ascending 1 -ascension/1 1 -Ascension/2 1 -ascent/1 1 -ascertain/11 1 -ascertainable 1 -ascertainment/2 1 -ascetic/1 1 -ascetically -asceticism/2 1 -ASCII/1 1 -ascorbic -ascot/1 1 -ascribable -ascribe/6 1 -ascription/1 1 -aseptic/39 1 -asexual/8 1 -asexuality/2 1 -Asgard -ash/22 1 -ashamed/8 1 -Ashanti 1 -ashcan/1 1 -Ashcroft -Ashe -ashen 1 -Ashgabat -Ashikaga/3 -Ashkenazim -Ashkhabad/2 1 -ashlar/18 1 -Ashlee/3 -Ashley/3 -Ashmolean/3 -ashore 1 -ashram/1 1 -ashtray/1 1 -Ashurbanipal -ashy/34 1 -Asia/2 1 -Asian/1 1 -Asiatic/1 1 -aside/1 1 -Asimov -asinine/8 1 -asininity/15 1 -ask/11 1 -askance 1 -askew 1 -asking 1 -ASL/2 1 -aslant 1 -asleep 1 -Asmara -asocial 1 -Asoka -asp/1 1 -asparagus/2 1 -aspartame/2 1 -ASPCA -aspect/1 1 -Aspell/3 -Aspen/3 -aspen/1 1 -asperity/15 1 -aspersion/1 1 -asphalt/23 1 -asphodel/1 1 -asphyxia/2 1 -asphyxiate/6 1 -asphyxiation/1 1 -aspic/1 1 -Aspidiske/3 -aspidistra/1 1 -aspirant/1 1 -aspirate/28 1 -aspiration/1 1 -aspirational -aspirator/1 1 -aspire/6 1 -aspirin/1 1 -aspiring 1 -Asquith -ass/4 1 -Assad/3 -assail/11 1 -assailable 1 -assailant/1 1 -assailing 1 -Assam/2 1 -Assamese/2 1 -assassin/1 1 -assassinate/6 1 -assassination/1 1 -assault/78 1 -assaulter 1 -assay/23 1 -assayer/1 1 -assaying 1 -assemblage/1 1 -assemble/6 1 -assembler/1 1 -assemblies -Assembly -assembly/3 -assemblyman/2 73 -assemblymen 74 -assemblywoman/2 75 -assemblywomen 76 -assent/23 1 -assenting 1 -assert/11 1 -asserted 1 -assertion/1 1 -assertive/16 1 -asses/79 1 -assess/7 1 -assessable -assessment/1 1 -assessor/1 1 -asset/1 1 -asseverate/6 1 -asseveration/2 1 -asshole/80 1 -assiduity/2 1 -assiduous/16 1 -assign/23 1 -assignable 1 -assignation/1 1 -assignees -assigner/1 1 -assignment/1 1 -assignor/1 1 -assimilable -assimilate/6 1 -assimilation/2 1 -Assisi -assist/23 1 -assistance/2 1 -assistant/1 1 -assize/18 1 -assn -assoc -associate/28 1 -associateship 1 -association/1 1 -associational -associative/8 1 -associativity 1 -assonance/2 1 -assonant/1 1 -assort/11 1 -assortment/1 1 -asst -assuage/6 1 -assumable 1 -assume/6 1 -assumed 1 -assuming 1 -assumption/1 1 -assumptive 1 -assurance/1 1 -assure/6 1 -assured/30 1 -Assyria/2 1 -Assyrian/1 1 -Astaire -Astana/3 -Astarte/2 1 -astatine/2 1 -aster/1 1 -asterisk/23 1 -astern 1 -asteroid/1 1 -asthma/2 1 -asthmatic/51 1 -astigmatic 1 -astigmatism/1 1 -astir 1 -astonish/7 1 -astonished 1 -astonishing/8 1 -astonishment/2 1 -Aston 1 -a 77 -Astor -Astoria -astound/11 1 -astounding/8 1 -astraddle 1 -astrakhan/2 1 -Astrakhan 1 -astral/8 1 -astray 1 -astride 1 -astringency/2 1 -astringent/30 1 -astrolabe/1 1 -astrologer/1 1 -astrological/8 1 -astrologist/1 1 -astrology/2 1 -astronaut/1 1 -astronautic/32 1 -astronautical 1 -astronomer/1 1 -astronomic -astronomical/8 1 -astronomy/2 1 -astrophysical -astrophysicist/1 1 -astrophysics/2 1 -AstroTurf 1 -as 1 -Asturias -astute/27 1 -Asuncion/2 1 -asunder -Aswan/2 1 -asylum/1 1 -asymmetric -asymmetrical/8 1 -asymmetry/15 1 -asymptomatic 1 -asymptote/10 1 -asymptotic/39 1 -asynchronous/8 1 -At/1 1 -Atacama/3 -Atahualpa -Atalanta -Atari/3 -Ataturk/3 -atavism/2 1 -atavist/1 1 -atavistic 1 -ataxia/2 1 -ataxic/1 1 -atelier/1 1 -ate 78 -Athabasca/3 -Athabascan/1 1 -Athabaska -Athabaskan/1 1 -atheism/2 1 -atheist/1 1 -atheistically -atheistic 1 -atheist 1 -Athena/2 1 -Athene/2 1 -Athenian/1 1 -Athens/2 1 -atherosclerosis/2 1 -athirst 1 -athlete/1 1 -athletic/35 1 -athleticism 1 -athwart 1 -atilt 1 -atishoo -Atkins/3 -Atkinson -Atlanta/2 1 -Atlantes 79 -Atlantic/2 1 -Atlantis/2 80 -atlas/81 1 -Atlas/4 1 -ATM/2 1 -Atman 1 -atmosphere/1 1 -atmospheric/32 1 -atmospherically -atoll/1 1 -atom/1 1 -atomic/39 1 -atomicity 1 -atomic 1 -atomistic -atomization 1 -atomize/6 1 -atomizer/1 1 -atonal/8 1 -atonality/2 1 -atone/6 1 -atonement/2 1 -atop 1 -ATP/2 1 -Atreus -Atria/3 -atrial 1 -atria 81 -atrium/2 82 -atrocious/16 1 -atrocity/15 1 -atrophy/56 1 -atropine/2 1 -Atropos/2 1 -attach/7 1 -attachable -attache/28 1 -attachment/1 1 -attack/78 1 -attacker/1 1 -attain/11 1 -attainability/2 1 -attainable 1 -attainder/2 1 -attainment/1 1 -attar/2 1 -attempt/23 1 -attend/11 1 -attendance/1 1 -attendant/1 1 -attendee/1 1 -attender/10 1 -attending 1 -attention/1 1 -attentional -attentive/16 1 -attenuate/6 1 -attenuation/2 1 -attenuator/10 1 -attest/11 1 -attestation/1 1 -attic/1 1 -Attic/2 1 -Attica/2 1 -Attic 1 -Attila/2 1 -attire/28 1 -attiring 1 -attitude/1 1 -attitudinal -attitudinize/6 1 -Attlee -attn -Attn -attorney/1 1 -attract/11 1 -attractable 1 -attractant/1 1 -attraction/1 1 -attractive/16 1 -attractor/10 1 -attributable -attribute/28 1 -attribution/1 1 -attributive/30 1 -attrition/2 1 -at 1 -Attucks -attune/6 1 -ATV 1 -atwitter -Atwood/3 -atypical/8 1 -atty -Au/2 1 -aubergine/10 1 -Aubrey -auburn/2 1 -Auckland -auction/23 1 -auctioneer/18 1 -audacious/16 1 -audacity/2 1 -Auden/2 1 -Audi/3 -audibility/2 1 -audible/82 1 -audience/1 1 -audio/1 1 -audiobook/1 1 -audiological -audiologist/1 1 -audiology/2 1 -audiometer/1 1 -Audion/3 -audiophile/1 1 -audiotape/1 1 -audiovisual/32 1 -audit/23 1 -audition/23 1 -auditive 1 -auditor/1 1 -auditorium/1 1 -auditory 1 -Audra/3 -Audrey/3 -Audubon -Aug/2 1 -Augean 1 -auger/1 1 -aught/1 1 -augite 1 -augment/5 1 -augmentation/1 1 -augmentative 1 -augmenter/1 1 -Augsburg -augur/23 1 -augury/15 1 -august/21 1 -August/1 1 -Augusta/2 1 -Augustan 1 -Augustine/2 1 -Augustinian/1 1 -august 1 -Augustus/2 1 -auk/1 1 -aunt/1 1 -auntie/1 1 -aunty/15 1 -aura/1 1 -aural/8 1 -Aurangzeb -aura's 83 -aura 84 -Aurelia/3 -Aurelio/3 -Aurelius -aureola/2 1 -aureole/18 1 -Aureomycin/2 1 -auricle/1 1 -auric 1 -auricular 1 -Auriga/2 1 -aurora/1 1 -Aurora/2 1 -auroral 1 -Auschwitz -auscultate/6 1 -auscultation/1 1 -auspice/1 1 -auspices 85 -auspicious/16 1 -Aussie/1 1 -Austen -austere/45 1 -austerity/15 1 -Austerlitz/2 1 -Austin/1 1 -Australasia/2 1 -Australasian 1 -Australia/2 1 -Australian/1 1 -Australoid 1 -Australopithecus/2 1 -austral 1 -Austria/2 1 -Austrian/1 1 -Austronesian/2 1 -auteur 1 -authentic -authentically -authenticate/6 1 -authentication/1 1 -authenticator/10 1 -authenticity/2 1 -author/23 1 -authoress/4 1 -authorial -authoring 1 -authoritarian/1 1 -authoritarianism/2 1 -authoritative/16 1 -authority/15 1 -authorization/1 1 -authorize/6 1 -authorship/2 1 -autism/2 1 -autistic 1 -auto/18 1 -autobahn/1 1 -autobiographer/1 1 -autobiographic -autobiographical/8 1 -autobiography/15 1 -autoclave/18 1 -autocracy/15 1 -autocrat/1 1 -autocratic -autocratically -autocross 1 -autocue 1 -autodidact/1 1 -autograph/23 1 -autoignition -autoimmune -autoimmunity/2 1 -automaker/1 1 -automate/6 1 -automatic/51 1 -automation/2 1 -automatism/2 1 -automatize/6 1 -automaton/1 1 -automobile/28 1 -automorphism/10 1 -automotive -autonomic 1 -autonomous/8 1 -autonomy/2 1 -autopilot/1 1 -autopsy/56 1 -autosuggestion 1 -autoworker/1 1 -Autumn/3 -autumn/1 1 -autumnal 1 -autumn 1 -aux -auxiliary/15 1 -auxin/2 1 -av -AV -Av/2 1 -Ava/3 -avail/23 1 -availability/15 1 -available 1 -avalanche/18 1 -Avalon -avarice/2 1 -avaricious/83 1 -avast 1 -avatar/1 1 -avaunt 1 -avdp -avenge/6 1 -avenger/1 1 -avenging 1 -Aventine -avenue/1 1 -aver/13 1 -average/54 1 -Avernus -Averroes -averse 1 -aversion/1 1 -aversive -avert/11 1 -Avery/3 -Avesta/2 1 -ave 1 -Ave 1 -avg -avian 1 -aviary/15 1 -aviation/2 1 -aviator/1 1 -aviatrix/66 1 -Avicenna -avid/75 1 -avidity/2 1 -Avignon -Avila/3 -avionic/32 1 -Avior/3 -Avis -avitaminosis/2 1 -avocado/1 1 -avocation/1 1 -avocational -Avogadro -avoid/11 1 -avoidable/19 1 -avoidance/2 1 -avoirdupois/2 1 -Avon -avouch/7 1 -avow/11 1 -avowal/1 1 -avowed/8 1 -avuncular -avuncularly -aw -AWACS -await/11 1 -awake/14 86 -awaken/11 1 -awakening/1 1 -awake 1 -awaking 1 -award/23 1 -aware/84 1 -awash 1 -away 1 -awe/28 1 -awed 1 -aweigh 1 -awesome/16 1 -awestricken -awestruck -awful/85 1 -awhile 1 -awkward/21 1 -awl/1 1 -awn/86 1 -awning/1 1 -awoken 87 -awoke 87 -AWOL/2 1 -awol 1 -awry 1 -ax/22 88 -axehead -axeheads -axeman 1 -axes 89 -axial/8 1 -axillary 1 -axiom/1 1 -axiomatically -axiomatic 1 -axiomatizing -Axis -axis/4 90 -axle/1 1 -axletree/1 1 -axolotl/1 1 -axon/1 1 -Axum -ay/4 1 -ayah/1 1 -Ayala/3 -ayatollah/1 1 -aye/1 1 -Ayers -Aymara 1 -Ayrshire/2 1 -ay 1 -Ayurveda -Ayyubid/3 -AZ/2 1 -azalea/1 1 -Azana/3 -Azania/3 -Azazel -Azerbaijan/2 1 -Azerbaijani/1 1 -azimuth/1 1 -azimuthal 1 -Azores/2 1 -Azov -AZT/2 1 -Aztec/1 1 -Aztecan/2 1 -Aztlan/3 -azure/18 1 -b -B/2 1 -Ba/2 1 -BA/2 1 -baa/23 1 -baaing 1 -Baal/1 1 -baas 1 -Baath/3 -Baathist -Babar/2 1 -Babbage -Babbitt 1 -babble/28 1 -babbler/1 1 -babbling 1 -babe/1 1 -babel/1 1 -Babel/1 1 -baboon/1 1 -Babur -babushka/1 1 -baby/87 1 -babyhood/2 1 -babyish 1 -Babylon/1 1 -Babylonia/2 1 -Babylonian/1 1 -babysat 91 -babysit/88 92 -babysitter/1 1 -babysitting/2 1 -Bacall/3 -Bacardi 1 -baccalaureate/1 1 -baccarat/2 1 -bacchanal/1 1 -bacchanalia/2 1 -Bacchanalia/2 1 -bacchanalian/1 1 -Bacchic -Bacchus/2 1 -baccy 1 -Bach/2 1 -bachelor/18 1 -bachelorhood/2 1 -bacillary -bacilli 93 -bacillus/2 94 -back/78 1 -backache/1 1 -backbench/89 1 -backbencher/1 1 -backbite/90 1 -backbiter/1 1 -backbiting 1 -backboard/1 1 -backbone/1 1 -backbreaking -backchat 1 -backcloth/10 1 -backcomb/11 1 -backdate/6 1 -backdoor -backdrop/18 1 -backer/1 1 -backfield/1 1 -backfire/28 1 -backgammon/2 1 -background/91 1 -backgrounder/1 1 -backhand/78 1 -backhanded/8 1 -backhander/1 1 -backhoe/1 1 -backing/1 1 -backlash/40 1 -backless 1 -backlog/92 1 -backpack/23 1 -backpacker/1 1 -backpacking/2 1 -backpedal/11 1 -backrest/1 1 -backroom/10 1 -backscratching/3 -backseat/1 1 -backside/1 1 -backslapper/1 1 -backslapping/2 1 -backslash/4 1 -backslide/93 1 -backslider/1 1 -backslid 1 -backspace/28 1 -backspin/2 1 -backstabber/1 1 -backstabbing 1 -backstage/2 1 -backstair/10 1 -backstop/47 1 -backstreet/10 1 -backstretch/4 1 -backstroke/28 1 -backtalk/2 1 -backtrack/11 1 -backup/1 1 -Backus/3 -backward/94 1 -backwash/2 1 -backwater/1 1 -backwoods -backwoodsman/2 95 -backwoodsmen 96 -backwoods's -backyard/1 1 -bacon/2 1 -Bacon/2 1 -bacteria/1 1 -bacterial 1 -bacteria's 97 -bacteria 98 -bactericidal -bactericide/1 1 -bacteriologic -bacteriological 1 -bacteriologist/1 1 -bacteriology/2 1 -bacteriophage 1 -bacterium/2 99 -Bactria -bad/95 100 -baddie/1 1 -baddy/15 1 -Baden -bade 101 -badge/77 1 -badger/23 1 -badinage/2 1 -badlands -Badlands/2 1 -badlands's -badman/2 102 -badmen 103 -badminton/2 1 -badmouth/11 1 -Baedeker/1 1 -Baez -Baffin/3 -baffle/28 1 -bafflement/2 1 -baffler/1 1 -baffling 1 -bag/92 1 -bagatelle/1 1 -bagel/1 1 -bagful/1 1 -baggage/2 1 -baggie/41 1 -Baggies -bagging 1 -Baghdad/2 1 -bagpipe/96 1 -bagpiper/1 1 -baguette/1 1 -Baguio -baggy/97 1 -Baha'i -Bahama/3 -Bahamanian 1 -Bahamas/2 1 -Bahamian/1 1 -Baha'ullah -Bahia -Bahrain/2 1 -baht/1 1 -bah 1 -Baikal -bail/23 1 -bailable 1 -Bailey/3 -bailey/10 1 -bailiff/10 1 -bailiwick/1 1 -bailout/1 1 -bailsman/2 104 -bailsmen 105 -Baird -bairn/1 1 -bait/23 1 -baiting 1 -baize/2 1 -bake/28 1 -bakehouse 1 -Bakelite/2 1 -Baker -baker/1 1 -Bakersfield -bakery/15 1 -bakeshop/1 1 -baking 1 -baklava/2 1 -baksheesh/2 1 -Baku/2 1 -Bakunin -balaclava/1 1 -balalaika/1 1 -balance/28 1 -Balanchine -Balaton -Balboa -balboa/1 1 -balcony/15 1 -bald/98 1 -Balder/2 1 -balderdash/2 1 -baldfaced -baldric/1 1 -Baldwin/1 1 -baldy/60 1 -bale/28 1 -Balearic/3 -baleen/2 1 -baleful/85 1 -baler/1 1 -Balfour -Bali/2 1 -Balinese/2 1 -baling 1 -balk/23 1 -Balkan/10 1 -Balkhash -balking 1 -balky/34 1 -Ball -ball/23 1 -ballad/1 1 -ballade/10 1 -balladeer/1 1 -balladry/2 1 -Ballard/3 -ballast/23 1 -ballcock/1 1 -ballerina/1 1 -ballet/1 1 -balletic 1 -ballgame/1 1 -ballgirl -ballgirls -ballgown/10 1 -balling 1 -ballistic/32 1 -balloon/23 1 -ballooning 1 -balloonist/1 1 -balloon 1 -ballot/23 1 -ballpark/1 1 -ballplayer/1 1 -ballpoint/1 1 -ballroom/1 1 -ballsed -ballses -ballsing -ballsy/34 1 -balm/1 1 -balmy/49 1 -baloney/2 1 -balsa/1 1 -balsam/18 1 -balsamic 1 -Balthazar 1 -Baltic/2 1 -Baltimore/2 1 -Baluchistan -baluster/1 1 -balustrade/1 1 -Balzac/2 1 -ballyhoo/23 1 -bally 1 -Bamako/2 1 -Bambi/3 -bamboo/1 1 -bamboozle/6 1 -ban/99 1 -Banach/3 -banal/75 1 -banality/15 1 -banana/1 1 -Bancroft/3 -band/23 1 -bandage/28 1 -bandana/1 1 -bandanna/1 1 -bandbox/4 1 -bandeau/100 1 -banding 1 -bandit/1 1 -banditry/2 1 -bandleader/10 1 -bandmaster/1 1 -bandoleer/1 1 -bandolier/1 1 -bandpass -bandsman/2 106 -bandsmen 107 -bandstand/1 1 -Bandung/2 1 -bandwagon/1 1 -bandwidth/10 1 -bandy/101 1 -bandying 1 -bane/18 1 -baneful/102 1 -bang/78 1 -Bangalore -banger/10 1 -Bangkok/2 1 -Bangladesh/2 1 -Bangladeshi/1 1 -bangle/1 1 -Bangor -Bangui/2 1 -banish/7 1 -banishment/2 1 -banister/1 1 -Banjarmasin/3 -banjo/1 1 -banjoist/1 1 -Banjul -bank/23 1 -bankable 1 -bankbook/1 1 -bankcard/1 1 -banker/1 1 -banking/2 1 -banknote/1 1 -bankroll/23 1 -bankrupt/23 1 -bankruptcy/15 1 -bankrupt 1 -Banks -Banneker/3 -banner/18 1 -Bannister -bannister/1 1 -bannock/1 1 -banns/2 1 -banquet/23 1 -banqueter/1 1 -banquette/1 1 -banshee/1 1 -banshie/1 1 -bantam/1 1 -bantamweight/1 1 -banter/23 1 -bantering/8 1 -Banting -Bantu/1 1 -banzai/1 1 -banyan/1 1 -baobab/1 1 -Baotou/3 -bap/10 1 -baptism/1 1 -baptismal 1 -Baptist/1 1 -baptist/10 1 -Baptiste/3 -baptistery/15 1 -baptistry/15 1 -Baptist 1 -baptize/6 1 -baptizer/1 1 -bar/103 1 -Barabbas -Barack/3 -barb/23 1 -Barbadian/1 1 -Barbados/2 1 -Barbara/3 -Barbarella/3 -barbarian/1 1 -barbarianism/1 1 -barbaric/39 1 -barbarism/1 1 -barbarity/15 1 -barbarize/6 1 -Barbarossa/2 1 -barbarous/8 1 -Barbary/2 1 -barbecue/28 1 -barbel/1 1 -barbell/1 1 -barbeque/28 1 -Barber -barber/23 1 -barberry/15 1 -barbershop/1 1 -barbie/10 1 -Barbie 1 -barbiturate/1 1 -Barbour/2 1 -Barbra/3 -Barbuda/2 1 -barbwire/2 1 -barcarole/1 1 -barcarolle/1 1 -Barcelona/2 1 -Barclay/3 -bard/18 1 -Bardeen/3 -bardic 1 -bare/104 1 -bareback -barebacked -barefaced/8 1 -barefoot -barefooted -barehanded -bareheaded 1 -barelegged -Barents/3 -barf/23 1 -barflies -barfly's -barfly 1 -bargain/78 1 -bargainer/1 1 -barge/28 1 -bargeman/2 108 -bargemen 109 -bargepole 1 -barhop/105 1 -baritone/1 1 -barium/2 1 -bark/23 1 -barkeep/1 1 -barkeeper/1 1 -Barker/3 -barker/1 1 -Barkley/3 -barley/2 1 -barleycorn/10 1 -Barlow/3 -barmaid/1 1 -barman/2 110 -barmen 111 -barmy/34 1 -barn/18 1 -Barnabas -Barnaby/3 -barnacle/1 1 -barnacled -Barnard -Barnaul -Barnes -Barnett/3 -Barney/3 -barney/10 1 -barnstorm/11 1 -barnstormer/1 1 -Barnum -barnyard/1 1 -Baroda -barometer/1 1 -barometric -barometrically -baron/1 1 -baronage/1 1 -baroness/3 -baronesses -baronet/1 1 -baronetcy/15 1 -baronial -barony/15 1 -baroque/2 1 -Baroque 1 -barque/1 1 -Barquisimeto -Barr/3 -barrack/23 1 -barracking 1 -barracks 1 -barracuda/1 1 -barrage/28 1 -Barranquilla -barre/28 1 -barrel/23 1 -barreling 1 -barren/106 1 -Barrera/3 -Barrett/3 -barrette/1 1 -barricade/28 1 -Barrie/2 1 -barrier/1 1 -barring/10 1 -barrio/1 1 -barrister/1 1 -Barron/3 -barroom/1 1 -barrow/1 1 -Barry -Barrymore -Bart -bartender/1 1 -barter/23 1 -barterer/1 1 -Barth -Barthes -Bartholdi/3 -Bartholomew -Bartlett -Bartok -Barton -bar 1 -Baruch -barycenter 1 -barycentric -baryon/1 1 -Baryshnikov -basal/8 1 -basalt/1 1 -basaltic -base/107 1 -baseball/1 1 -baseboard/1 1 -Basel/2 1 -baseless 1 -baseline/1 1 -baseman/2 112 -basemen 113 -basement/1 1 -bases 114 -bash/22 1 -bashful/16 1 -bashing/2 1 -Basho/3 -Basic -basic/1 1 -BASIC/1 1 -basic/39 1 -Basie -Basil -basil/2 1 -basilica/1 1 -basilica's 115 -basilica 116 -basilisk/1 1 -basin/1 1 -basinful/1 1 -basis/2 117 -bask/11 1 -basket/1 1 -basketball/1 1 -basketful 1 -basketry/2 1 -basketwork/2 1 -Basque/1 1 -basque/10 1 -Basra -Bass/3 -bass/4 1 -basset/18 1 -Basseterre/2 1 -bassinet/1 1 -bassist/1 1 -basso/1 1 -bassoon/1 1 -bassoonist/1 1 -bass 1 -basswood/1 1 -bast/108 1 -bastard/1 1 -bastardization/1 1 -bastardize/6 1 -bastard 1 -bastardy/2 1 -baste/43 1 -baster/1 1 -Bastille/3 -basting 1 -bastion/1 1 -Basutoland/2 1 -bat/109 1 -Bataan/2 1 -batch/22 1 -bate/43 1 -Bates 118 -bath/23 1 -bathe/28 1 -bather/1 1 -bathetic -bathhouse/1 1 -bathing/2 1 -bathmat/1 1 -bathos/2 1 -bathrobe/1 1 -bathroom/1 1 -Bathsheba -bathtub/1 1 -bathwater 1 -bathyscaph/1 1 -bathyscaphe/1 1 -bathysphere/1 1 -batik/18 1 -Batista -batiste/2 1 -Batman/3 -batman/2 119 -batmen 120 -baton/1 1 -batsman/2 121 -batsmen 122 -battalion/1 1 -batten/23 1 -battening 1 -batter/23 1 -batterer/1 1 -batterings -battery/15 1 -batting/2 1 -Battle/3 -battle/28 1 -battleax/4 1 -battleaxe/1 1 -battledore/18 1 -battledress -battlefield/1 1 -battlefront/1 1 -battleground/1 1 -battlement/1 1 -battler/1 1 -battleship/1 1 -battling 1 -Batu/3 -batty/34 1 -bauble/1 1 -baud/1 1 -Baudelaire/2 1 -Baudouin/3 -Bauer -Bauhaus/2 1 -baulk/23 1 -Baum -bauxite/2 1 -Bavaria/2 1 -Bavarian 1 -bawd/1 1 -bawdy/50 1 -bawl/23 1 -bawling 1 -Baxter/3 -bay/23 1 -Bayamon -bayberry/15 1 -Bayer/2 1 -Bayes -Bayesian -Bayeux/3 -Baylor/3 -bayonet/23 1 -Bayonne/2 1 -bayou/1 1 -Bayreuth -bay 1 -Baywatch/3 -bazaar/1 1 -bazillion -bazillions -bazooka/1 1 -BB/2 1 -BBB -BBC -bbl 1 -BBQ -BBS/89 1 -BC/2 1 -bdrm -Be/2 1 -be/110 123 -Beach/3 -beach/22 1 -beachcomber/1 1 -beachfront 1 -beachhead/1 1 -beachwear/2 1 -beacon/18 1 -bead/23 1 -beading/2 1 -Beadle -beadle/1 1 -beady/34 1 -beagle/18 1 -beak/62 1 -beaker/1 1 -beam/23 1 -beaming 1 -Bean/3 -bean/23 1 -beanbag/1 1 -beanfeast/10 1 -beanie/1 1 -beanpole/1 1 -beansprout -beansprouts -beanstalk/1 1 -bear/86 124 -bearable/19 1 -Beard/3 -beard/23 1 -beardless 1 -Beardmore/3 -Beardsley -bearer/1 1 -bearing/1 1 -bearish/16 1 -bearlike 1 -Bearnaise/3 -bearskin/1 1 -Beasley/3 -beast/1 1 -beastly/111 1 -beat/112 1 -beatable 1 -beater/1 1 -beatific/39 1 -beatification/1 1 -beatify/31 1 -beating/1 1 -beatitude/1 1 -Beatlemania/3 -Beatles/3 -beatnik/1 1 -Beatrice/2 1 -Beatrix/3 -Beatriz/3 -Beau/3 -beau/18 1 -Beaufort -Beaujolais/2 1 -Beaumarchais -Beaumont -Beauregard/3 -beaut/1 1 -beauteous/8 1 -beautician/1 1 -beautification/2 1 -beautifier/1 1 -beautiful/75 1 -beautify/31 1 -beaut 1 -beauty/15 1 -Beauvoir -beaver/23 1 -bebop/18 1 -becalm/11 1 -became 125 -because -Bechtel/3 -Beck/3 -beck/18 1 -Becker/3 -Becket/2 1 -Beckett/2 1 -beckon/5 1 -Becky/3 -becloud/11 1 -become/14 126 -becoming/8 1 -Becquerel -becquerel/10 1 -bed/113 1 -bedaub/11 1 -bedazzle/6 1 -bedazzlement/2 1 -bedbug/1 1 -bedchamber/10 1 -bedclothes/2 1 -bedder 1 -bedding/2 1 -Bede -bedeck/11 1 -bedevil/11 1 -bedevilment/2 1 -bedfellow/1 1 -bedhead/10 1 -bedim/114 1 -bedizen/11 1 -bedlam/1 1 -bedlinen -bedmaker/10 1 -Bedouin/1 1 -bedpan/1 1 -bedpost/1 1 -bedraggle/6 1 -bedridden -bedrock/1 1 -bedroll/1 1 -bedroom/1 1 -bedsheets -bedside/1 1 -bedsit/10 1 -bedsitter/10 1 -bedsore/1 1 -bedspread/1 1 -bedstead/1 1 -bedtime/1 1 -bee/1 1 -Beebe/3 -beebread/2 1 -beech/4 1 -Beecher -beechnut/1 1 -beechwood 1 -beef/115 1 -Beefaroni/3 -beefburger/1 1 -beefcake/1 1 -beefeater 1 -beefsteak/1 1 -beefy/49 1 -beehive/1 1 -beekeeper/1 1 -beekeeping/2 1 -beeline/18 1 -Beelzebub/2 1 -beep/23 1 -beeper/1 1 -beer/1 1 -Beerbohm -beermat -beermats -beery/34 1 -beeswax/2 1 -beet/1 1 -Beethoven/2 1 -beetle/28 1 -beetling 1 -Beeton/3 -beetroot/10 1 -befall/116 127 -befell 128 -befit/12 1 -befitting/8 1 -befog/117 1 -beforehand -before 1 -befoul/11 1 -befriend/11 1 -befuddle/6 1 -befuddlement/2 1 -beg/118 1 -began 129 -beget/88 130 -begetter/10 1 -beggar/23 1 -beggarly 1 -beggary/2 1 -begging 1 -Begin -begin/119 131 -beginner/1 1 -beginning/1 1 -begone 1 -begonia/1 1 -begot 132 -begotten 132 -begrime/6 1 -begrudge/6 1 -begrudging/8 1 -beguile/6 1 -beguilement/2 1 -beguiler/1 1 -beguilingly -beguine/1 1 -begum/18 1 -begun 129 -behalf/120 1 -Behan -behave/6 1 -behavior/1 1 -behavioral/8 1 -behaviorism/2 1 -behaviorist/1 1 -behead/11 1 -beheading 1 -beheld 133 -behemoth/1 1 -behest/1 1 -behind/1 1 -behindhand -behind 1 -behold/121 134 -beholden -beholder/1 1 -behoove/6 1 -Behring -Beiderbecke -beige/2 1 -Beijing/2 1 -being/1 1 -Beirut/2 1 -bejewel/11 1 -Bekesy/3 -Bela/3 -belabor/11 1 -Belarus/2 1 -belated/83 1 -Belau/3 -belay/5 1 -belch/22 1 -beleaguer/11 1 -Belem/3 -Belfast/2 1 -belfry/15 1 -Belg -Belgian/1 1 -Belgium/2 1 -Belgrade/2 1 -belie/122 135 -belief/123 1 -believability 1 -believable/19 1 -believe/6 1 -believer/1 1 -Belinda/3 -belittle/6 1 -belittlement/2 1 -Belize/2 1 -bell/1 1 -Bell/2 1 -bell/11 1 -Bella/3 -belladonna/2 1 -Bellamy/3 -Bellatrix/3 -bellboy/1 1 -belle/28 1 -Belleek 1 -belletrist/1 1 -belletristic -bellhop/1 1 -bellicose 1 -bellicosity/2 1 -belligerence/2 1 -belligerency/2 1 -belligerent/30 1 -belling 1 -Bellini -bellman/2 136 -bellmen 137 -Bellow -bellow/23 1 -bellwether/1 1 -Belmont/3 -Belmopan -belong/11 1 -belonging/1 1 -Belorussia/2 1 -Belorussian/1 1 -beloved/1 1 -below 1 -Belshazzar/2 1 -belt/23 1 -Beltane 1 -belting 1 -beltway/1 1 -beluga/1 1 -Belushi/3 -belying 138 -belly/31 1 -bellyache/28 1 -bellybutton/1 1 -bellyful/1 1 -bellying 1 -belly's -bemire/6 1 -bemoan/11 1 -bemoaning 1 -bemuse/6 1 -bemused/8 1 -bemusement/2 1 -Ben/3 -Benacerraf/3 -Benares -bench/22 1 -Benchley/3 -benchmark/86 1 -benchmarking 1 -bend/124 1 -bendable 1 -bended 1 -Bender/3 -bender/1 1 -bending 1 -Bendix/3 -bendy/34 1 -beneath 1 -Benedict/2 1 -Benedictine/1 1 -benedictine 1 -benediction/1 1 -benedictory -benefaction/1 1 -benefactor/1 1 -benefactress/4 1 -benefice/18 1 -beneficence/2 1 -beneficent/8 1 -beneficial/8 1 -beneficiary/15 1 -benefit/23 1 -Benelux/2 1 -Benet -Benetton/3 -benevolence/1 1 -benevolent/8 1 -Bengal/1 1 -Bengali/2 1 -Benghazi/2 1 -benightedly -benighted 1 -benign/8 1 -benignant 1 -benignity/2 1 -Benin/2 1 -Beninese/2 1 -Benin 1 -Benita/3 -Benito/3 -Benjamin -Bennett -Bennie/3 -Benson/3 -bent/1 1 -Bentham -Bentley -Benton -bentwood/2 1 -benumb/11 1 -benumbed 1 -Benz -Benzedrine/2 1 -benzene/2 1 -benzine/2 1 -Benny/3 -Beowulf -bequeath/11 1 -bequest/1 1 -berate/6 1 -Berber/1 1 -bereave/6 139 -bereavement/1 1 -bereft 140 -Berenice/3 -beret/1 1 -Beretta/3 -Berg -berg/1 1 -Bergen/2 1 -Berger/3 -Bergerac -Bergman -Bergson -Beria -beriberi/2 1 -Bering -berk/10 1 -Berkeley/2 1 -berkelium/2 1 -Berkshire/1 1 -Berle/3 -Berlin/1 1 -Berliner/1 1 -Berlioz -Berlitz/3 -berm/1 1 -Bermuda/1 1 -Bermudan/1 1 -Bermudian/1 1 -Bern/2 1 -Bernadette -Bernadine/3 -Bernanke/3 -Bernard -Bernardo/3 -Bernays/3 -Bernbach/3 -Berne/2 1 -Bernese -Bernhardt -Bernice/3 -Bernie/3 -Bernini -Bernoulli -Bernstein -Berra/3 -Berry -berry/56 1 -berrying 1 -berrylike 1 -berserk 1 -Bert/3 -Berta/3 -Bertelsmann/3 -berth/23 1 -Bertha/3 -Bertie/3 -Bertillon/3 -Bertram/3 -Bertrand/3 -Beryl/3 -beryl/1 1 -beryllium/2 1 -Berzelius -beseech/125 141 -beseecher/1 1 -beseeching/8 1 -beseem/11 1 -beseeming 1 -beset/88 1 -beside/10 1 -besiege/6 1 -besieger/1 1 -besieging 1 -besmear/11 1 -besmirch/7 1 -besom/18 1 -besot/12 1 -besotted 1 -besought 142 -bespangle/6 1 -bespatter/11 1 -bespeak/121 143 -bespectacled -bespoken 144 -bespoke 144 -Bess -Bessel -Bessemer/3 -Bessie -Best/3 -best/23 1 -bestial/8 1 -bestiality/2 1 -bestiary/15 1 -bestir/13 1 -bestow/11 1 -bestowal/1 1 -bestrew/126 1 -bestride/127 145 -bestrode 146 -bestseller/1 1 -bestselling -best 147 -bet/128 1 -beta/1 1 -betake/76 148 -beta's 149 -beta 150 -betcha -betel/2 1 -Betelgeuse/2 1 -Beth/3 -Bethany -Bethe -Bethesda -bethink/121 151 -Bethlehem -bethought 152 -Bethune -betide/6 1 -betimes -betoken/11 1 -betook 153 -betray/11 1 -betrayal/1 1 -betrayer/1 1 -betroth/11 1 -betrothal/1 1 -betrothed/2 1 -Betsy/3 -Bette/3 -better/23 1 -bettering 1 -betterment/2 1 -better 147 -Bettie/3 -betting 1 -bettor/1 1 -between 1 -betwixt 1 -Betty/3 -Bettye/3 -Beulah -bevel/23 1 -bevelings -bevel 1 -beverage/1 1 -Beverley/3 -Beverly/3 -bevvy/60 1 -bevy/15 1 -bewail/11 1 -bewailing 1 -beware/6 1 -bewhiskered -bewigged -bewilder/11 1 -bewildered 1 -bewildering/8 1 -bewilderment/2 1 -bewitch/7 1 -bewitching/8 1 -bewitchment/2 1 -bey/1 1 -Beyer -beyond 1 -bezel/1 1 -bf -bhaji 1 -Bhopal -Bhutan/2 1 -Bhutanese/2 1 -Bhutto/3 -bi/129 1 -Bi/2 1 -BIA -Bialystok -Bianca/3 -biannual/8 1 -bias/22 1 -biased 1 -biasing 1 -bias 1 -biathlon/1 1 -Bib -bib/18 1 -bible/1 1 -Bible/1 1 -biblical 1 -Biblical 1 -biblicists -bibliographer/1 1 -bibliographic -bibliographical/8 1 -bibliography/15 1 -bibliophile/1 1 -bibulous 1 -Bic/3 -bicameral -bicameralism/2 1 -bicarb/1 1 -bicarbonate/1 1 -bicentenary/15 1 -bicentennial/1 1 -bicep/130 1 -biceps/2 1 -bicker/23 1 -bickerer/1 1 -biconcave -biconvex -bicuspid/1 1 -bicycle/28 1 -bicycler/1 1 -bicyclist/1 1 -bid/131 154 -biddable 1 -bidder/1 1 -bidding/2 1 -Biddle -biddy/15 1 -bide/14 155 -Biden/3 -bidet/1 1 -bidirectional -bidirectionally -biennial/30 1 -biennium/1 1 -bier/1 1 -Bierce -bier 156 -biff/5 1 -bifocal/32 1 -bifurcate/6 1 -bifurcation/1 1 -big/132 1 -bigamist/1 1 -bigamous 1 -bigamy/2 1 -Bigfoot/2 1 -biggie/1 1 -biggish 1 -Biggles/3 -bighead/1 1 -bighearted/33 1 -bighorn/1 1 -bight/18 1 -bigmouth/1 1 -bigot/1 1 -bigoted 1 -bigotry/15 1 -big 1 -bigwig/1 1 -bijou/100 1 -bike/28 1 -biker/1 1 -bikini/1 1 -Biko/3 -bilabial/1 1 -bilateral/8 1 -Bilbao -bilberry/60 1 -Bilbo/3 -bile/2 1 -bilge/18 1 -bilharzia 1 -biliary 1 -bilingual/30 1 -bilingualism/2 1 -bilious/33 1 -bilk/5 1 -bilker/1 1 -Bill/3 -bill/23 1 -billable 1 -billboard/18 1 -billet/23 1 -billfold/1 1 -billhook/10 1 -billiard/32 1 -Billie/3 -billies -billing/1 1 -Billings/2 1 -billingsgate/2 1 -billion/1 1 -billionaire/1 1 -billionaires 1 -billionth/1 1 -billion 1 -billow/23 1 -billowy/34 1 -billposters -billy/3 -Billy/3 -billycan/10 1 -bimbo/1 1 -bimetallic/1 1 -bimetallism/2 1 -Bimini/3 -bimodal -bimonthlies -bimonthly's -bimonthly 1 -bin/133 1 -binary/15 1 -bind/86 157 -binder/1 1 -bindery/15 1 -binding/1 1 -bindweed/2 1 -binge/28 1 -bingo/2 1 -binman 158 -binmen 159 -binnacle/1 1 -binocular/1 1 -binodal -binomial/1 1 -bio/1 1 -biochemical/30 1 -biochemist/1 1 -biochemistry/2 1 -biodegradability/2 1 -biodegradable -biodegrade/6 1 -biodiversity/2 1 -bioengineering 1 -bioethics -bioethics's -biofeedback/2 1 -biographer/1 1 -biographic -biographical/8 1 -biography/15 1 -biog 1 -Bioko/2 1 -biol -biological/8 1 -biologic 1 -biologist/1 1 -biology/2 1 -biomass/2 1 -biomedical -biometric/10 1 -biometry 1 -biomorph 1 -bionic/32 1 -bionically -bionic 1 -biophysical 1 -biophysicist/1 1 -biophysics/2 1 -biopic/1 1 -biopsy/56 1 -biorhythm/1 1 -BIOS -biosphere/1 1 -biota 1 -biotechnological 1 -biotechnologist 1 -biotechnology/2 1 -biotic 1 -biotin/2 1 -bipartisan -bipartisanship/2 1 -bipartite 1 -biped/1 1 -bipedal -bipedalism 1 -biped 1 -biplane/1 1 -bipolar -bipolarity/2 1 -biracial -birch/22 1 -Bird -bird/23 1 -birdbath/1 1 -birdbrain/1 1 -birdbrained -birdcage/10 1 -birder/1 1 -birdhouse/1 1 -birdie/63 1 -birding 1 -birdlike -birdlime/2 1 -birdseed/2 1 -Birdseye/3 -birdsong 1 -birdtables -birdwatcher/1 1 -birdwatching 1 -birdying -birefringence 1 -birefringent -biretta/1 1 -Birkenstock -Birmingham/2 1 -Biro/2 1 -birth/23 1 -birthday/1 1 -birthing 1 -birthmark/1 1 -birthplace/1 1 -birthrate/1 1 -birthright/1 1 -birthstone/1 1 -Biscay -Biscayne/3 -biscuit/1 1 -bisect/11 1 -bisection/1 1 -bisector/1 1 -bisexual/30 1 -bisexuality/2 1 -Bishkek -Bishop/3 -bishop/18 1 -bishopric/1 1 -Bismarck/2 1 -Bismark/3 -bismuth/2 1 -bison/2 1 -bisque/2 1 -Bisquick/3 -Bissau/2 1 -bi's 160 -bistable -bi 161 -bistro/1 1 -bis 1 -bit/18 1 -bitch/22 1 -bitchily 1 -bitchy/49 1 -bite/134 1 -biter/1 1 -biting/8 1 -bitmap/10 1 -BITNET/10 1 -bitter/135 1 -bittern/1 1 -bittersweet/1 1 -bittiness -bitumen/2 1 -bituminous -bitty/34 1 -bivalent 1 -bivalve/1 1 -bivouac/64 1 -biweeklies -biweekly's -biweekly 1 -biyearly 1 -biz/2 1 -bizarre/83 1 -Bizet -Bjerknes/3 -Bjork/3 -bk -Bk/2 1 -bl -blab/136 1 -blabber/5 1 -blabbermouth/1 1 -blabbing 1 -black/38 1 -Black/1 1 -black/11 1 -blackamoor/1 1 -blackball/23 1 -Blackbeard/2 1 -blackberry/137 1 -blackbird/18 1 -blackboard/1 1 -Blackburn/2 1 -blackcurrant/10 1 -blacken/11 1 -blackening 1 -Blackfeet 162 -Blackfoot/2 163 -blackguard/18 1 -blackhead/1 1 -blacking/2 1 -blackish 1 -blackjack/23 1 -blackleg/70 1 -blacklist/23 1 -blacklisting 1 -blackmail/23 1 -blackmailer/1 1 -blackout/1 1 -Blackpool/2 1 -Blackshirt/2 1 -blackshirts -blacksmith/1 1 -blacksnake/1 1 -Blackstone -blackthorn/1 1 -blacktop/47 1 -Blackwell -bladder/1 1 -blade/77 1 -blag/117 1 -blagging 1 -blah/138 1 -Blaine/3 -Blair/3 -Blake -blamable 1 -blame/139 1 -blameable 1 -blameless/16 1 -blamer 1 -blameworthy/140 1 -blammo -blammoed -blammoing -blammos -Blanca/3 -blanch/7 1 -Blanchard/3 -Blanche/3 -blancmange/1 1 -bland/21 1 -blandish/7 1 -blandishment/1 1 -blank/52 1 -Blankenship/3 -blanket/23 1 -blanketing 1 -blanket 1 -Blantyre/3 -blare/28 1 -blarney/23 1 -blase 1 -blaspheme/6 1 -blasphemer/1 1 -blasphemous/8 1 -blasphemy/15 1 -blast/23 1 -blaster/1 1 -blasting 1 -blastoff/1 1 -blat/58 1 -blatancy/15 1 -blatant/8 1 -blather/23 1 -Blatz/3 -Blavatsky -blaze/28 1 -blazer/1 1 -blazing 1 -blazon/23 1 -blazoning 1 -bldg -bleach/22 1 -bleacher/1 1 -bleaching 1 -bleak/21 1 -blear 1 -bleary/50 1 -bleat/23 1 -bleating 1 -bled 164 -bleed/141 165 -bleeder/1 1 -bleeding/2 1 -bleep/23 1 -bleeper/1 1 -blemish/22 1 -blench/7 1 -blend/23 1 -blender/1 1 -blending 1 -Blenheim/2 1 -bless/7 1 -blessed/21 1 -blessing/1 1 -bletch -blether/5 1 -blethering 1 -Blevins/3 -blew 166 -Bligh/2 1 -blight/23 1 -blighter/10 1 -blighting 1 -blimey 1 -blimp/1 1 -blimpish 1 -blind/52 1 -blinder/1 1 -blindfold/23 1 -blindfolded 1 -blindfold 1 -blinding/8 1 -blindside/6 1 -blini/1 1 -blink/23 1 -blinker/23 1 -blinking 1 -blinks 1 -blintz/4 1 -blintze/1 1 -blip/18 1 -bliss/2 1 -blissful/16 1 -bliss 1 -blister/23 1 -blistering/8 1 -blistery 1 -blithe/27 1 -blither/142 1 -blithesome 1 -blitz/22 1 -blitzkrieg/18 1 -blivet/10 1 -blizzard/1 1 -bloat/5 1 -bloated 1 -bloater/10 1 -bloating 1 -bloatware -bloatwares -blob/136 1 -bloc/64 1 -Bloch -block/23 1 -blockade/28 1 -blockader/1 1 -blockage/1 1 -Blockbuster/3 -blockbuster/1 1 -blockbusting/2 1 -blocker/1 1 -blockhead/1 1 -blockhouse/1 1 -blocking 1 -Bloemfontein/2 1 -blog/3 -blogged -blogger/3 -bloggers -blogging -blogs -bloke/1 1 -blokish -blond/106 1 -blonde/41 1 -Blondel/3 -Blondie/3 -blondish 1 -blood/23 1 -bloodbath/1 1 -bloodcurdling -bloodhound/1 1 -blooding 1 -bloodless/16 1 -bloodletting/2 1 -bloodline/1 1 -bloodmobile/1 1 -bloodshed/2 1 -bloodshot 1 -bloodsport/10 1 -bloodstain/1 1 -bloodstained -bloodstock/2 1 -bloodstone 1 -bloodstream/1 1 -bloodsucker/1 1 -bloodsucking 1 -bloodthirsty/50 1 -bloodworm 1 -bloody/143 1 -bloodymindedness -Bloom/3 -bloom/23 1 -Bloomer -bloomer/1 1 -Bloomfield -Bloomingdale/3 -blooming 1 -Bloomsbury -bloop/23 1 -blooper/1 1 -blossom/23 1 -blossoming 1 -blossomy 1 -blot/109 1 -blotch/22 1 -blotching 1 -blotchy/34 1 -blotter/1 1 -blotting 1 -blotto 1 -blouse/28 1 -blow/144 167 -blower/1 1 -blowflies -blowfly/3 -blowgun/1 1 -blowhard/1 1 -blowhole/10 1 -blowlamp/10 1 -blowout/1 1 -blowpipe/1 1 -blows 1 -blowsy/34 1 -blowtorch/40 1 -blowup/1 1 -blowy/34 1 -blowzy/34 1 -BLT/1 1 -blub/145 1 -blubber/23 1 -blubbery 1 -Blucher/3 -bludgeon/23 1 -blue/146 1 -Bluebeard/2 1 -bluebell/1 1 -blueberry/15 1 -bluebird/1 1 -bluebonnet/1 1 -bluebottle/1 1 -bluefish/4 1 -bluegill/1 1 -bluegrass/2 1 -blueing's -blueish 1 -bluejacket/1 1 -bluejay/1 1 -bluejeans/2 1 -bluenose/1 1 -bluepoint/1 1 -blueprint/23 1 -bluestocking/1 1 -bluesy/34 1 -bluet/1 1 -bluff/52 1 -bluffer/1 1 -bluing/2 1 -bluish 1 -blunder/23 1 -blunderbuss/4 1 -blunderer/1 1 -blundering/10 1 -blunt/98 1 -blur/103 1 -blurb/18 1 -blurred 1 -blurry/49 1 -blurt/11 1 -blurting 1 -blush/147 1 -blusher/1 1 -blushing/8 1 -bluster/23 1 -blusterer/1 1 -blustering 1 -blusterous 1 -blustery 1 -blvd -Blvd -Blythe/3 -BM/2 1 -BMW/3 -BO -boa/1 1 -Boadicea -boar/1 1 -board/23 1 -boarder/1 1 -boardgames -boarding/1 1 -boardinghouse/1 1 -boardroom/1 1 -boardwalk/1 1 -Boas/3 -boa's 168 -boast/23 1 -boa 169 -boaster/1 1 -boastful/16 1 -boasting 1 -boat/23 1 -boatclubs -boater/1 1 -boathouse/1 1 -boating/2 1 -boatload/10 1 -boatman/2 170 -boatmen 171 -boatswain/1 1 -boatyard/10 1 -Bob/3 -bob/136 1 -Bobbi/3 -Bobbie/3 -bobbin/1 1 -Bobbitt/3 -bobble/28 1 -Bobby/3 -bobby/15 1 -bobbysoxer/1 1 -bobcat/1 1 -bobolink/1 1 -bobsled/113 1 -bobsledder/1 1 -bobsledding 1 -bobsleigh/18 1 -bobtail/18 1 -bobwhite/1 1 -Boccaccio -bocce/2 1 -bocci/2 1 -boccie/2 1 -bock/2 1 -bod/18 1 -bodacious -bode/6 1 -bodega/1 1 -bode 172 -bodge/6 1 -Bodhidharma/3 -Bodhisattva/2 1 -bodice/1 1 -bodiless 1 -bodily 1 -boding 1 -bodkin/1 1 -body/148 1 -bodybuilder/1 1 -bodybuilding/2 1 -bodyguard/1 1 -bodysuit/1 1 -body 1 -bodywork/2 1 -Boeing/3 -Boeotia/2 1 -Boeotian 1 -Boer/1 1 -Boethius -boffin/10 1 -boffo 1 -bog/92 1 -boga -Bogart/2 1 -bogey/23 1 -bogeyman/2 173 -bogeymen 174 -boggle/6 1 -bogglingly -bogie/18 1 -bogometer -bogometers -bogon -bogosities -bogosity -Bogota/2 1 -bogotified -bogotifies -bogotify -bogotifying -bogus 1 -bogy/15 1 -boggy/34 1 -bogyman/2 175 -bogymen 176 -bohemian/1 1 -Bohemian/1 1 -bohemianism/2 1 -Bohemia 1 -Bohr -boil/23 1 -boiler/1 1 -boilermaker/1 1 -boilerplate/2 1 -boiling/10 1 -boink/11 1 -Boise/2 1 -boisterous/16 1 -Bojangles/3 -bola/1 1 -bolas 1 -bold/21 1 -boldface/149 1 -bold 1 -bole/1 1 -bolero/1 1 -Boleyn/2 1 -Bolivar/2 1 -bolivar/71 1 -Bolivia/2 1 -Bolivian/1 1 -boll/18 1 -bollard/10 1 -bollix/22 1 -bollocking -bollockings -bollocks 1 -bologna/2 1 -Bologna/2 1 -boloney/2 1 -Bolshevik/1 1 -bolshevik/2 1 -Bolshevism 1 -Bolshevist 1 -bolshie 1 -Bolshoi/3 -bolshy 1 -bolster/23 1 -bolstering 1 -bolt/23 1 -bolthole/10 1 -bolting 1 -Bolton -bolt 1 -Boltzmann -bolus/4 1 -Bollywood/3 -bomb/23 1 -bombard/5 1 -bombardier/1 1 -bombardment/1 1 -bombast/2 1 -bombastic/39 1 -Bombay/2 1 -bomber/1 1 -bombing/10 1 -bombproof 1 -bombshell/1 1 -bombsite/10 1 -bonanza/1 1 -Bonaparte -Bonaventure -bonbon/1 1 -bonce/10 1 -Bond/3 -bond/23 1 -bondage/2 1 -bondholder/1 1 -bonding/2 1 -bondman/2 177 -bondmen 178 -bondsman/2 179 -bondsmen 180 -bond 1 -bondwoman/2 181 -bondwomen 182 -bone/139 1 -bonehead/1 1 -boneheaded 1 -boneless 1 -bonemeal 1 -boner/1 1 -boneshaker/10 1 -boney 183 -bonfire/1 1 -bong/23 1 -bongo/1 1 -Bonhoeffer/3 -bonhomie/2 1 -bonier 184 -boniest 184 -Boniface -boning 1 -Bonita/3 -bonito/1 1 -bonk/11 1 -bonkers 1 -Bonn/2 1 -Bonner/3 -bonnet/18 1 -Bonneville/3 -Bonnie/3 -bonnie/150 1 -Bono/3 -bonsai/1 1 -bonus/4 1 -bony/49 1 -bonny/34 1 -boo/23 1 -boob/23 1 -booboo/1 1 -booby/15 1 -boodle/18 1 -booger/10 1 -boogeyman/2 185 -boogeymen 186 -boogie/63 1 -boogieman/3 -boohoo/23 1 -book/23 1 -bookable 1 -bookbinder/1 1 -bookbindery/15 1 -bookbinding/2 1 -bookcase/1 1 -bookend/18 1 -Booker/3 -bookie/1 1 -booking/1 1 -bookish 1 -bookkeeper/1 1 -bookkeeping/2 1 -booklet/1 1 -bookmaker/1 1 -bookmaking/2 1 -bookmark/23 1 -bookmobile/1 1 -bookplate/1 1 -bookseller/1 1 -bookshelf/120 1 -bookshop/1 1 -bookstall/10 1 -bookstore/1 1 -book 1 -bookwork 1 -bookworm/1 1 -Boole/2 1 -Boolean 1 -Boole 1 -boom/23 1 -boombox/4 1 -boomer/10 1 -boomerang/23 1 -booming 1 -boon/1 187 -boondocks -boondocks's -boondoggle/28 1 -boondoggler/1 1 -Boone/2 1 -boonies/2 1 -boon 1 -boor/1 1 -boorish/151 1 -boost/23 1 -booster/1 1 -boot/23 1 -bootblack/1 1 -bootee/1 1 -Bootes/2 1 -Booth -booth/1 1 -bootlace/10 1 -bootleg/152 1 -bootlegger/1 1 -bootlegging/2 1 -bootless 1 -bootprints -bootstrap/47 1 -boots 1 -booty/15 1 -booze/28 1 -boozer/1 1 -boozier 188 -booziest 188 -boozy/34 1 -bop/47 1 -borax/2 1 -Bordeaux/2 1 -bordello/1 1 -Borden/3 -border/23 1 -borderland/1 1 -borderline/1 1 -border 1 -Bordon/3 -bore/28 1 -Boreas/2 1 -boredom/2 1 -borehole/10 1 -borer/1 1 -bore 189 -Borg/1 1 -Borges -Borgia -Borglum -boring/8 1 -Boris -Bork/3 -Borlaug/3 -Born -Borneo/2 1 -borne 189 -born 189 -Borobudur/3 -Borodin -boron/2 1 -borough/1 1 -borrow/11 1 -borrowable -borrower/1 1 -borrowing/1 1 -borsch/2 1 -borscht/2 1 -borstal/10 1 -Boru/3 -borzoi/1 1 -Bosch -Bose -bosh/2 1 -Bosnia/2 1 -Bosnian 1 -bosom/18 1 -bosomy/34 1 -boson/10 1 -Bosporus/2 1 -boss/147 1 -bossily 1 -bossism/2 1 -bossy/49 1 -Boston/1 1 -Bostonian 1 -bosun/1 1 -Boswell 1 -bot/10 1 -botanical/8 1 -botanic 1 -botanist/1 1 -botany/2 1 -botch/22 1 -botched 1 -botcher/1 1 -botching 1 -both/44 1 -bother/23 1 -botheration 1 -bothersome -both 1 -bothy 1 -Botswana/2 1 -Botticelli -bottle/28 1 -bottleneck/18 1 -bottler/1 1 -bottling 1 -bottom/23 1 -bottomless 1 -bottommost -bottom 1 -botulism/2 1 -Boudicca -boudoir/1 1 -bouffant/1 1 -bougainvillaea/10 1 -bougainvillea/1 1 -bough/1 1 -bought 190 -bouillabaisse/1 1 -bouillon/1 1 -Boulder -boulder/18 1 -boules -boulevard/1 1 -Boulez/3 -bounce/28 1 -bouncer/1 1 -bouncily 1 -bouncing 1 -bouncy/49 1 -bound/23 1 -boundary/15 1 -bounded/153 1 -bounden 1 -bounder/1 1 -bounding 1 -boundless/16 1 -bound 191 -bounteous/16 1 -bountiful/16 1 -bounty/15 1 -bouquet/1 1 -Bourbaki/3 -bourbon/1 1 -Bourbon/1 1 -bourgeois/2 1 -bourgeoisie/2 1 -Bournemouth -boustrophedon/10 1 -bout/1 1 -boutique/1 1 -boutonniere/1 1 -bouzouki/1 1 -Bovary/3 -bovine/1 1 -bovver -bow/78 1 -Bowditch/3 -bowdlerization/1 1 -bowdlerize/6 1 -bowed 1 -bowel/18 1 -Bowell/3 -Bowen/3 -bower/18 1 -Bowers -Bowery/2 1 -bowie -Bowie -bowing 1 -bowl/23 1 -bowlder/1 1 -bowleg/1 1 -bowlegged 1 -bowleg 1 -bowler/1 1 -bowlful/1 1 -bowline/1 1 -bowling/2 1 -Bowman/3 -bowman/2 192 -bowmen 193 -bowsprit/1 1 -bowstring/18 1 -bows 1 -bowwow/18 1 -box/22 1 -boxcar/1 1 -boxen -boxer/1 1 -boxful 1 -boxing/2 1 -boxlike 1 -boxroom/10 1 -boxtops -boxwood/2 1 -boxy/34 1 -boy/1 1 -boycott/23 1 -Boyd -Boyer/3 -boyfriend/1 1 -boyhood/1 1 -boyish/16 1 -Boyle -boyscout -boysenberry/15 1 -bozo/1 1 -BP -BPOE -bps 1 -BR -Br/2 1 -bra/154 1 -brace/28 1 -bracelet/1 1 -bracer/1 1 -bracero/1 1 -bracing/8 1 -bracken/2 1 -bracket/23 1 -brackish/33 1 -bract/1 1 -Brad/3 -brad/18 1 -bradawl/10 1 -Bradbury 1 -Braddock/3 -Bradford -Bradley -Bradly/3 -Bradshaw/3 -Bradstreet/3 -Brady -brae/1 1 -brag/152 1 -Bragg/2 1 -braggadocio/1 1 -braggart/1 1 -bragger/1 1 -bragging 1 -Brahe -Brahma/1 1 -Brahmagupta/3 -Brahman/1 1 -Brahmanee -Brahmani -Brahmanism/1 1 -Brahmaputra/2 1 -Brahmin/1 1 -Brahms/2 1 -braid/23 1 -braiding/2 1 -Braille/1 1 -braille/2 1 -Braille/58 1 -braille 1 -Brain/3 -brain/23 1 -braincell -braincells -brainchild/155 1 -brainless/83 1 -brainpower 1 -brainstorm/23 1 -brainstorming/2 1 -brainteaser/1 1 -brainteasing -brainwash/7 1 -brainwashing/2 1 -brainwave/10 1 -brainy/49 1 -braise/6 1 -brake/28 1 -brakeman/2 194 -brakemen 195 -bramble/18 1 -brambly/34 1 -Brampton/3 -Bran/3 -bran/2 1 -Branch/3 -branch/22 1 -branching 1 -branchlike 1 -brand/23 1 -Brandeis -Branden/3 -Brandenburg -brander/18 1 -Brandi/3 -Brandie/3 -brandish/156 1 -Brando -Brandon/3 -Brandt -Brandy/3 -brandy/56 1 -Brant/3 -bran 1 -Braque -bras/157 1 -brash/21 1 -Brasilia/2 1 -brass/40 1 -brasserie/1 1 -brassiere/1 1 -brassier 1 -brass 1 -brassy/50 1 -brat/1 1 -Bratislava -Brattain/3 -bratwurst/1 1 -bratty/34 1 -bravado/2 1 -brave/107 1 -braver 1 -bravery/2 1 -bravo/18 1 -bravura/1 1 -brawl/23 1 -brawler/1 1 -brawling 1 -brawn/2 1 -brawny/49 1 -Bray/3 -bray/23 1 -braze/6 1 -brazen/158 1 -brazer/1 1 -brazier/1 1 -Brazil/2 1 -Brazilian/1 1 -Brazos/2 1 -Brazzaville/2 1 -breach/22 1 -bread/23 1 -breadbasket/1 1 -breadboard/18 1 -breadbox/4 1 -breadcrumb/1 1 -breadfruit/1 1 -breadline/1 1 -breadth/1 1 -breadwinner/1 1 -break/86 196 -breakable/1 1 -breakage/1 1 -breakaway/1 1 -breakdown/1 1 -breaker/1 1 -breakeven/2 1 -breakfast/23 1 -breakfront/1 1 -breaking 1 -breakneck 1 -breakout/1 1 -breakpoints -Breakspear/3 -breakthrough/1 1 -breakup/1 1 -breakwater/1 1 -bream/18 1 -breast/23 1 -breastbone/1 1 -breastfed 197 -breastfeed/121 198 -breastplate/1 1 -breaststroke/1 1 -breastwork/1 1 -breath/23 1 -breathable 1 -breathalyser/10 1 -breathalyze/6 1 -breathalyzer/10 1 -Breathalyzer 1 -breathe/6 1 -breather/1 1 -breathing/1 1 -breathless/16 1 -breathtaking -breathtakingly -breathy/34 1 -breccias -brecciated -Brecht -Breckenridge/3 -bred 199 -breech/40 1 -breed/86 200 -breeder/1 1 -breeding/2 1 -breeze/28 1 -breezeway/1 1 -breezy/50 1 -Bremen -Brenda/3 -Brendan/3 -Brennan/3 -Brenner/3 -Brent/3 -Brenton/3 -Brest -Bret/3 -brethren 201 -Breton/2 1 -Brett/3 -Breughel -breve/1 1 -brevet/109 1 -breviary/15 1 -brevity/2 1 -brew/23 1 -Brewer/3 -brewer/1 1 -brewery/15 1 -brewing 1 -brewpub/1 1 -Brewster -Brezhnev -Brian/3 -Briana/3 -Brianna/3 -briar/1 1 -bribe/28 1 -briber/1 1 -bribery/2 1 -Brice/3 -brick/23 1 -brickbat/1 1 -brickie/10 1 -bricking 1 -bricklayer/1 1 -bricklaying/2 1 -brick 1 -brickwork/2 1 -brickyard/10 1 -bridal/1 1 -Bridalveil/3 -bride/1 1 -bridegroom/1 1 -bridesmaid/1 1 -bridge/28 1 -bridgeable 1 -bridgehead/1 1 -Bridgeport/2 1 -Bridger/3 -Bridges -Bridget/2 1 -Bridgetown -Bridgett/3 -Bridgette/3 -bridgework/2 1 -bridging 1 -Bridgman -bridle/28 1 -bridleway/10 1 -Brie/1 1 -brie/2 1 -brief/52 1 -briefcase/1 1 -briefer 1 -briefing/1 1 -brier/1 1 -brig/1 1 -brigade/18 1 -brigadier/1 1 -Brigadoon 1 -brigand/1 1 -brigandage/2 1 -brigantine/1 1 -Briggs -Brigham/3 -Bright -bright/159 1 -brighten/11 1 -brightener/1 1 -Brighton/2 1 -Brigid/2 1 -Brigitte/3 -brilliance/2 1 -brilliancy/2 1 -brilliant/30 1 -brilliantine/2 1 -Brillo 1 -brill 1 -brim/160 1 -brimfull 1 -brimful 1 -brimless 1 -brimming 1 -brimstone/2 1 -brindle/2 1 -brindled 1 -brindle 1 -brine/2 1 -bring/121 202 -bringer/1 1 -bringing 1 -brink/1 1 -Brinkley/3 -brinkmanship/2 1 -brinksmanship/2 1 -briny/49 1 -brioche/1 1 -brio 1 -briquet/18 1 -briquette/18 1 -Brisbane/2 1 -brisk/98 1 -brisket/1 1 -bristle/28 1 -bristly/34 1 -Bristol/2 1 -Brit/1 1 -Britain/2 1 -Britannia -Britannic -Britannica/3 -britches/2 1 -Briticism/1 1 -British/161 1 -Britisher/1 1 -Britney/3 -Briton/1 1 -Britt/3 -Brittany/15 1 -Britten -brittle/162 1 -Brittney/3 -Brno -bro/1 1 -broach/22 1 -broad/38 1 -broadband/2 1 -broadcast/86 1 -broadcaster/1 1 -broadcasting/2 1 -broadcloth/2 1 -broaden/11 1 -broadleaved -broadloom/2 1 -broadminded -broadmindedness -broadsheet/1 1 -broadside/28 1 -broadsword/1 1 -Broadway/1 1 -Brobdingnag/3 -Brobdingnagian 1 -brocade/28 1 -broccoli/2 1 -brochette/1 1 -brochure/1 1 -Brock/3 -brogan/1 1 -brogue/1 1 -broil/23 1 -broiler/1 1 -Brokaw/3 -broken/16 1 -brokenheartedly -brokenhearted 1 -broken 203 -broker/23 1 -brokerage/1 1 -brokering 1 -broke 203 -broking 1 -brollies -brolly -bromide/1 1 -bromidic 1 -bromine/2 1 -bronc/1 1 -bronchial 1 -bronchi 204 -bronchitic 1 -bronchitis/2 1 -broncho/65 1 -bronchus/2 205 -bronco/1 1 -broncobuster/1 1 -Bronson/3 -Bronte -brontosaur/1 1 -brontosaurus/4 1 -Bronx/2 1 -bronze/28 1 -bronzing 1 -brooch/40 1 -brood/78 1 -brooder/1 1 -broodily -brooding/2 1 -broodingly 1 -broodmare/1 1 -broody/163 1 -brook/23 1 -Brooke -brooklet/1 1 -Brooklyn/2 1 -Brooks -broom/18 1 -broomstick/1 1 -Bros -bros 1 -broth/1 1 -brothel/1 1 -brother/164 206 -brotherhood/1 1 -brotherly/140 1 -brougham/1 1 -brought 207 -brouhaha/1 1 -brow/1 1 -browbeat/116 1 -Brown -brown/165 1 -Browne -brownfield 1 -Brownian/3 -brownie/1 1 -Brownie/10 1 -brownie 1 -Browning -browning 1 -brownish 1 -brownout/1 1 -Brownshirt 1 -brownstone/1 1 -Brownsville -brows/7 1 -browse/28 1 -browser/1 1 -browsing 1 -brr -Brubeck -Bruce/2 1 -Bruckner -Bruegel -Brueghel -bruin/1 1 -bruise/28 1 -bruiser/1 1 -bruising/2 1 -bruit/5 1 -Brummel/3 -brunch/22 1 -Brunei/2 1 -Bruneian/1 1 -Brunelleschi -brunet/1 1 -brunette/1 1 -brunet 1 -Brunhilde/3 -Bruno -Brunswick/2 1 -brunt/2 1 -brush/22 1 -brushing 1 -brushoff/1 1 -brushstroke -brushstrokes -brushwood/2 1 -brushwork/2 1 -brushy 1 -brusk/166 1 -brusque/27 1 -Brussels/2 1 -Brut/3 -brutal/8 1 -brutality/15 1 -brutalization/2 1 -brutalize/6 1 -brute/18 1 -brutish/16 1 -Brutus/2 1 -Bryan -Bryant -Bryce/3 -Brynner/3 -Bryon/3 -Brzezinski/3 -BS/2 1 -BSA -BSD/10 1 -BTU -Btu/2 1 -BTW -bu -bub/1 1 -bubble/28 1 -bubblegum/2 1 -bubbling 1 -bubbly/34 1 -bubbly's -Buber -bubo/4 1 -bubonic -buccaneer/23 1 -Buchanan/2 1 -Bucharest/2 1 -Buchenwald -Buchwald/3 -Buck -buck/23 1 -buckaroo/1 1 -buckboard/1 1 -bucket/23 1 -bucketful/1 1 -buckeye/1 1 -Buckingham -bucking 1 -buckle/28 1 -buckler/18 1 -Buckley/3 -buckling 1 -buckminsterfullerene 1 -Buckner/3 -buckram/2 1 -bucksaw/1 1 -buckshot/2 1 -buckskin/1 1 -buckteeth 208 -bucktooth/2 209 -bucktoothed -bucktooth 1 -buck 1 -buckwheat/2 1 -bucolic/51 1 -Bud/3 -bud/113 1 -Budapest/2 1 -Buddha/1 1 -Buddhism/1 1 -Buddhist/1 1 -budding/10 1 -Buddy/3 -buddy/167 1 -budge/43 1 -budgerigar/1 1 -budget/23 1 -budgetary -budget 1 -budgie/1 1 -Budweiser/3 -buff/78 1 -Buffalo/2 1 -buffalo/22 1 -buffer/23 1 -buffet/23 1 -buffeting/10 1 -buffoon/1 1 -buffoonery/2 1 -buffoonish 1 -Buffy/3 -Buford/3 -bug/92 1 -bugaboo/1 1 -Bugatti/3 -bugbear/1 1 -bugger/23 1 -buggery 1 -bugging 1 -bugle/28 1 -bugler/1 1 -bugling 1 -Bugzilla/3 -buggy/42 1 -Buick/3 -build/124 1 -builder/1 1 -building/1 1 -buildup/1 1 -Bujumbura/2 1 -Bukhara -Bukharin -Bulawayo -bulb/18 1 -bulbous 1 -Bulfinch -Bulganin -Bulgari/3 -Bulgaria/2 1 -Bulgarian/1 1 -Bulgar 1 -bulge/28 1 -bulging 1 -bulgy/34 1 -bulimarexia/2 1 -bulimia/2 1 -bulimic/1 1 -bulk/23 1 -bulkhead/1 1 -bulking 1 -bulk 1 -bulky/49 1 -bull/23 1 -bulldog/92 1 -bulldogging 1 -bulldog 1 -bulldoze/6 1 -bulldozer/1 1 -bullet/18 1 -bulletin/23 1 -bulletproof/11 1 -bullfight/1 1 -bullfighter/1 1 -bullfighting/2 1 -bullfinch/4 1 -bullfrog/1 1 -bullhead/1 1 -bullheaded/16 1 -bullhorn/1 1 -bullion/2 1 -bullish/16 1 -Bullock/3 -bullock/1 1 -bullpen/1 1 -bullring/1 1 -bullshit/168 1 -bullshitter/80 1 -bull 1 -bullwhip/58 1 -Bullwinkle/3 -bulrush/4 1 -Bultmann/3 -bulwark/18 1 -bully/169 1 -bully's -bum/170 1 -bumbag/10 1 -bumble/43 1 -bumblebee/1 1 -bumbler/1 1 -bumbling 1 -bumf 1 -bummer/1 1 -bump/23 1 -bumper/18 1 -bumph 1 -bumpkin/1 1 -Bumppo/3 -bumptious/16 1 -bumpy/49 1 -bun/1 1 -bunch/22 1 -Bunche -bunching 1 -bunchy/34 1 -bunco/108 1 -buncombe/2 1 -Bundesbank/2 1 -Bundestag -bundle/28 1 -bundling 1 -bung/23 1 -bungalow/1 1 -bungee/1 1 -bunghole/1 1 -bungle/28 1 -bungler/1 1 -bungling 1 -bung 1 -Bunin -bunion/1 1 -bunk/23 1 -Bunker/3 -bunker/18 1 -bunkhouse/1 1 -bunko/2 1 -bunkum/2 1 -Bunsen 1 -bunt/23 1 -bunting/1 1 -Bunuel/3 -Bunyan/2 1 -bunny/15 1 -buoy/23 1 -buoyancy/2 1 -buoyant/8 1 -bur/103 1 -Burbank -Burberry/2 1 -burble/28 1 -burbling 1 -burbs -burbs's -Burch/3 -burden/23 1 -burdensome 1 -burdock/2 1 -bureau/1 1 -bureaucracy/15 1 -bureaucrat/1 1 -bureaucratic/39 1 -bureaucratization/2 1 -bureaucratize/6 1 -burg/1 1 -burgeon/5 1 -Burger/3 -burger/1 1 -Burgess -burgh/1 1 -burgher/1 1 -burglar/1 1 -burglarize/6 1 -burglarproof 1 -burglary/15 1 -burgle/6 1 -burgling 1 -burgomaster/1 1 -Burgoyne/2 1 -Burgundian 1 -burgundy/15 1 -Burgundy/15 1 -burial/1 1 -burk/58 1 -Burke -Burks -Burl/3 -burl/62 1 -burlap/2 1 -burlesque/28 1 -burlier 210 -burliest 210 -Burlington/2 1 -burly/49 1 -Burma/2 1 -Burmese/2 1 -burn/171 1 -burnable/1 1 -burner/1 1 -Burnett -burning/10 1 -burnish/22 1 -burnisher/1 1 -burnishing 1 -burnoose/1 1 -burnous/4 1 -burnout/1 1 -Burns -Burnside -burnt 1 -burp/23 1 -Burr -burr/23 1 -Burris/3 -burrito/1 1 -burro/1 1 -Burroughs -burrow/23 1 -burrower/1 1 -Bursa -bursa/53 1 -bursar/1 1 -bursary/15 1 -bursitis/2 1 -burst/86 1 -burs 1 -Burt/3 -Burton/2 1 -Burundi/2 1 -Burundian/1 1 -bury/31 1 -bus/172 211 -busboy/1 1 -busby/15 1 -Busch/3 -busgirl/1 1 -Bush/2 1 -bush/22 1 -bushel/23 1 -bushfire 1 -Bushido 1 -bushing/1 1 -bushland 1 -bushman/2 212 -bushmaster/1 1 -bushmen 213 -Bushnell/3 -bush 1 -bushwhack/11 1 -bushwhacker/1 1 -bushy/49 1 -businesslike -businessman/2 214 -businessmen 215 -businesspeople 216 -businessperson/1 217 -businesswoman/2 218 -businesswomen 219 -busing/2 1 -busk/11 1 -busker/10 1 -buskin/1 1 -busking 1 -busload/10 1 -busmen 220 -buss/173 1 -bust/78 1 -bustard/10 1 -buster/1 1 -bustier/10 1 -bustle/28 1 -bustling 1 -busty/34 1 -busy/174 1 -busybody/15 1 -busywork/2 1 -but/175 1 -butane/2 1 -butch/176 1 -butcher/23 1 -butchering 1 -butchery/15 1 -Butler -butler/18 1 -butt/23 1 -butte/28 1 -butter/23 1 -butterball/1 1 -buttercup/1 1 -butterfat/2 1 -butterfingered -Butterfingers/3 -butterfingers/2 1 -butterfly/31 1 -butterfly's -buttermilk/2 1 -butternut/1 1 -butterscotch/2 1 -buttery/42 1 -buttock/18 1 -button/23 1 -buttonhole/28 1 -buttons 1 -buttonwood/1 1 -buttress/22 1 -butty/60 1 -buxom/166 1 -Buxtehude -buy/86 221 -buyback/1 1 -buyer/1 1 -buyout/1 1 -buzz/22 1 -buzzard/1 1 -buzzer/1 1 -buzzing 1 -buzzword/1 1 -bx -bxs -by/4 1 -Byblos/3 -bye/1 1 -byelaw/1 1 -Byelorussia/2 1 -Byers/3 -bye 1 -bygone/1 1 -bylaw/1 1 -byline/18 1 -BYOB -bypass/22 1 -bypath/1 1 -byplay/2 1 -byproduct/1 1 -Byrd -byre/10 1 -byroad/1 1 -Byron -Byronic 1 -bystander/1 1 -byte/1 1 -by 222 -byway/1 1 -byword/1 1 -Byzantine/1 1 -byzantine 1 -Byzantine 1 -Byzantium/2 1 -C/1 1 -c/10 1 -ca -CA -Ca/2 1 -cab/136 1 -cabal/18 1 -cabala/2 1 -caballero/1 1 -cabana/1 1 -cabaret/1 1 -cabbage/18 1 -cabbie/1 1 -cabby/15 1 -cabdriver/1 1 -caber/10 1 -Cabernet/2 1 -cabin/18 1 -cabinet/1 1 -cabinetmaker/1 1 -cabinetmaking/2 1 -cabinetry/2 1 -Cabinet 1 -cabinetwork/2 1 -cable/28 1 -cablecast/86 1 -cablegram/1 1 -cabling 1 -cabochon/1 1 -caboodle/2 1 -caboose/1 1 -Cabot -Cabral -Cabrera/3 -Cabrini -cabriolet/1 1 -cabstand/1 1 -cacao/1 1 -cache/28 1 -cachepot/1 1 -cachet/18 1 -cackle/28 1 -cackler/1 1 -cacophonous 1 -cacophony/15 1 -cacti 223 -cactus/2 224 -cad/1 1 -CAD/2 1 -cadaver/1 1 -cadaverous 1 -caddish/16 1 -caddy/56 1 -caddying 225 -cadence/77 1 -cadenza/1 1 -cadet/1 1 -Cadette 1 -cadge/43 1 -cadger/1 1 -Cadillac 1 -Cadiz/2 1 -cadmium/2 1 -cadre/1 1 -caducei 226 -caduceus/2 227 -Caedmon/3 -Caerphilly -Caesar/1 1 -caesarean/1 1 -Caesarean 1 -caesarian/1 1 -caesura/1 1 -cafe/1 228 -cafeteria/1 1 -cafetiere/10 1 -caff/10 1 -caffeinated -caffeine/2 1 -caftan/1 1 -Cage -cage/28 1 -cagey 229 -cagier 230 -cagiest 230 -Cagney/3 -cagoule/10 1 -cagy/50 1 -Cahokia/3 -cahoot/1 1 -CAI -Caiaphas -caiman/1 1 -Cain/1 1 -cairn/1 1 -Cairo/2 1 -caisson/1 1 -caitiff/1 1 -Caitlin/3 -Cajan 1 -cajole/6 1 -cajolement/2 1 -cajoler/1 1 -cajolery/2 1 -Cajun/1 1 -cake/28 1 -cakewalk/18 1 -caking 1 -cal -Cal -calabash/4 1 -calaboose/1 1 -Calais -calamari/1 1 -calamine/2 1 -calamitous/8 1 -calamity/15 1 -calcareous 1 -calciferous -calcification/2 1 -calcify/31 1 -calcimine/28 1 -calcine/6 1 -calcite/2 1 -calcium/2 1 -calculable 1 -calculate/6 1 -calculated/8 1 -calculating/8 1 -calculation/1 1 -calculative -calculator/1 1 -calculi 231 -calculus/2 232 -Calcutta/2 1 -Calder -caldera/1 1 -Calderon/3 -caldron/1 1 -Caldwell -Caleb/3 -Caledonia -calendar/23 1 -calender/23 1 -calf/120 1 -calfskin/2 1 -Calgary/2 1 -Calhoun -Cali -Caliban -caliber/1 1 -calibrate/6 1 -calibration/1 1 -calibrator/1 1 -calico/4 1 -Calif -calif/1 1 -California/2 1 -Californian/1 1 -californium/2 1 -Caligula -caliper/23 1 -caliph/1 1 -caliphate/1 1 -calisthenic/32 1 -calk/23 1 -call/23 1 -calla/1 1 -callable 1 -Callaghan -Callahan/3 -Callao -Callas -callback/1 1 -caller/1 1 -Callie/3 -calligrapher/1 1 -calligraphic -calligraphist/1 1 -calligraphy/2 1 -calling/1 1 -calliope/1 1 -Calliope/2 1 -callisthenics -callisthenics's -Callisto/2 1 -callosity/15 1 -callous/177 1 -callow/178 1 -callus/22 1 -calm/52 1 -calming 1 -Caloocan/3 -caloric 1 -calorie/1 1 -calorific 1 -calorimeter/10 1 -calorimetry 1 -calumet/1 1 -calumniate/6 1 -calumniation/2 1 -calumniator/1 1 -calumnious 1 -calumny/15 1 -Calvary/2 1 -calve/6 1 -Calvert -Calvin/2 1 -Calvinism/1 1 -Calvinist/1 1 -Calvinistic -calypso/1 1 -calyx/4 1 -CAM -cam/18 1 -Camacho/3 -camaraderie/2 1 -camber/23 1 -cambial 1 -cambium/1 1 -Cambodia/2 1 -Cambodian/1 1 -Cambrian/1 1 -cambric/2 1 -Cambridge/2 1 -camcorder/1 1 -Camden/2 1 -Camel/3 -camel/1 1 -camelhair/2 1 -camellia/1 1 -Camelopardalis -Camelot/1 1 -Camembert/1 1 -cameo/18 1 -camera/57 1 -cameraman/2 233 -cameramen 234 -camerawoman/2 235 -camerawomen 236 -camerawork 1 -Cameron/3 -Cameroon/1 1 -Cameroonian/1 1 -came 237 -camiknickers -Camilla/3 -Camille/3 -camisole/1 1 -Camoens/3 -camomile/1 1 -camouflage/28 1 -camouflager/1 1 -camp/179 1 -campaign/23 1 -campaigner/1 1 -Campanella/3 -campanile/1 1 -campanological 1 -campanologist/1 1 -campanology/2 1 -Campbell -camper/1 1 -campfire/1 1 -campground/1 1 -camphor/2 1 -Campinas -camping/2 1 -Campos -campsite/1 1 -campus/40 1 -campy/34 1 -Camry/3 -camshaft/1 1 -Camus -Can -can/180 238 -Canaan/2 1 -Canaanite/1 1 -Canad -Canada/2 1 -Canadian/1 1 -Canadianism 1 -canal/18 1 -Canaletto -canalization/2 1 -canalize/6 1 -canape/1 1 -canard/1 1 -Canaries/2 1 -canary/15 1 -canasta/2 1 -Canaveral -Canberra/2 1 -cancan/1 1 -cancel/5 1 -canceler/1 1 -cancellation/1 1 -cancer/1 1 -Cancer/1 1 -cancerous 1 -Cancun/2 1 -Candace/3 -candelabra/1 1 -candelabra's 239 -candelabra 240 -candelabrum/2 241 -candelas -Candice/3 -candid/21 1 -candidacy/15 1 -candidate/18 1 -candida 1 -candidature/1 1 -Candide/3 -candid 1 -candle/28 1 -candlelight/2 1 -candlelit -candlepower/2 1 -candler/1 1 -candlestick/1 1 -candlewick/1 1 -candor/2 1 -Candy/3 -candy/56 1 -candyfloss 1 -cane/28 1 -canebrake/1 1 -caner/1 1 -canine/1 1 -caning/10 1 -canister/18 1 -canker/23 1 -cankered 1 -cankerous -cannabis/4 1 -cannelloni/2 1 -cannery/15 1 -Cannes/2 1 -cannibal/1 1 -cannibalism/2 1 -cannibalistic 1 -cannibalization/2 1 -cannibalize/6 1 -canning 1 -Cannon/3 -cannon/23 1 -cannonade/28 1 -cannonball/18 1 -cannot 1 -cannula 1 -canoe/63 1 -canoeing 1 -canoeist/1 1 -canola/2 1 -Canon/3 -canon/1 1 -canonical/8 1 -canonization/1 1 -canonize/6 1 -canoodle/6 1 -Canopus -canopy/56 1 -can't -cant/78 1 -cantabile 1 -Cantabrigian/2 1 -cantaloup/1 1 -cantaloupe/1 1 -cantankerous/16 1 -cantata/1 1 -canteen/1 1 -canter/23 1 -Canterbury -canticle/1 1 -cantilever/23 1 -canting 1 -canto/1 1 -canton/1 1 -Canton/2 1 -canton/58 1 -cantonal -Cantonese/2 1 -cantonment/1 1 -Cantor/3 -cantor/1 1 -Cantrell/3 -Cantu/3 -Canute -canvas/181 1 -canvasback/1 1 -canvass/22 1 -canvasser/1 1 -canny/50 1 -canyon/1 1 -canyoning -CAP -cap/47 1 -capability/15 1 -Capablanca -capable/17 1 -capacious/16 1 -capacitance/2 1 -capacitive 1 -capacitor/1 1 -capacity/15 1 -caparison/23 1 -cape/77 1 -Capek/3 -Capella/2 1 -caper/23 1 -capeskin/2 1 -Capet -Capetian 1 -Capetown/3 -Caph/3 -capillarity/2 1 -capillary/15 1 -Capistrano/3 -capital/30 1 -capitalism/2 1 -capitalist/1 1 -capitalistic/39 1 -capitalization/2 1 -capitalize/6 1 -capitation/1 1 -capitol/1 1 -Capitol/1 1 -Capitoline -capitulate/6 1 -capitulation/1 1 -caplet/1 1 -capo/1 1 -capon/1 1 -Capone -Capote -capping 1 -cappuccino/1 1 -Capra/2 1 -Capri/2 1 -caprice/1 1 -capricious/16 1 -Capricorn/1 1 -capsicum/1 1 -capsize/6 1 -capstan/1 1 -capstone/1 1 -capsular -capsule/28 1 -capsulize/6 1 -capt -Capt -captain/23 1 -captaincy/15 1 -caption/23 1 -captious/16 1 -captivate/6 1 -captivating 1 -captivation/2 1 -captivator/1 1 -captive/1 1 -captivity/15 1 -captor/1 1 -capture/28 1 -Capuchin 1 -Capulet/2 1 -car/91 1 -Caracalla -Caracas/2 1 -caracul/2 1 -carafe/1 1 -caramel/1 1 -caramelize/6 1 -carapace/1 1 -Cara's 242 -Cara 243 -carat/1 1 -Caravaggio -caravan/18 1 -caravansary/15 1 -caravanserai's -caravel/1 1 -caraway/1 1 -carbide/1 1 -carbine/1 1 -carbohydrate/1 1 -carbolic 1 -Carboloy/2 1 -carbon/1 1 -carbonaceous -carbonate/28 1 -carbonation/2 1 -carbonic -carboniferous -Carboniferous/2 1 -carbonize/6 1 -carbon 1 -carbonyl 1 -carborundum/2 1 -Carborundum 1 -carboy/1 1 -carbuncle/1 1 -carbuncular -carburetor/1 1 -carburetter/1 1 -carburettor/1 1 -carcase/10 1 -carcass/40 1 -carcinogen/1 1 -carcinogenesis 1 -carcinogenic/1 1 -carcinogenicity/2 1 -carcinoma/1 1 -card/23 1 -cardamom/1 1 -cardamon/10 1 -cardboard/2 1 -Cardenas/3 -carder/1 1 -cardholder/10 1 -cardiac 1 -cardie/10 1 -Cardiff/2 1 -cardigan/1 1 -Cardin/3 -cardinal/30 1 -cardinality 1 -carding 1 -cardiogram/1 1 -cardiograph/1 1 -cardioid 1 -cardiologist/1 1 -cardiology/2 1 -cardiopulmonary -cardiovascular -Cardozo/3 -cardsharp/1 1 -cardsharper/1 1 -CARE -care/28 1 -careen/5 1 -career/23 1 -careerism 1 -careerist/1 1 -career 1 -carefree 1 -careful/85 1 -caregiver/1 1 -careless/16 1 -carer/1 1 -cares/79 1 -caress/22 1 -caressing 1 -caret/1 1 -caretaker/1 1 -careworn -Carey -carfare/2 1 -cargo/4 1 -carhop/18 1 -Carib/1 1 -Caribbean/1 1 -caribou/1 1 -caricature/28 1 -caricaturisation -caricaturist/1 1 -caricaturization -caries/2 1 -carillon/18 1 -Carina -caring/2 1 -carious 1 -Carissa/3 -carjack/11 1 -carjacker/1 1 -carjacking/1 1 -Carl/3 -Carla/3 -Carlene/3 -Carlin/3 -Carlo/3 -carload/1 1 -Carlos -Carlsbad -Carlson/3 -Carlton -Carly/3 -Carlyle -Carmela/3 -Carmella/3 -Carmelo/3 -Carmen/3 -Carmichael/3 -Carmine/3 -carmine/18 1 -carnage/2 1 -carnal/8 1 -carnality/2 1 -Carnap -Carnation/3 -carnation/1 1 -Carnegie/2 1 -carnelian/1 1 -Carney/3 -carney/18 1 -carnival/1 1 -carnivore/1 1 -carnivorous/16 1 -Carnot -carny/167 1 -carob/1 1 -Carol/3 -carol/23 1 -Carole/3 -caroler/1 1 -Carolina -Caroline -Carolingian 1 -Carolinian/2 1 -Carolyn/3 -carom/23 1 -carotene/2 1 -carotid/1 1 -carousal/1 1 -carouse/28 1 -carousel/1 1 -carouser/1 1 -carousing 1 -carp/23 1 -carpal/1 1 -Carpathian/3 -Carpathians -carpel/1 1 -Carpenter -carpenter/23 1 -carpentry/2 1 -carper/1 1 -carpet/23 1 -carpetbag/92 1 -carpetbagger/1 1 -carpeting/2 1 -carping 1 -carpi 244 -carpool/23 1 -carport/1 1 -carpus/2 245 -Carr/3 -Carranza/3 -carrel/1 1 -carrell/1 1 -carriage/1 1 -carriageway/10 1 -Carrie/3 -Carrier/3 -carrier/1 1 -Carrillo/3 -carrion/2 1 -Carroll/2 1 -carrot/1 1 -carroty/34 1 -carrousel/1 1 -carry/56 1 -carryall/1 1 -carrycot/10 1 -carryout 1 -carryover/1 1 -carsick/33 1 -Carson -cars 1 -cart/23 1 -cartage/2 1 -cartel/1 1 -carter/1 1 -Carter/2 1 -Cartesian 1 -Carthage/2 1 -Carthaginian/1 1 -carthorse/1 1 -Cartier -cartilage/1 1 -cartilaginous -cartload/1 1 -cartographer/1 1 -cartographic -cartography/2 1 -carton/18 1 -cartoon/23 1 -cartooning 1 -cartoonist/1 1 -cartridge/1 1 -cartwheel/23 1 -Cartwright -Caruso -carve/6 1 -Carver -carver/1 1 -carvery/60 1 -carving/1 1 -Cary -caryatid/1 1 -casaba/1 1 -Casablanca/2 1 -Casals -Casandra/3 -Casanova/1 1 -cascade/28 1 -Cascades/2 1 -cascara/1 1 -Case/3 -case/28 1 -casebook/10 1 -caseharden/11 1 -casein/2 1 -caseload/1 1 -casement/1 1 -casework/2 1 -caseworker/1 1 -Casey/3 -Cash -cash/22 1 -cashbook/1 1 -cashew/1 1 -cashier/23 1 -cashiering 1 -cashless 1 -cashmere/2 1 -cashpoint/10 1 -cash 1 -casing/1 1 -casino/1 1 -Casio/3 -cask/18 1 -casket/18 1 -Caspar -Caspian -Cassandra/1 1 -Cassatt -cassava/1 1 -casserole/28 1 -cassette/1 1 -cassia/1 1 -Cassie/3 -cassino/2 1 -Cassiopeia/2 1 -Cassius/2 1 -cassock/1 1 -cassowary/15 1 -cast/86 1 -Castaneda/3 -castanet/1 1 -castaway/1 1 -caste/73 1 -castellated -caster/1 1 -castigate/6 1 -castigation/2 1 -castigator/1 1 -Castile/2 1 -Castillo/3 -casting/1 1 -castle/28 1 -Castlereagh -castling 1 -castoff/1 1 -castor/1 1 -Castor/2 1 -castrate/43 1 -castration/1 1 -castrato 1 -Castries/2 1 -Castro -casual/36 1 -casualty/15 1 -casuist/1 1 -casuistic -casuistry/2 1 -cat/109 1 -cataclysm/1 1 -cataclysmal -cataclysmic 1 -catacomb/1 1 -catafalque/1 1 -Catalan/1 1 -catalepsy/2 1 -cataleptic/1 1 -Catalina/3 -catalog/23 1 -cataloger/1 1 -Catalonia/2 1 -catalpa/1 1 -catalysis/2 1 -catalyst/1 1 -catalytic/2 1 -catalyze/6 1 -catamaran/1 1 -catapult/23 1 -cataract/1 1 -catarrh/2 1 -catastrophe/1 1 -catastrophic -catastrophically -catatonia/2 1 -catatonic/1 1 -Catawba/2 1 -catbird/1 1 -catboat/1 1 -catcall/23 1 -catch/182 246 -catchall/1 1 -catcher/1 1 -catching/10 1 -catchment/1 1 -catchpenny 1 -catchphrase/1 1 -catchup/2 1 -catchword/1 1 -catchy/34 1 -catechism/1 1 -catechist/1 1 -catechize/6 1 -categorical/8 1 -categorization/1 1 -categorize/6 1 -category/15 1 -cater/11 1 -catercorner -caterer/1 1 -catering/10 1 -caterpillar/1 1 -Caterpillar/2 1 -caterwaul/23 1 -caterwauling 1 -catfish/4 1 -catgut/2 1 -catharses 247 -catharsis/2 248 -cathartic/1 1 -Cathay/2 1 -cathedral/1 1 -Cather -Catherine/2 1 -catheter/1 1 -catheterize/6 1 -Cathleen/3 -cathode/1 1 -cathodic 1 -Catholic/1 1 -Catholicism/1 1 -catholicity/2 1 -catholic 1 -Cathryn/3 -Cathy/3 -Catiline -cation/1 1 -cationic -catkin/1 1 -catlike 1 -catnap/47 1 -catnip/2 1 -Cato -Catskill/3 -Catskills/2 1 -catsuit/10 1 -Catt -cattail/1 1 -cattery/60 1 -cattle/2 1 -cattleman/2 249 -cattlemen 250 -Catullus -CATV -catwalk/1 1 -catty/50 1 -Caucasian/1 1 -Caucasoid 1 -Caucasus/2 1 -Cauchy -caucus/22 1 -caudal/8 1 -caught 251 -cauldron/1 1 -cauliflower/1 1 -caulk/23 1 -caulker/1 1 -caulking/2 1 -causal/8 1 -causality/15 1 -causal 1 -causation/2 1 -causative 1 -cause/28 1 -causeless 1 -causer/1 1 -causerie/1 1 -causeway/18 1 -caustic/1 1 -caustically -causticity/2 1 -caustic 1 -cauterization/2 1 -cauterize/6 1 -caution/23 1 -cautionary -cautious/16 1 -cavalcade/1 1 -cavalier/164 1 -cavalry/15 1 -cavalryman/2 252 -cavalrymen 253 -cave/28 1 -caveat/18 1 -caveman/2 254 -cavemen 255 -Cavendish -caver/10 1 -cavern/18 1 -cavernous/8 1 -caves 256 -caviar/2 1 -caviare/2 1 -cavil/23 1 -caviler/1 1 -cavilings -caviling 1 -caving/2 1 -cavitation 1 -cavity/15 1 -cavort/11 1 -Cavour -caw/23 1 -cawing 1 -Caxton -cay/1 1 -Cayenne -cayenne/2 1 -Cayman/3 -cayman/1 1 -Cayuga/1 1 -cayuse/1 1 -Cayuse 1 -Cb -CB -CBC/2 1 -CBS -cc 1 -CCTV -CCU -Cd/2 1 -CD/2 1 -CDC -CDT -Ce/2 1 -cease/28 1 -ceasefire/1 1 -ceaseless/16 1 -ceasing 1 -Ceausescu/3 -Cebu/2 1 -Cebuano/2 1 -cecal 1 -ceca 257 -Cecelia/3 -Cecil -Cecile/3 -Cecilia -Cecily/3 -cecum/2 258 -cedar/1 1 -cedarwood 1 -cede/6 1 -ceder/1 1 -cedes 259 -cedilla/1 1 -Cedric/3 -ceilidh/10 1 -ceiling/1 1 -celandine/2 1 -celeb/10 1 -Celebes/2 1 -celebrant/1 1 -celebrate/6 1 -celebrated 1 -celebration/1 1 -celebrator/1 1 -celebratory -celebrity/15 1 -celeriac 1 -celerity/2 1 -celery/2 1 -celesta/1 1 -Celeste/3 -celestial/8 1 -Celia/3 -celibacy/2 1 -celibate/1 1 -Celina/3 -cell/62 1 -cellar/18 1 -Cellini -cellist/1 1 -cellmate/1 1 -cello/1 1 -cellophane/2 1 -cellphone/1 1 -cellulars -cellular's -cellular 1 -cellulite/2 1 -celluloid/2 1 -cellulose/2 1 -Celsius 1 -Celt/1 1 -Celtic/1 1 -cement/23 1 -cementer/1 1 -cementum/2 1 -cemetery/15 1 -cenobite/1 1 -cenobitic -cenotaph/1 1 -Cenozoic/2 1 -censer/1 1 -censor/23 1 -censorial -censorious/16 1 -censorship/2 1 -censurable 1 -censure/28 1 -censurer/1 1 -census/22 1 -cent/1 1 -centaur/1 1 -Centaurus/2 1 -centavo/1 1 -centenarian/1 1 -centenary/15 1 -centennial/30 1 -center/23 1 -centerboard/1 1 -centerfold/1 1 -centering 1 -centerpiece/1 1 -center 1 -centigrade -Centigrade -centigram/1 1 -centiliter/1 1 -centime/1 1 -centimeter/1 1 -centipede/1 1 -Central -central/183 1 -centralism 1 -centralist 1 -centrality/2 1 -centralization/2 1 -centralize/6 1 -centralizer/1 1 -centric 1 -centrifugal/8 1 -centrifuge/28 1 -centripetal/8 1 -centrism/2 1 -centrist/1 1 -centroid/10 1 -centurion/1 1 -century/15 1 -CEO/2 1 -cephalic 1 -Cepheid 1 -Cepheus/2 1 -ceramic/130 1 -ceramicist/1 1 -ceramist/1 1 -Cerberus/2 1 -cereal/1 1 -cerebellar -cerebellum/1 1 -cerebral 1 -cerebra 260 -cerebrate/6 1 -cerebration/2 1 -cerebrum/1 261 -cerement/1 1 -ceremonial/30 1 -ceremonious/16 1 -ceremony/15 1 -Cerenkov -Ceres/2 1 -Cerf/3 -cerise/2 1 -cerium/2 1 -cermet/2 1 -cert/10 1 -certain/75 1 -certainty/15 1 -certifiable/19 1 -certificate/28 1 -certification/1 1 -certify/31 1 -certitude/1 1 -cerulean/2 1 -Cervantes/2 1 -cervical -cervix/184 1 -Cesar/3 -Cesarean -cesarean/1 1 -Cesarian -cesium/2 1 -cessation/1 1 -cession/1 1 -Cessna/3 -cesspit/10 1 -cesspool/1 1 -cetacean/1 1 -Cetus -Ceylon/2 1 -Ceylonese -Cezanne -CF -Cf/2 1 -CFC/2 1 -CFO -cf 1 -cg -ch -Ch -Chablis/2 1 -Chad/2 1 -chad/10 1 -Chadian/1 1 -Chad 1 -Chadwick -chafe/43 1 -chaff/23 1 -chaffinch/4 1 -chaffing 1 -Chagall -chagrin/23 1 -chain/23 1 -chainsaw/23 1 -chair/23 1 -chairlift/1 1 -chairman/2 262 -chairmanship/1 1 -chairman 1 -chairmen 263 -chairperson/1 1 -chairwoman/2 264 -chairwomen 265 -chaise/1 1 -Chaitanya/3 -Chaitin/3 -chalcedony/2 1 -Chaldea -Chaldean 1 -chalet/1 1 -chalice/1 1 -chalk/23 1 -chalkboard/1 1 -chalkiness/3 -chalk 1 -chalky/34 1 -challenge/28 1 -Challenger/3 -challenger/1 1 -challenging/8 1 -challis/2 1 -chamber/62 1 -Chamberlain -chamberlain/1 1 -chambermaid/1 1 -chamberpot/10 1 -Chambers -chamber 1 -chambray/2 1 -chameleon/1 1 -chammy/167 1 -chamois/2 1 -chamomile/1 1 -champ/23 1 -champagne/1 1 -champers 1 -champion/23 1 -championship/1 1 -champion 1 -Champlain -Champollion -Chan/3 -Chance/3 -chance/28 1 -chancel/1 1 -chancellery/15 1 -chancellor/1 1 -chancellorship/2 1 -Chancellorsville/2 1 -chancery/15 1 -chance 1 -chancier 266 -chanciest 266 -chanciness/3 -chancre/1 1 -chancy/34 1 -chandelier/1 1 -Chandigarh -Chandler -chandler/1 1 -Chandon/3 -Chandra/3 -Chandragupta -Chandrasekhar/3 -Chanel -Chaney/3 -Chang/2 1 -Changchun -change/28 1 -changeability/2 1 -changeable/29 1 -changed 1 -changeless/8 1 -changeling/1 1 -changeover/1 1 -changer/1 1 -Changsha -channel/23 1 -channeling 1 -channelization/2 1 -channelize/6 1 -chanson/1 1 -chant/23 1 -chanter/1 1 -chanteuse/1 1 -chantey/1 1 -chanticleer/1 1 -Chantilly -chantings -chantry/60 1 -chanty/15 1 -Chanukah/1 1 -chaos/2 1 -chaotic/39 1 -chap/47 1 -chaparral/1 1 -chapati/10 1 -chapatti/10 1 -chapbook/1 1 -chapeau/1 1 -chapel/18 1 -chaperon/23 1 -chaperonage/2 1 -chaperone/28 1 -chaplain/1 1 -chaplaincy/15 1 -chaplet/1 1 -Chaplin -Chapman -Chappaquiddick/3 -chappy/60 1 -chapter/18 1 -Chapultepec/2 1 -char/103 1 -charabanc/1 1 -character/18 1 -characterful -characteristic/51 1 -characterization/1 1 -characterize/6 1 -characterless 1 -charade/1 1 -Charbray/3 -charbroil/11 1 -charcoal/18 1 -chard/2 1 -chardonnay/1 1 -Chardonnay/2 1 -charge/28 1 -chargeable 1 -charger/1 1 -chariot/18 1 -charioteer/18 1 -charisma/2 1 -charismatic/1 1 -charismatically -charitable/29 1 -Charity/3 -charity/15 1 -charlady/60 1 -charlatan/1 1 -charlatanism/2 1 -charlatanry/2 1 -Charlemagne/2 1 -Charlene/3 -Charles/2 1 -Charleston/1 1 -Charley 1 -charlie/10 1 -Charlie 1 -Charlotte/2 1 -Charlottetown/2 1 -charm/23 1 -Charmaine/3 -charmed 1 -charmer/1 1 -Charmin/3 -charming/75 1 -charmless 1 -Charolais/2 1 -Charon/2 1 -chart/23 1 -charter/78 1 -charterer/1 1 -Chartism/2 1 -chartists -Chartres -chartreuse/2 1 -charwoman/2 267 -charwomen 268 -chary/50 1 -Charybdis/2 1 -Chase -chase/28 1 -chaser/1 1 -chasing 1 -Chasity/3 -chasm/1 1 -chassis/2 1 -chaste/27 1 -chasten/11 1 -chastise/6 1 -chastisement/1 1 -chastiser/1 1 -chastity/2 1 -chasuble/1 1 -chat/109 1 -chateau/1 1 -Chateaubriand/2 1 -chatelaine/1 1 -chatline/10 1 -Chattahoochee/3 -Chattanooga/2 1 -chattel/1 1 -chatter/23 1 -chatterbox/4 1 -chatterer/1 1 -chattering 1 -Chatterley/3 -Chatterton -chatty/50 1 -Chaucer/2 1 -chauffeur/23 1 -Chauncey/3 -Chautauqua 1 -chauvinism/2 1 -chauvinist/1 1 -chauvinistic/39 1 -Chavez/3 -Chayefsky/3 -Che/3 -cheap/21 1 -cheapen/11 1 -cheapish -cheapo 1 -cheapskate/1 1 -cheap 1 -cheat/23 1 -cheater/1 1 -cheating 1 -Chechen 1 -Chechnya/3 -check/78 1 -checkbook/1 1 -checker/185 1 -checkerboard/18 1 -checklist/1 1 -checkmate/28 1 -checkoff/1 1 -checkout/1 1 -checkpoint/1 1 -checkroom/1 1 -checkup/1 1 -cheddar/2 1 -Cheddar 1 -cheek/23 1 -cheekbone/1 1 -cheek 1 -cheeky/50 1 -cheep/23 1 -Cheer/3 -cheer/23 1 -cheerer/1 1 -cheerful/85 1 -cheering 1 -cheerio/1 1 -Cheerios/3 -cheerleader/1 1 -cheerless/16 1 -cheers 1 -cheery/50 1 -cheese/28 1 -cheeseboard/10 1 -cheeseburger/1 1 -cheesecake/1 1 -cheesecloth/2 1 -cheeseparing/2 1 -cheesy/49 1 -cheetah/1 1 -Cheetos/3 -Cheever -chef/18 1 -Chekhov/2 1 -Chekhovian -Chelsea -Chelyabinsk/2 1 -chem -chemical/30 1 -chemiluminescence 1 -chemiluminescent -chemise/1 1 -chemist/1 1 -chemistry/2 1 -chemo/2 1 -chemosynthesis 1 -chemotherapeutic 1 -chemotherapy/2 1 -chemurgy/2 1 -Chen/2 1 -Cheney/3 -Chengdu -chenille/2 1 -Chennai/3 -Cheops -Cheri/3 -Cherie/3 -cherish/7 1 -Chernenko/3 -Chernobyl/2 1 -Chernomyrdin/3 -Cherokee/1 1 -cheroot/1 1 -Cherry/3 -cherry/15 1 -chert/2 1 -cherub/186 1 -cherubic -cherubim 1 -chervil/2 1 -Cheryl/3 -Chesapeake -Cheshire -chess/2 1 -chessboard/1 1 -chessman/2 269 -chessmen 270 -chest/1 1 -chested 1 -Chester/2 1 -Chesterfield -chesterfield/1 1 -Chesterton 1 -chestful/1 1 -chestnut/1 1 -chesty/34 1 -Chevalier -chevalier/1 1 -cheviot/2 1 -Cheviot/2 1 -Chevrolet/2 1 -Chevron/3 -chevron/1 1 -Chevy/3 -chew/23 1 -chewable 1 -chewer/1 1 -chewiness/3 -chewy/34 1 -Cheyenne/1 1 -chg -chge -Chi/3 -chi/1 1 -Chianti/1 1 -chiaroscuro/2 1 -Chiba -Chibcha 1 -chic/187 1 -Chicago/2 1 -Chicagoan 1 -Chicana 1 -chicane/18 1 -chicanery/15 1 -Chicano 1 -chichi/188 1 -chick/1 1 -chickadee/1 1 -Chickasaw/1 1 -chicken/23 1 -chickenfeed/2 1 -chickenhearted -chickenpox/2 1 -chickenshit/189 1 -chicken 1 -chickpea/1 1 -chickweed/2 1 -chicle/2 1 -Chiclets/3 -chicory/15 1 -chide/6 1 -chidingly 1 -chiding 1 -chief/183 1 -chiefdom/2 1 -chieftain/1 1 -chieftainship/1 1 -chiffon/2 1 -chiffonier/1 1 -chiffon 1 -chigger/1 1 -chignon/1 1 -chihuahua/1 1 -Chihuahua/1 1 -chilblain/1 1 -child/155 1 -childbearing/2 1 -childbirth/1 1 -childcare/2 1 -childhood/1 1 -childish/16 1 -childless/33 1 -childlike 1 -childminder/10 1 -childminding -childproof/11 1 -child 1 -chile/1 1 -Chile/2 1 -Chilean/1 1 -chiles 271 -chili/4 1 -chill/165 1 -chiller/1 1 -chilli/190 1 -chilling/191 1 -chilly/49 1 -chimaera/1 1 -chimaerical -Chimborazo/2 1 -chime/28 1 -chimer/1 1 -chimera/1 1 -Chimera/1 1 -chimeric -chimerical 1 -chimney/18 1 -chimp/1 1 -chimpanzee/1 1 -Chimu/3 -Ch'in -chin/1 1 -Chin/2 1 -chin/192 1 -china/2 1 -China/2 1 -Chinatown 1 -china 1 -chinaware/2 1 -chinchilla/1 1 -chinchilla's 272 -chinchilla 273 -chine/18 1 -Chinese/2 1 -chink/23 1 -chinless 1 -chino/1 1 -Chinook/1 1 -chinstrap/1 1 -chintz/2 1 -chintzy/34 1 -chinwag/58 1 -chip/47 1 -chipboard 1 -Chipewyan/2 1 -chipmunk/1 1 -chipolata/10 1 -Chippendale/2 1 -chipper/18 1 -Chippewa/1 1 -chippie/10 1 -chipping/10 1 -chippy/60 1 -chips 1 -Chiquita/3 -chiral -Chirico -chirography/2 1 -chiropodist/1 1 -chiropody/2 1 -chiropractic/1 1 -chiropractor/1 1 -chirp/23 1 -chirpy/193 1 -chirrup/23 1 -chisel/23 1 -chiseler/1 1 -chiseller/1 1 -Chisholm/3 -Chisinau/2 1 -chit/1 1 -chitchat/109 1 -chitin/2 1 -chitinous -chitlings/2 1 -chitlins -chitlins's -Chittagong -chitterlings/2 1 -chivalric -chivalrous/16 1 -chivalry/2 1 -Chivas/3 -chive/18 1 -chivvy/31 1 -chivy/31 1 -chlamydia/57 1 -Chloe -chloral/2 1 -chlorate 1 -chlordane/2 1 -chloride/1 1 -chlorinate/6 1 -chlorination/2 1 -chlorine/2 1 -chlorofluorocarbon/1 1 -chloroform/23 1 -chlorophyl/2 1 -chlorophyll/2 1 -chloroplast/1 1 -chloroquine 1 -chm -choc/194 1 -chocaholic/1 1 -chock/23 1 -chockablock -chock 1 -chocoholic/1 1 -chocolate/1 1 -chocolatey -chocolaty -Choctaw/1 1 -choice/41 1 -choir/18 1 -choirboy/1 1 -choirmaster/1 1 -choke/28 1 -chokecherry/15 1 -choker/1 1 -choking 1 -choler/2 1 -cholera/2 1 -choleric 1 -cholesterol/2 1 -choline 1 -chomp/23 1 -chomper/10 1 -Chomsky -Chongqing -choose/14 274 -chooser/1 1 -choosey 275 -choosier 276 -choosiest 276 -choosiness/3 -choosy/34 1 -chop/47 1 -chophouse/1 1 -Chopin/2 1 -chopper/23 1 -chopping 1 -choppy/50 1 -Chopra/3 -chopstick/1 1 -choral/30 1 -chorale/1 1 -chord/18 1 -chordal 1 -chordate/1 1 -chore/18 1 -chorea/2 1 -choreograph/11 1 -choreographer/1 1 -choreographic/39 1 -choreography/2 1 -chorister/1 1 -choroid/1 1 -chortle/28 1 -chortler/1 1 -chorus/22 1 -chosen 277 -chose 277 -Chou -chow/23 1 -chowder/18 1 -chows 1 -Chretien/3 -Chris/3 -chrism/2 1 -Christ/1 1 -Christa/3 -Christchurch -christen/11 1 -Christendom/1 1 -christening/1 1 -Christensen/3 -Christi/3 -Christian/1 1 -Christianity/15 1 -Christianize 1 -christian 1 -Christian 1 -Christie 1 -Christina -Christine/3 -Christlike -Christmas/40 1 -Christmastide/1 1 -Christmastime/1 1 -Christoper/3 -Christopher/2 1 -Christy 1 -chromatic/39 1 -chromaticism 1 -chromatic 1 -chromatin/2 1 -chromatographic -chromatography 1 -chroma 1 -chrome/28 1 -chroming 1 -chromite 1 -chromium/2 1 -chromosomal 1 -chromosome/1 1 -chronic/39 1 -chronicle/28 1 -chronicler/1 1 -Chronicles -chronicling 1 -chronic 1 -chronograph/1 1 -chronological/8 1 -chronologist/1 1 -chronology/15 1 -chronometer/1 1 -chronometric -chrysalis/4 1 -chrysanthemum/1 1 -Chrysler/2 1 -Chrysostom -Chrystal/3 -chub/1 1 -chubby/49 1 -Chuck/3 -chuck/23 1 -chuckhole/1 1 -chuckle/28 1 -chuckling 1 -chuff/195 1 -chug/92 1 -Chukchi 1 -chukka/1 1 -chum/160 1 -Chumash 1 -chummy/50 1 -chump/18 1 -chunder/11 1 -Chung/3 -Chungking/2 1 -chunk/18 1 -chunky/49 1 -chunter/11 1 -church/40 1 -churchgoer/1 1 -churchgoing/2 1 -Churchill/2 1 -churchman/2 278 -churchmen 279 -Church 1 -churchwarden/1 1 -churchwoman 280 -churchwomen 281 -churchyard/1 1 -churl/1 1 -churlish/16 1 -churn/23 1 -churner/1 1 -churning 1 -Churriguera/3 -chute/18 1 -chutney/1 1 -chutzpa/2 1 -chutzpah/2 1 -Chuvash/2 1 -chyme/2 1 -CIA/2 1 -ciao/10 1 -cicada/1 1 -cicatrice/1 1 -cicatrix/184 1 -Cicero/2 1 -cicerone/196 1 -Cid -CID -cider/1 1 -cigar/1 1 -cigaret/1 1 -cigarette/1 1 -cigarillo/1 1 -ciggy/60 1 -cilantro/2 1 -cilia 282 -cilium/2 283 -Cimabue/2 1 -cinch/22 1 -cinchona/1 1 -Cincinnati 284 -cincture/18 1 -cinder/23 1 -Cinderella/1 1 -Cindy/3 -cinema/1 1 -CinemaScope/3 -cinematic 1 -cinematographer/1 1 -cinematographic 1 -cinematography/2 1 -Cinerama -cine 1 -cinnabar/2 1 -cinnamon/2 1 -cipher/23 1 -ciphering 1 -Cipro/2 1 -cir -circadian -circa 1 -Circe/2 1 -circle/28 1 -circlet/1 1 -circling 1 -circuit/23 1 -circuital -circuitous/16 1 -circuitry/2 1 -circuity/2 1 -circulant -circular/30 1 -circularity/2 1 -circularize/6 1 -circulate/6 1 -circulation/1 1 -circulatory -circumcise/6 1 -circumcision/1 1 -circumference/1 1 -circumferential 1 -circumflex/40 1 -circumlocution/1 1 -circumlocutory -circumnavigate/6 1 -circumnavigation/1 1 -circumnavigational -circumpolar -circumscribe/6 1 -circumscription/1 1 -circumspect/8 1 -circumspection/2 1 -circumstance/28 1 -circumstantial/8 1 -circumvent/11 1 -circumventable -circumvention/1 1 -circus/4 1 -cirque/1 1 -cirrhosis/2 1 -cirrhotic/1 1 -cirri 285 -cirrus/2 286 -Cisco/3 -cissy/60 1 -Ci 287 -cistern/1 1 -citadel/1 1 -citation/1 1 -cite/28 1 -cites 1 -Citibank/3 -citified -Citigroup/3 -citizen/1 1 -citizenry/2 1 -citizenship/2 1 -citrate 1 -citric 1 -Citroen/3 -citron/1 1 -citronella/2 1 -citrous 1 -citrus/4 1 -cit 1 -city/15 1 -cityscape 1 -city 1 -citywide 1 -civet/1 1 -civic/32 1 -civies -civies's -civil/8 1 -civilian/1 1 -civility/15 1 -civilization/1 1 -civilize/6 1 -civilized 1 -civvies -civvies's -ck -Cl/2 1 -clack/23 1 -clad/197 1 -cladding/2 1 -clad 288 -Claiborne/3 -claim/23 1 -claimable 1 -claimant/1 1 -claimer/1 1 -Clair/3 -Claire/3 -Clairol/3 -clairvoyance/2 1 -clairvoyant/1 1 -clam/160 1 -clambake/1 1 -clamber/23 1 -clamberer/1 1 -clammy/50 1 -clamor/23 1 -clamorous/8 1 -clamp/23 1 -clampdown/1 1 -clan/1 1 -Clancy/3 -clandestine/8 1 -clang/23 1 -clanger/10 1 -clanging 1 -clangor/2 1 -clangorous/8 1 -clangor 1 -clank/23 1 -clanking 1 -clannish/33 1 -clansman/2 289 -clansmen 290 -clanswoman 291 -clanswomen 292 -clap/47 1 -clapboard/23 1 -Clapeyron/3 -clapper/18 1 -clapperboard/10 1 -clapping/2 1 -Clapton/3 -claptrap/2 1 -claque/1 1 -Clara/3 -Clare -Clarence/3 -Clarendon -claret/18 1 -Clarice/3 -clarification/1 1 -clarify/31 1 -clarinet/1 1 -clarinetist/1 1 -clarinettist/1 1 -clarion/23 1 -Clarissa/3 -clarity/2 1 -Clark -Clarke/3 -clash/22 1 -clashing 1 -clasp/23 1 -clasping 1 -class/22 1 -classes 293 -classic/1 1 -classical/37 1 -classicism/2 1 -classicist/1 1 -classic 1 -classifiable -classification/1 1 -classificatory -classified/1 1 -classifier/1 1 -classify/31 1 -classlessness -classless 1 -classmate/1 1 -classroom/1 1 -class 1 -classwork/2 1 -classy/49 1 -clatter/23 1 -clattering 1 -Claude/3 -Claudette/3 -Claudia/3 -Claudine/3 -Claudio/3 -Claudius/3 -Claus/3 -clausal 1 -clause/1 1 -Clausewitz -Clausius -claustrophobia/2 1 -claustrophobic -clavichord/1 1 -clavicle/1 1 -clavier/1 1 -claw/23 1 -Clay -clay/18 1 -clayey 294 -clayier 295 -clayiest 295 -claymore/10 1 -Clayton/3 -clean/198 1 -cleanable 1 -cleaner/1 1 -cleaning/1 1 -cleanly/140 1 -cleans/7 1 -cleanse/6 1 -cleanser/1 1 -cleansing 1 -cleanup/1 1 -clear/52 1 -clearance/1 1 -Clearasil/3 -clearer 1 -clearheaded 1 -clearing/1 1 -clearinghouse/1 1 -clearway/10 1 -cleat/18 1 -cleavage/1 1 -cleave/6 296 -cleaver/1 1 -cleaving 1 -clef/1 1 -cleft/18 297 -Clem/3 -clematis/4 1 -Clemenceau -clemency/2 1 -Clemens -Clement/3 -clement/8 1 -Clementine/3 -clementine/10 1 -Clements -Clemons -Clemson/3 -clench/22 1 -Cleo/3 -Cleopatra/2 1 -clerestory/15 1 -clergy/15 1 -clergyman/2 298 -clergymen 299 -clergywoman/2 300 -clergywomen 301 -cleric/1 1 -clerical/8 1 -clericalism/2 1 -clerical 1 -clerk/23 1 -clerkship/2 1 -Cleveland/2 1 -clever/21 1 -clevis/4 1 -clew/23 1 -Cliburn/3 -cliche/1 1 -cliched 1 -click/23 1 -clicker/1 1 -clicking 1 -client/1 1 -clientele/1 1 -Cliff/3 -cliff/1 1 -cliffhanger/1 1 -cliffhanging -Clifford -clifftop -clifftops -Clifton/3 -clii -climacteric/2 1 -climactic -climate/1 1 -climatic -climatically -climatological 1 -climatologist/1 1 -climatology/2 1 -climax/22 1 -climb/23 1 -climbable 1 -climbdown -climber/1 1 -climbing/2 1 -clime/1 1 -clinch/22 1 -clincher/1 1 -Cline/3 -cling/86 302 -clinger/1 1 -clingfilm -clingy/34 1 -clinic/1 1 -clinical/8 1 -clinician/1 1 -clink/23 1 -clinker/18 1 -Clint/3 -Clinton/2 1 -Clio/2 1 -cliometric/32 1 -cliometrician/1 1 -clip/47 1 -clipboard/1 1 -clipper/1 1 -clipping/1 1 -clique/18 1 -cliquey 303 -cliquier 304 -cliquiest 304 -cliquish/16 1 -clitoral -clitoris/199 1 -Clive -clix -cloaca/53 1 -cloak/23 1 -cloaked 1 -cloakroom/1 1 -clobber/23 1 -cloche/1 1 -clock/23 1 -clockmaker 1 -clockwise 1 -clockwork/1 1 -clod/18 1 -cloddish 1 -clodhopper/1 1 -clog/92 1 -cloisonne/2 1 -cloister/23 1 -cloistral 1 -clomp/11 1 -clonal 1 -clone/28 1 -cloning 1 -clonk/23 1 -clop/47 1 -Clorets/3 -Clorox/2 1 -close/107 1 -closeable -closefisted 1 -closemouthed -closeout/1 1 -closer/10 1 -closet/23 1 -closeup/1 1 -closing/1 1 -closure/18 1 -clot/109 1 -cloth/23 1 -clothe/6 305 -clotheshorse/1 1 -clothesline/18 1 -clothespin/1 1 -clothier/1 1 -clothing/2 1 -Clotho/2 1 -clotting 1 -cloture/18 1 -cloud/23 1 -cloudburst/1 1 -clouding 1 -cloudless 1 -cloudscape/10 1 -cloudy/49 1 -Clouseau/3 -clout/23 1 -clove/1 1 -cloven 306 -clover/1 1 -cloverleaf/1 1 -clove 306 -Clovis/2 1 -clown/23 1 -clowning 1 -clownish/16 1 -cloy/11 1 -cloying/8 1 -cl 1 -club/136 1 -clubbable 1 -clubber/10 1 -clubbing 1 -clubfeet 307 -clubfoot/2 308 -clubfooted -clubhouse/1 1 -clubland -clubroom 1 -cluck/23 1 -clue/28 1 -clueless 1 -clump/23 1 -clumpy/34 1 -clumsy/50 1 -clung 309 -clunk/23 1 -clunker/1 1 -clunky/34 1 -cluster/23 1 -clutch/22 1 -clutter/23 1 -clvi -clvii -clxi -clxii -clxiv -clxix -clxvi -clxvii -Clydesdale/2 1 -Clyde 1 -Clytemnestra -Cm/2 1 -Cmdr -cm 1 -cnidarian/1 1 -CNN -CNS/2 1 -co -CO/2 1 -Co/2 310 -coach/22 1 -coaching 1 -coachload/10 1 -coachman/2 311 -coachmen 312 -coach 1 -coachwork 1 -coadjutor/1 1 -coagulant/1 1 -coagulate/6 1 -coagulation/2 1 -coagulator/1 1 -coal/23 1 -coalesce/6 1 -coalescence/2 1 -coalescent -coalface/1 1 -coalfield/10 1 -coalition/1 1 -coalitionist/1 1 -coalmine/10 1 -coalminers -coarse/27 1 -coarsen/11 1 -coast/23 1 -coastal 1 -coaster/1 1 -coastguard/10 1 -coasting 1 -coastline/1 1 -coat/23 1 -coating/1 1 -coatroom/10 1 -coattail/1 1 -coat 1 -coauthor/23 1 -coax/156 1 -coaxer/1 1 -coaxial 1 -coaxing/8 1 -cob/18 1 -Cobain/3 -cobalt/2 1 -Cobb -cobber/10 1 -cobble/28 1 -cobbler/1 1 -cobblestone/1 1 -cobbling 1 -cobnut/10 1 -COBOL/1 1 -cobra/1 1 -cobweb/200 1 -cobwebby/34 1 -coca/2 1 -cocain/2 1 -cocaine/2 1 -cocci/10 313 -coccus/2 314 -coccyx/201 1 -Cochabamba -cochineal/2 1 -Cochin 1 -Cochise -cochlea/57 1 -cochlear 1 -Cochran/3 -cock/23 1 -cockade/1 1 -cockamamie -cockatoo/1 1 -cockatrice/1 1 -cockchafer/10 1 -cockcrow/1 1 -cockerel/1 1 -cockeyed -cockfight/1 1 -cockfighting/2 1 -cockle/18 1 -cockleshell/1 1 -cockney/1 1 -Cockney/2 1 -cockney 1 -Cockney 1 -cockpit/1 1 -cockroach/4 1 -cockscomb/1 1 -cockshies -cocksucker/80 1 -cocksure 1 -cocktail/18 1 -cocky/50 1 -coco/1 1 -cocoa/1 1 -cocoanut/1 1 -cocoa's 315 -cocoa 316 -coconut/1 1 -cocoon/23 317 -cocooning 1 -Cocteau -Cod -cod/113 1 -coda/1 1 -coda's 318 -coda 319 -coddle/6 1 -code/28 1 -codebreaker -codeine/2 1 -codename -codenamed -codependency/2 1 -codependent/1 1 -coder/1 1 -codeword/10 1 -codex/2 320 -codfish/4 1 -codger/1 1 -codices 321 -codicil/1 1 -codification/1 1 -codifier/1 1 -codify/31 1 -codling 1 -codpiece/1 1 -codswallop 1 -COD 1 -Cody -coed/1 1 -coeducation/2 1 -coeducational 1 -coefficient/1 1 -coelenterate/1 1 -coequal/30 1 -coerce/6 1 -coercer/1 1 -coercible -coercion/1 1 -coercive 1 -coeval/30 1 -coexist/11 1 -coexistence/2 1 -coexistent -coextensive 1 -coffee/1 1 -coffeecake/1 1 -coffeehouse/18 1 -coffeemaker/1 1 -coffeepot/1 1 -coffer/18 1 -cofferdam/1 1 -Coffey/3 -coffin/23 1 -cog/18 1 -cogency/2 1 -cogent/8 1 -cogitate/6 1 -cogitation/1 1 -cogitative 1 -cogitator/1 1 -cognac/1 1 -Cognac/2 1 -cognate/1 1 -cognition/2 1 -cognitional -cognitive/8 1 -cognizable 1 -cognizance/2 1 -cognizant -cognomen/1 1 -cognoscente/202 1 -cogwheel/1 1 -cohabit/11 1 -cohabitant/1 1 -cohabitation/2 1 -Cohan -coheir/1 1 -Cohen -cohere/6 1 -coherence/2 1 -coherency/2 1 -coherent/8 1 -cohesion/2 1 -cohesive/16 1 -coho/1 1 -cohort/1 1 -coif/203 1 -coiffure/28 1 -coil/23 1 -Coimbatore -coin/23 1 -coinage/1 1 -coincide/6 1 -coincidence/1 1 -coincidental/8 1 -coincident 1 -coiner/1 1 -coining 1 -coinsurance/2 1 -cointreau -Cointreau 1 -coir 1 -coital 1 -coitus/2 1 -coke/1 1 -Coke/1 1 -coke/6 1 -Col -COL -col/70 1 -COLA -cola/1 1 -colander/1 1 -cola's 322 -cola 323 -Colbert/2 1 -Colby 1 -cold/38 1 -coldblooded -coldish -Cole -Coleen/3 -Coleman/3 -Coleridge/2 1 -coleslaw/2 1 -Colette -coleus/4 1 -coley/10 1 -Colfax/3 -Colgate/3 -colic/2 1 -colicky 1 -Colin/3 -coliseum/1 1 -colitis/2 1 -coll -collaborate/6 1 -collaboration/1 1 -collaborationist 1 -collaborative/8 1 -collaborator/1 1 -collage/18 1 -collagen 1 -collapse/28 1 -collapsible -collar/23 1 -collarbone/1 1 -collard/1 1 -collarless 1 -collate/6 1 -collateral/37 1 -collateralize 1 -collation/1 1 -collator/1 1 -colleague/18 1 -collect/23 1 -collectable/1 1 -collected/8 1 -collectible/1 1 -collecting 1 -collection/1 1 -collective/30 1 -collectivism/2 1 -collectivist/1 1 -collectivity 1 -collectivization/2 1 -collectivize/6 1 -collector/1 1 -collect 1 -Colleen/3 -colleen/1 1 -college/1 1 -collegial -collegiality/2 1 -collegian/1 1 -collegiate 1 -collide/6 1 -collie/18 1 -Collier/3 -collier/1 1 -colliery/15 1 -collimation 1 -collimator 1 -Collin/3 -collinear 1 -Collins 1 -collision/1 1 -collisional -collocate/6 1 -collocate's -collocation/1 1 -colloid/1 1 -colloidal -colloid 1 -colloq -colloquial/8 1 -colloquialism/1 1 -colloquial 1 -colloquium/1 1 -colloquy/15 1 -collude/6 1 -collusion/2 1 -collusive 1 -Colo -cologne/1 1 -Cologne/2 1 -Colombia/2 1 -Colombian/1 1 -Colombo/2 1 -Colon/3 -colon/1 324 -colonel/1 1 -colonelcy/2 1 -colones -Colonial -colonial/30 1 -colonialism/2 1 -colonialist/1 1 -colonic 1 -colonist/1 1 -colonization/1 1 -colonize/6 1 -colonizer/1 1 -colonnade/1 1 -colonnaded -colony/15 1 -colophon/1 1 -color/23 1 -Coloradan/1 1 -Colorado/2 1 -Coloradoan 1 -colorant/1 1 -coloration/2 1 -coloratura/1 1 -colorblind -colorblindness/3 -colored/1 1 -colorfast/33 1 -colorful/16 1 -colorimetric -coloring/1 1 -colorist/10 1 -colorization/2 1 -colorize/6 1 -colorless/16 1 -color 1 -colorway/10 1 -colossal/8 1 -Colosseum -colossi 325 -colossus/2 326 -colostomy/15 1 -colostrum/2 1 -colt/1 1 -Colt/2 1 -coltish 1 -Coltrane -Columbia/2 1 -Columbine -columbine/1 1 -Columbus/2 1 -column/1 1 -columnar -columned -columnist/1 1 -com -Com -coma/57 1 -comaker/1 1 -Comanche/1 1 -comatose 1 -comb/23 1 -combat/23 1 -combatant/1 1 -combative/33 1 -comber/1 1 -combination/1 1 -combinatorial -combine/28 1 -combined 1 -combiner/1 1 -combing/32 1 -combo/1 1 -Combs/3 -combusted -combustibility/2 1 -combustible/1 1 -combustion/2 1 -combustive -Comdr -come/14 327 -comeback/1 1 -comedian/1 1 -comedic 1 -comedienne/1 1 -comedown/1 1 -comedy/15 1 -comely/49 1 -comer/1 1 -come's -comestible/1 1 -comet/1 1 -cometary -comeuppance/1 1 -comfit/18 1 -comfort/23 1 -comfortable/29 1 -comforter/1 1 -comforting/8 1 -comfortless 1 -comfy/34 1 -comic/1 1 -comical/8 1 -comicality/2 1 -comic 1 -coming/1 1 -Comintern -comity/2 1 -comm -comma/1 1 -command/23 1 -commandant/1 1 -commandeer/11 1 -commander/1 1 -commanding/8 1 -commandment/1 1 -commando/1 1 -comma's 328 -comma 329 -commemorate/6 1 -commemoration/1 1 -commemorative 1 -commemorator/1 1 -commence/6 1 -commencement/1 1 -commend/11 1 -commendable/19 1 -commendation/1 1 -commendatory -commensurable 1 -commensurate/8 1 -comment/23 1 -commentary/15 1 -commentate/6 1 -commentator/1 1 -commenter 1 -commerce/2 1 -commercial/30 1 -commercialism/2 1 -commercialization/2 1 -commercialize/6 1 -commie/1 1 -commingle/6 1 -commiserate/6 1 -commiseration/1 1 -commiserative 1 -commissar/1 1 -commissariat/1 1 -commissary/15 1 -commission/23 1 -commissionaire/10 1 -commissioner/1 1 -commit/12 1 -commitment/1 1 -committal/1 1 -committee/1 1 -committeeman/2 330 -committeemen 331 -committeewoman/2 332 -committeewomen 333 -commode/1 1 -commodious/8 1 -commodity/15 1 -commodore/1 1 -common/38 334 -commonality/60 1 -commonalty/2 1 -commoner/1 1 -commonplace/1 1 -Commons -commonsense -commonsensical 1 -commonweal/2 1 -commonwealth/1 1 -Commonwealth 1 -commotion/1 1 -communal/8 1 -communality 1 -commune/28 1 -communicability/2 1 -communicable/19 1 -communicant/1 1 -communicate/6 1 -communication/1 1 -communicative/153 1 -communicator/1 1 -communing 1 -communion/1 1 -Communion/1 1 -communique/1 1 -communism/2 1 -Communism 1 -communist/1 1 -Communist/1 1 -communistic -communitarian 1 -community/15 1 -commutable 1 -commutation/1 1 -commutative 1 -commutativity 1 -commutator/1 1 -commute/6 1 -commuter/1 1 -commute's -Como -Comoran -Comoros/2 1 -comp/23 1 -compact/52 1 -compacter 1 -compaction/10 1 -compactor/1 1 -companion/18 1 -companionable/19 1 -companionship/2 1 -companionway/1 1 -company/167 1 -Compaq/3 -comparability/2 1 -comparable/19 1 -comparative/30 1 -comparator/10 1 -compare/28 1 -comparison/1 1 -compartment/18 1 -compartmentalization/2 1 -compartmentalize/6 1 -compartmental 1 -compass/22 1 -compassing 1 -compassion/2 1 -compassionate/8 1 -compassion 1 -compatibility/15 1 -compatible/82 1 -compatriot/1 1 -compeer/18 1 -compel/61 1 -compelling/8 1 -compendious 1 -compendium/1 1 -compensate/6 1 -compensation/1 1 -compensator 1 -compensatory -compere/43 1 -compete/6 1 -competence/1 1 -competency/15 1 -competent/8 1 -competing 1 -competition/1 1 -competitive/16 1 -competitor/1 1 -compilable -compilation/1 1 -compile/6 1 -compiler/1 1 -complacence/2 1 -complacency/2 1 -complacent/8 1 -complain/11 1 -complainant/1 1 -complainer/1 1 -complaining/8 1 -complaint/1 1 -complaisance/2 1 -complaisant/8 1 -complected -complement/23 1 -complementarity 1 -complementary 1 -completable -complete/104 1 -completed 1 -completer 1 -completion/1 1 -complex/204 1 -complexion/62 1 -complexional 1 -complexity/15 1 -compliance/2 1 -compliant/8 1 -complicate/6 1 -complicated/8 1 -complication/1 1 -complicit -complicity/2 1 -compliment/23 1 -complimentary 1 -comply/31 1 -compo/10 1 -component/1 1 -comport/11 1 -comportment/2 1 -compos/205 1 -compose/6 1 -composed/8 1 -composer/1 1 -composite/164 1 -composition/1 1 -compositional 1 -compositor/1 1 -compost/23 1 -composure/2 1 -compote/1 1 -compound/23 1 -compoundable -compounded 1 -compound 1 -comprehend/11 1 -comprehensibility/2 1 -comprehensible/19 1 -comprehension/1 1 -comprehensive/36 1 -compress/22 1 -compressed 1 -compressibility 1 -compressible 1 -compression/1 1 -compressional -compressive 1 -compressor/1 1 -comprise/6 1 -compromise/28 1 -compromising 1 -Compton -comptroller/1 1 -compulsion/1 1 -compulsive/16 1 -compulsory/206 1 -compunction/1 1 -CompuServe/3 -computability 1 -computable/19 1 -computation/1 1 -computational/8 1 -compute/43 1 -computer/1 1 -computerate -computerization/2 1 -computerize/6 1 -computing/2 1 -comrade/1 1 -comradely 1 -comradeship/2 1 -Comte -con/133 1 -Conakry/2 1 -Conan/3 -concatenate/6 1 -concatenation/1 1 -concave/16 1 -concavity/15 1 -conceal/11 1 -concealable -concealed 1 -concealer/1 1 -concealment/2 1 -concede/6 1 -conceded 1 -conceit/62 1 -conceited/16 1 -conceivability 1 -conceivable/19 1 -conceive/6 1 -concentrate/28 1 -concentration/1 1 -concentrator/10 1 -concentric -concentrically -Concepcion -concept/1 1 -conception/1 1 -conceptional -conceptual/8 1 -conceptualization/1 1 -conceptualize/6 1 -concern/23 1 -concerned/8 1 -concerning 1 -concert/23 1 -concerted/8 1 -concertgoer/10 1 -concertina/23 1 -concertize/6 1 -concertmaster/1 1 -concerto/1 1 -concession/1 1 -concessionaire/1 1 -concessional -concessionary 1 -Concetta/3 -conch/18 1 -conchie/10 1 -concierge/1 1 -conciliar 1 -conciliate/6 1 -conciliating 1 -conciliation/2 1 -conciliator/1 1 -conciliatory 1 -concise/27 1 -concision/2 1 -conclave/1 1 -conclude/6 1 -conclusion/1 1 -conclusive/16 1 -concoct/11 1 -concoction/1 1 -concomitant/30 1 -Concord/1 1 -concord/2 1 -concordance/1 1 -concordant 1 -concordat/1 1 -Concorde -concourse/1 1 -concrete/207 1 -concretion/1 1 -concubinage/2 1 -concubine/1 1 -concupiscence/2 1 -concupiscent -concur/13 1 -concurrence/1 1 -concurrency 1 -concurrent/8 1 -concurring 1 -concuss/7 1 -concussion/1 1 -concussive -condemn/11 1 -condemnable 1 -condemnation/1 1 -condemnatory -condemner/1 1 -condemning 1 -condensate/1 1 -condensation/1 1 -condense/6 1 -condensed 1 -condenser/1 1 -condescend/11 1 -condescending/8 1 -condescension/2 1 -condign 1 -Condillac -condiment/1 1 -condition/23 1 -conditional/30 1 -conditionality 1 -conditioner/1 1 -conditioning/2 1 -condo/1 1 -condole/6 1 -condolence/1 1 -condoling 1 -condom/1 1 -condominium/1 1 -condonable -condone/6 1 -condor/1 1 -Condorcet -conduce/6 1 -conducive 1 -conduct/23 1 -conductance/2 1 -conductibility/2 1 -conductible -conduction/2 1 -conductive 1 -conductivity/15 1 -conductor/1 1 -conductress/4 1 -conduit/1 1 -cone/28 1 -Conestoga/2 1 -coney/1 1 -confab/136 1 -confabulate/6 1 -confabulation/1 1 -confection/18 1 -confectioner/1 1 -confectionery/15 1 -confectionist -confederacy/15 1 -Confederacy/2 1 -confederate/1 1 -Confederate/1 1 -confederate/6 1 -confederation/1 1 -confer/208 1 -conferee/1 1 -conference/73 1 -conferencing 1 -conferment/1 1 -conferrable -conferral/2 1 -conferrer/1 1 -confess/7 1 -confessed/8 1 -confession/1 1 -confessional/1 1 -confessor/1 1 -confetti -confetti's -confidant/1 1 -confidante/1 1 -confide/6 1 -confidence/1 1 -confident/8 1 -confidential/8 1 -confidentiality/2 1 -confident 1 -confider/1 1 -confiding/8 1 -configurable -configuration/1 1 -configure/6 1 -confine/28 1 -confined 1 -confinement/1 1 -confirm/11 1 -confirmation/1 1 -confirmatory -confirmed 1 -confirming 1 -confiscate/6 1 -confiscation/1 1 -confiscator/1 1 -confiscatory -conflagration/1 1 -conflate/6 1 -conflation/1 1 -conflict/23 1 -conflicting/8 1 -conflictual -confluence/1 1 -confluent 1 -confocal -conform/11 1 -conformable 1 -conformal -conformance/2 1 -conformation/1 1 -conformational -conformer/1 1 -conforming 1 -conformism/2 1 -conformist/1 1 -conformity/2 1 -confound/11 1 -confounded/8 1 -confounding 1 -confraternity/15 1 -confrere/1 1 -confront/11 1 -confrontation/1 1 -confrontational -Confucian/1 1 -Confucianism/1 1 -Confucius/2 1 -confusable 1 -confuse/6 1 -confused/8 1 -confuser/10 1 -confusing/8 1 -confusion/1 1 -confutation/2 1 -confute/6 1 -Cong -conga/23 1 -congeal/11 1 -congealed 1 -congealment/2 1 -congenial/8 1 -congeniality/2 1 -congenital/8 1 -conger/1 1 -congeries/2 1 -congest/11 1 -congestion/2 1 -congestive -conglomerate/28 1 -conglomeration/1 1 -Congo/2 1 -Congolese/2 1 -congrats/2 1 -congratulate/6 1 -congratulation/1 1 -congratulatory -congregant/1 1 -congregate/6 1 -congregation/1 1 -Congregational -congregationalism/2 1 -congregationalist/1 1 -Congregationalist/1 1 -congregational 1 -congress/40 1 -Congress/4 1 -Congressional -congressional 1 -congressman/2 335 -congressmen 336 -congresspeople 337 -congressperson/1 338 -congresswoman/2 339 -congresswomen 340 -Congreve -congruence/1 1 -congruency 1 -congruent/8 1 -congruential -congruity/15 1 -congruous 1 -conic/1 1 -conical/8 1 -conic 1 -conifer/1 1 -coniferous -conj -conjectural 1 -conjecture/28 1 -conjoin/11 1 -conjoined 1 -conjoiner/1 1 -conjoint/8 1 -conjugacy -conjugal/8 1 -conjugate/43 1 -conjugating 1 -conjugation/1 1 -conjunct/1 1 -conjunction/1 1 -conjunctiva/1 1 -conjunctive/1 1 -conjunctivitis/2 1 -conjunct 1 -conjuncture/1 1 -conjuration/1 1 -conjure/6 1 -conjurer/1 1 -conjuring 1 -conjuror/1 1 -conk/23 1 -conker/10 1 -Conley/3 -conman/2 1 -Conn -connect/11 1 -connectable -connected/153 1 -connecter/1 1 -connectible -Connecticut/2 1 -connection/1 1 -connectionless -connective/1 1 -connectivity/2 1 -connector/1 1 -Connemara 1 -Conner/3 -Connery/3 -Connie/3 -conning 1 -conniption/1 1 -connivance/2 1 -connive/6 1 -conniver/1 1 -conniving 1 -connoisseur/1 1 -connoisseurship 1 -Connolly/3 -Connors -connotation/1 1 -connotative 1 -connote/6 1 -connubial 1 -conquer/11 1 -conquerable 1 -conquering 1 -conqueror/1 1 -conquest/1 1 -conquistador/1 1 -Conrad -Conrail/3 -cons/7 1 -consanguineous 1 -consanguinity/2 1 -conscience/1 1 -conscienceless 1 -conscientious/16 1 -conscionable 1 -conscious/151 1 -conscript/23 1 -conscription/2 1 -consecrate/6 1 -consecrated 1 -consecration/1 1 -consecutive/8 1 -consensual/8 1 -consensus/4 1 -consent/23 1 -consequence/1 1 -consequent/8 1 -consequential/8 1 -consequent 1 -conservancy/15 1 -conservation/1 1 -conservationism/2 1 -conservationist/1 1 -conservatism/2 1 -conservative/209 1 -Conservative 1 -conservatoire/10 1 -conservator/1 1 -conservatory/15 1 -conserve/28 1 -consider/11 1 -considerable/19 1 -considerate/16 1 -consideration/1 1 -considering 1 -consign/11 1 -consignee/1 1 -consignment/1 1 -consignor/1 1 -consist/11 1 -consistence/1 1 -consistency/15 1 -consistent/8 1 -consistory/15 1 -consolable -consolation/1 1 -consolatory -console/28 1 -consolidate/6 1 -consolidation/1 1 -consolidator/1 1 -consoling/8 1 -consomme/2 1 -consonance/1 1 -consonant/30 1 -consonantal 1 -consort/23 1 -consortia 341 -consortium/2 342 -conspectus/4 1 -conspicuous/16 1 -conspiracy/15 1 -conspirator/1 1 -conspiratorial/8 1 -conspire/6 1 -Constable -constable/1 1 -constabulary/15 1 -Constance -constancy/2 1 -constant/30 1 -Constantine -Constantinople/2 1 -constellation/1 1 -consternating -consternation/2 1 -constipate/6 1 -constipation/2 1 -constituency/15 1 -constituent/1 1 -constitute/6 1 -Constitution -constitution/1 1 -constitutional/30 1 -constitutionalism 1 -constitutionalists -constitutionality/2 1 -constitutive 1 -constrain/11 1 -constrained 1 -constraining 1 -constraint/1 1 -constrict/11 1 -constriction/1 1 -constrictive -constrictor/1 1 -construable 1 -construct/23 1 -constructable -construction/1 1 -constructional 1 -constructionist/1 1 -constructive/16 1 -constructivism 1 -constructivist 1 -constructor/1 1 -construe/43 1 -consubstantiation/2 1 -Consuelo/3 -consul/1 1 -consular 1 -consulate/1 1 -consulship/2 1 -consult/11 1 -consultancy/15 1 -consultant/1 1 -consultation/1 1 -consultative 1 -consumable/1 1 -consume/6 1 -consumed 1 -consumer/1 1 -consumerism/2 1 -consumerist/1 1 -consuming 1 -consummate/68 1 -consummation/1 1 -consumption/1 1 -consumptive/1 1 -cont -contact/23 1 -contactable -contagion/1 1 -contagious/16 1 -contain/11 1 -containable -contained 1 -container/1 1 -containerization/2 1 -containerize/6 1 -containment/2 1 -contaminant/1 1 -contaminate/6 1 -contamination/2 1 -contaminator/1 1 -contd -contemn/11 1 -contemplate/6 1 -contemplation/1 1 -contemplative/30 1 -contemporaneity/2 1 -contemporaneous/8 1 -contemporary/15 1 -contempt/2 1 -contemptible/19 1 -contemptuous/16 1 -contend/11 1 -contender/1 1 -contending 1 -content/210 1 -contented/16 1 -contention/1 1 -contentious/16 1 -contentment/2 1 -conterminous/8 1 -contest/23 1 -contestable 1 -contestant/1 1 -context/1 1 -contextual/8 1 -contextualization 1 -contextualize/6 1 -contiguity/2 1 -contiguous/8 1 -continence/2 1 -continent/1 1 -Continent/2 1 -continental/1 1 -Continental 1 -continent 1 -contingency/15 1 -contingent/30 1 -continuable -continual/8 1 -continuance/1 1 -continua 343 -continuation/1 1 -continue/6 1 -continued 1 -continuing 1 -continuity/15 1 -continuous/8 1 -continuum/2 344 -contort/11 1 -contorted 1 -contortion/1 1 -contortionist/1 1 -contour/23 1 -contra/10 1 -contraband/2 1 -contraception/2 1 -contraceptive/1 1 -contract/23 1 -contracted 1 -contractible 1 -contractile -contraction/1 1 -contractor/1 1 -contractual/8 1 -contradict/11 1 -contradiction/1 1 -contradictory/211 1 -contradistinction/1 1 -contraflow/10 1 -contrail/1 1 -contraindicate/6 1 -contraindication/1 1 -contralto/1 1 -contraption/1 1 -contrapuntal/8 1 -contrariety/2 1 -contrariwise -contrary/212 1 -contrast/23 1 -contrasting/8 1 -contrastive 1 -contrasty 1 -contravene/6 1 -contravention/1 1 -Contreras/3 -contretemps/2 1 -contribute/6 1 -contribution/1 1 -contributor/1 1 -contributory 1 -contrite/16 1 -contrition/2 1 -contrivance/1 1 -contrive/6 1 -contriver/1 1 -control/213 1 -controllable 1 -controller/1 1 -controlling 1 -controversial/8 1 -controversy/15 1 -controvert/11 1 -controvertible 1 -con 1 -contumacious/8 1 -contumacy/2 1 -contumelies -contumelious 1 -contumely/3 -contuse/6 1 -contusion/1 1 -conundrum/1 1 -conurbation/1 1 -convalesce/6 1 -convalescence/1 1 -convalescent/1 1 -convect/11 1 -convection/2 1 -convectional -convective 1 -convector/10 1 -convene/6 1 -convener/1 1 -convenience/1 1 -convenient/8 1 -convenor/10 1 -convent/18 1 -conventicle/1 1 -convention/1 1 -conventional/8 1 -conventionalism 1 -conventionalist 1 -conventionality/2 1 -conventionalize/6 1 -conventioneer/10 1 -converge/6 1 -convergence/1 1 -convergent 1 -conversant 1 -conversation/1 1 -conversational/8 1 -conversationalist/1 1 -conversazione 1 -converse/54 1 -conversion/1 1 -convert/23 1 -converter/1 1 -convertibility/2 1 -convertible/1 1 -convertor/1 1 -convex/8 1 -convexity/2 1 -convex 1 -convey/11 1 -conveyable -conveyance/1 1 -conveyancing 1 -conveyer/1 1 -conveyor/1 1 -convict/23 1 -conviction/1 1 -convict 1 -convince/6 1 -convinced 1 -convincing/8 1 -convivial/8 1 -conviviality/2 1 -convocation/1 1 -convoke/6 1 -convoluted 1 -convolution/1 1 -convolve/214 1 -convoy/23 1 -convulse/6 1 -convulsion/1 1 -convulsive/8 1 -Conway -cony/15 1 -coo/23 1 -cooing 1 -Cook -cook/23 1 -cookbook/1 1 -Cooke/3 -cooker/1 1 -cookery/15 1 -cookhouse/10 1 -cookie/1 1 -cooking/2 1 -cookout/1 1 -cookware/1 1 -cooky/15 1 -cool/52 1 -coolant/1 1 -cooler/1 1 -Cooley/3 -Coolidge/2 1 -coolie/1 1 -cooling 1 -coon/80 1 -coonskin/1 1 -coop/23 1 -Cooper -cooper/23 1 -cooperage/2 1 -cooperate/6 1 -cooperation/2 1 -cooperative/36 1 -cooperator/1 1 -coopering 1 -Cooperstown/3 -coordinate/54 1 -coordination/2 1 -coordinator/1 1 -Coors/3 -coot/1 1 -cootie/1 1 -cop/47 1 -Copacabana/3 -copacetic -copay/2 1 -cope/28 1 -Copeland/3 -Copenhagen/2 1 -Copernican 1 -Copernicus/2 1 -copier/1 1 -copilot/1 1 -coping/1 1 -copious/16 1 -coplanar -Copland -Copley -copper/18 1 -Copperfield/3 -copperhead/1 1 -copperplate/2 1 -Coppertone/3 -coppery 1 -coppice/28 1 -Coppola/3 -copra/2 1 -coprocessor/10 1 -coprolite 1 -coprophagous -cops/205 1 -copse/18 1 -copter/1 1 -Coptic/2 1 -copula/1 1 -copulate/6 1 -copulation/1 1 -copulative/1 1 -copulatory -copy/56 1 -copyable -copybook/1 1 -copycat/109 1 -copyist/1 1 -copyleft/10 1 -copyright/23 1 -copyrightable -copyright 1 -copywriter/1 1 -coquetry/15 1 -coquette/28 1 -coquettish/8 1 -Cora/2 1 -coracle/1 1 -coral/1 1 -coralline 1 -coral 1 -corbel/18 1 -cord/23 1 -cordage/2 1 -Cordelia/3 -cordial/30 1 -cordiality/2 1 -cordillera/1 1 -Cordilleras -cording 1 -cordite/2 1 -cordless 1 -Cordoba/2 1 -cordon/23 1 -cordovan/2 1 -corduroy/138 1 -core/28 1 -coreligionist/10 1 -corer/1 1 -corespondent/1 1 -Corey/3 -Corfu -corgi/1 1 -coriander/2 1 -Corina/3 -Corine/3 -Corinne/3 -Corinth/2 1 -Corinthian/1 1 -Coriolanus -Coriolis/3 -Cork -cork/23 1 -corkage 1 -corker/1 1 -corkscrew/23 1 -Corleone/3 -corm/1 1 -Cormack/3 -cormorant/1 1 -corn/23 1 -cornball/1 1 -cornbread/2 1 -corncob/1 1 -corncrake/10 1 -cornea/1 1 -corneal 1 -cornea's 345 -cornea 346 -Corneille -Cornelia/3 -Cornelius/3 -Cornell/3 -corner/23 1 -cornerstone/1 1 -cornet/1 1 -cornfield/10 1 -cornflake/32 1 -cornflour 1 -cornflower/1 1 -cornice/18 1 -cornily 1 -corniness/3 -Corning/3 -Cornish/4 1 -cornmeal/2 1 -cornrow/23 1 -cornstalk/1 1 -cornstarch/2 1 -cornucopia/1 1 -Cornwall/2 1 -Cornwallis -corny/34 1 -corolla/1 1 -corollary/15 1 -corona/1 1 -Coronado -coronal/1 1 -coronary/15 1 -coronation/1 1 -coroner/1 1 -coronet/1 1 -Corot -Corp -corp/32 1 -corporal/1 1 -corpora 347 -corporate/8 1 -corporates -corporation/1 1 -corporatism 1 -corporatist 1 -corpora 1 -corporeal/8 1 -corporeality/2 1 -corps/2 1 -corpse/1 1 -corpsman/2 348 -corpsmen 349 -corpulence/2 1 -corpulent 1 -corpus/2 350 -corpuscle/1 1 -corpuscular -corr -corral/213 1 -corralling 1 -correct/98 1 -correctable -corrected 1 -correction/1 1 -correctional -corrective/1 1 -corrector/10 1 -Correggio -correlate/28 1 -correlation/1 1 -correlative/1 1 -correspond/11 1 -correspondence/1 1 -correspondent/1 1 -corresponding/8 1 -corridor/1 1 -corrie/10 1 -corrigenda 351 -Corrine/3 -corroborate/6 1 -corroboration/1 1 -corroborative 1 -corroborator/1 1 -corroboratory 1 -corrode/6 1 -corrosion/2 1 -corrosive/30 1 -corrugate/6 1 -corrugation/1 1 -corrupt/98 1 -corrupted 1 -corrupter 1 -corruptibility/2 1 -corruptible 1 -corruption/1 1 -corsage/1 1 -corsair/1 1 -corset/23 1 -Corsica/2 1 -Corsican 1 -cortege/1 1 -Cortes/4 1 -cortex/2 352 -Cortez/2 1 -cortical 1 -cortices 353 -corticosteroid/10 1 -cortisol 1 -cortisone/2 1 -Cortland/2 1 -cor 1 -corundum/2 1 -coruscate/6 1 -coruscation/2 1 -Corvallis/3 -Corvette/3 -corvette/1 1 -Corvus/2 1 -Cory/3 -cos/2 1 -Cosby/3 -cosh/156 1 -cosign/11 1 -cosignatory/15 1 -cosigner/1 1 -cosine/1 1 -cosiness -cosiness's -cosines 1 -cosmetic/51 1 -cosmetician/1 1 -cosmetologist/1 1 -cosmetology/2 1 -cosmic/39 1 -cosmical -cosmogonist/1 1 -cosmogony/15 1 -cosmological/8 1 -cosmologist/1 1 -cosmology/15 1 -cosmonaut/1 1 -cosmopolitan/1 1 -cosmopolitanism/2 1 -cosmopolitan 1 -cosmos/4 1 -cosponsor/23 1 -cossacks -Cossack 1 -cosset/5 1 -cossetted -cossetting -cost/86 1 -costar/103 1 -Costco/3 -Costello/3 -costing/10 1 -costless 1 -costly/49 1 -Costner/3 -cos 1 -costume/139 1 -costumer/1 1 -costumier/10 1 -cot/18 1 -cotangent/1 1 -Cote/3 -cote/18 1 -coterie/1 1 -coterminous -cotillion/1 1 -Cotonou -Cotopaxi/2 1 -Cotswold/2 1 -cottage/73 1 -cottager/1 1 -cottar/1 1 -cotter/18 1 -Cotton/3 -cotton/23 1 -cottonmouth/1 1 -cottonseed/1 1 -cottontail/1 1 -cottonwood/1 1 -cottony 1 -cotyledon/1 1 -couch/22 1 -couchette/10 1 -couching 1 -cougar/1 1 -cough/23 1 -coughing 1 -couldn't -could 354 -coulee/1 1 -coulis 1 -Coulomb -coulomb/1 1 -Coulter/3 -council/1 1 -councilman/2 355 -councilmen 356 -councilor/1 1 -councilperson/1 1 -councilwoman/2 357 -councilwomen 358 -counsel/23 1 -counseling/10 1 -counselor/1 1 -count/23 1 -countability 1 -countable/19 1 -countdown/1 1 -countenance/28 1 -counter/23 1 -counteract/11 1 -counteraction/1 1 -counteractive 1 -counterargument/10 1 -counterattack/23 1 -counterbalance/28 1 -counterblast/10 1 -counterclaim/23 1 -counterclockwise -counterculture/1 1 -counterespionage/2 1 -counterexample/10 1 -counterfeit/23 1 -counterfeiter/1 1 -counterfeit 1 -counterfoil/1 1 -counterinsurgency/15 1 -counterintelligence/2 1 -counterman/2 359 -countermand/23 1 -countermeasure/1 1 -countermen 360 -counteroffensive/1 1 -counteroffer/18 1 -counterpane/1 1 -counterpart/1 1 -counterpoint/23 1 -counterpoise/28 1 -counterproductive -counterrevolution/1 1 -counterrevolutionary/15 1 -countersign/23 1 -countersignature/1 1 -countersink/86 361 -counterspy/15 1 -counterstrike 1 -countersunk 362 -countertenor/1 1 -counter 1 -countervail/11 1 -counterweight/18 1 -countess/4 1 -countless 1 -countrified 1 -country/15 1 -countryman/2 363 -countrymen 364 -countryside/1 1 -country 1 -countrywide 1 -countrywoman/2 365 -countrywomen 366 -county/15 1 -countywide 1 -coup/18 1 -coupe/18 1 -Couperin -couple/28 1 -coupler/10 1 -couplet/1 1 -coupling/1 1 -coupon/1 1 -courage/2 1 -courageous/16 1 -Courbet -courgette/10 1 -courier/23 1 -course/139 1 -coursebook/10 1 -courser/1 1 -coursework -coursing 1 -court/23 1 -courteous/16 1 -courtesan/1 1 -courtesy/167 1 -courthouse/1 1 -courtier/1 1 -courting 1 -courtly/49 1 -Courtney/3 -courtroom/1 1 -courtship/1 1 -courtyard/1 1 -couscous/2 1 -cousin/1 1 -cousinly 1 -Cousteau -couture/2 1 -couturier/1 1 -covalent/8 1 -covariance/10 1 -cove/18 1 -coven/1 1 -covenant/23 1 -Coventry/15 1 -cover/23 1 -coverage/1 1 -coverall/1 1 -covering/1 1 -coverlet/1 1 -coversheet -covert/36 1 -coverup/1 1 -covet/11 1 -covetous/16 1 -covey/1 1 -cow/23 367 -Coward -coward/30 1 -cowardice/2 1 -cowardly/140 1 -cowbell/1 1 -cowbird/1 1 -cowboy/1 1 -cowcatcher/1 1 -cower/11 1 -cowering 1 -cowgirl/1 1 -cowhand/1 1 -cowherd/1 1 -cowhide/18 1 -cowl/23 1 -Cowley -cowlick/1 1 -cowling/1 1 -cowman/2 368 -cowmen 369 -coworker/1 1 -cowpat/10 1 -Cowper -cowpoke/1 1 -cowpox/2 1 -cowpuncher/1 1 -cowrie/1 1 -cowshed/10 1 -cowslip/1 1 -Cox -cox/156 1 -coxcomb/1 1 -coxswain/18 1 -Coy/3 -coy/21 1 -coyote/1 1 -coypu/1 1 -coy 1 -cozen/11 1 -cozenage/2 1 -cozier 370 -coziest 370 -Cozumel/3 -cozy/215 1 -CPA/2 1 -cpd -CPI/2 1 -cpl -Cpl -CPO -CPR/2 1 -cps 1 -CPU/2 1 -Cr/2 1 -crab/136 1 -Crabbe -crabbed 1 -crabber/1 1 -crabbily 1 -crabbing 1 -crabby/49 1 -crabgrass/2 1 -crablike 1 -crabwise 1 -crack/216 1 -crackable -crackdown/1 1 -cracked 1 -cracker/1 1 -crackerjack/1 1 -crackhead/1 1 -cracking/10 1 -crackle/28 1 -crackling/1 1 -cracklings 1 -crackpot/1 1 -crackup/1 1 -cradle/28 1 -cradling 1 -Craft/3 -craft/23 1 -craftsman/2 371 -craftsmanship/2 1 -craftsmen 372 -craftspeople 373 -craftswoman/2 374 -craftswomen 375 -crafty/50 1 -crag/1 1 -craggy/49 1 -Craig -cram/217 1 -crammer/10 1 -cramp/23 1 -cramped 1 -cramping's -crampon/1 1 -Cranach -cranberry/15 1 -Crane -crane/28 1 -cranial 1 -cranium/1 1 -crank/179 1 -crankcase/1 1 -crankshaft/1 1 -cranky/50 1 -Cranmer -cranny/148 1 -crap/218 1 -crape/18 1 -crapper/10 1 -crappie/41 1 -crappy/219 1 -crapshooter/1 1 -crash/147 1 -crasher/10 1 -crashing/8 1 -crass/21 1 -crate/28 1 -crater/1 1 -Crater/2 1 -crater/11 1 -cravat/18 1 -crave/6 1 -craven/220 1 -craving/1 1 -craw/1 1 -crawdad/1 1 -Crawford/3 -crawl/23 1 -crawler/1 1 -crawlies -crawling 1 -crawlspace/1 1 -crawly/34 1 -crawly's -Cray/3 -cray/10 1 -crayfish/4 1 -Crayola/3 -crayola/10 1 -crayon/23 1 -craze/28 1 -crazed 1 -crazing 1 -crazy/221 1 -creak/23 1 -creaking 1 -creaky/50 1 -cream/78 1 -creamer/1 1 -creamery/15 1 -creamy/50 1 -crease/28 1 -creatable -create/6 1 -creation/1 1 -Creation/2 1 -creationism/1 1 -creationist/1 1 -creative/16 1 -creatives -creative's -creativity/2 1 -creator/1 1 -Creator/2 1 -creature/1 1 -creche/1 1 -Crecy/2 1 -cred -credence/2 1 -credential/23 1 -credenza/1 1 -credibility/2 1 -credible/19 1 -credit/23 1 -creditability 1 -creditable/19 1 -creditor/1 1 -creditworthy/222 1 -credo/1 1 -credulity/2 1 -credulous/16 1 -Cree/1 1 -Creed -creed/1 1 -creek/1 1 -Creek/1 1 -creel/18 1 -creep/86 376 -creeper/1 1 -creeping 1 -creepy/50 1 -Creighton/3 -cremains/2 1 -cremate/6 1 -cremation/1 1 -crematoria 377 -crematorium/1 378 -crematory/15 1 -creme/1 1 -crenelate/6 1 -crenelation/1 1 -creole/1 1 -Creole/1 1 -creole 1 -Creole 1 -Creon -creosote/28 1 -crepe/18 1 -crept 379 -crepuscular -crescendo/18 1 -crescent/1 1 -cress/2 1 -Crest/3 -crest/23 1 -crestfallen 1 -cresting 1 -crestless 1 -Cretaceous/2 1 -cretaceous 1 -Cretan/1 1 -Crete/2 1 -cretin/1 1 -cretinism/2 1 -cretinous -cretonne/2 1 -crevasse/18 1 -crevice/1 1 -crew/23 1 -crewel/2 1 -crewelwork/2 1 -crewman/2 380 -crewmen 381 -crib/136 1 -cribbage/2 1 -cribber/1 1 -cribbing 1 -Crichton -Crick -crick/23 1 -cricket/86 1 -cricketer/1 1 -crier/1 1 -crikey 1 -crime/18 1 -Crimea/2 1 -Crimean -criminal/30 1 -criminality/2 1 -criminalization 1 -criminalize/6 1 -criminological 1 -criminologist/1 1 -criminology/2 1 -crimp/23 1 -crimson/23 1 -cringe/28 1 -cringing 1 -crinkle/28 1 -crinkly/34 1 -crinoline/1 1 -Criollo 1 -cripes 1 -cripple/28 1 -crippler/1 1 -crippleware/10 1 -crippling/8 1 -Crisco/3 -crises 382 -crisis/2 383 -crisp/52 1 -crispbread/10 1 -crisper 1 -crispy/49 1 -crisscross/22 1 -Cristina/3 -criteria 384 -criterion/2 385 -critic/1 1 -critical/8 1 -criticism/1 1 -criticize/6 1 -criticizer/1 1 -critique/28 1 -critter/1 1 -croak/23 1 -croaking 1 -croaky/34 1 -Croat/1 1 -Croatia/2 1 -Croatian/1 1 -Croce -crochet/23 1 -crocheter/1 1 -crocheting/2 1 -crock/62 1 -crockery/2 1 -Crockett -crocodile/1 1 -crocus/4 1 -Croesus 1 -croft/10 1 -crofter/10 1 -crofting 1 -croissant/1 1 -Cromwell/2 1 -Cromwellian -crone/1 1 -Cronin/3 -Cronkite/3 -Cronus/2 1 -crony/15 1 -cronyism/2 1 -crook/23 1 -crooked/21 1 -Crookes -crookneck/1 1 -crook 1 -croon/23 1 -crooner/1 1 -crooning 1 -crop/47 1 -cropland/1 1 -cropper/1 1 -croquet/108 1 -croquette/1 1 -Crosby -crosier/1 1 -Cross -cross/74 1 -crossbar/18 1 -crossbeam/1 1 -crossbones/2 1 -crossbow/1 1 -crossbowman/2 386 -crossbowmen 387 -crossbred 388 -crossbreed/86 389 -crosscheck/23 1 -crosscurrent/1 1 -crosscut/128 1 -crosscutting 1 -crosser 1 -crossfire/1 1 -crosshatch/156 1 -crosshatching 1 -crossing/1 1 -crossover/1 1 -crosspatch/4 1 -crosspiece/1 1 -crossroad/130 1 -crosstalk 1 -crosstown 1 -crosswalk/1 1 -crossways -crosswind/1 1 -crosswise 1 -crossword/1 1 -crotch/4 1 -crotchet/1 1 -crotchety/222 1 -crotchless -crouch/22 1 -crouching 1 -croup/2 1 -croupier/1 1 -croup 1 -croupy/34 1 -crouton/1 1 -crow/1 1 -Crow/1 1 -crow/11 1 -crowbar/18 1 -crowd/23 1 -crowded 1 -crowfeet 390 -crowfoot/2 391 -crowing 1 -Crowley/3 -crown/23 1 -crowning 1 -crozier/1 1 -CRT/1 1 -crucial/8 1 -cruciate 1 -crucible/1 1 -crucifiable -crucifix/4 1 -crucifixion/1 1 -Crucifixion/1 1 -cruciform/1 1 -crucify/31 1 -crud/2 1 -cruddy/34 1 -crude/223 1 -crudites/2 1 -crudity/15 1 -crud 1 -cruel/21 1 -cruelty/15 1 -cruet/1 1 -cruft/10 1 -crufted -crufties -crufting -crufty -Cruikshank -Cruise/3 -cruise/28 1 -cruiser/1 1 -cruising 1 -cruller/1 1 -crumb/224 1 -crumble/28 1 -crumbling 1 -crumbly/140 1 -crumbs 1 -crumby/34 1 -crumminess/3 -crummy/34 1 -crumpet/1 1 -crumple/28 1 -crumpling 1 -crunch/22 1 -cruncher/10 1 -crunchy/49 1 -crupper/1 1 -crusade/28 1 -crusader/1 1 -Crusades -cruse/1 1 -crush/22 1 -crusher/1 1 -crushing/8 1 -Crusoe/3 -crust/23 1 -crustacean/1 1 -crustal 1 -crusted 1 -crusty/50 1 -crutch/40 1 -Crux/2 1 -crux/4 1 -Cruz/3 -cry/56 1 -crybaby/15 1 -crying/10 1 -cryogenic/32 1 -cryonics -cryostat 1 -cryosurgery/2 1 -crypt/1 1 -cryptanalysis 1 -cryptanalyst 1 -cryptanalytic 1 -cryptically -cryptic 1 -cryptogram/1 1 -cryptographer/1 1 -cryptographic -cryptographically -cryptography/2 1 -cryptology 1 -Cryptozoic/3 -Crystal/3 -crystal/18 1 -crystalline 1 -crystallization/2 1 -crystallize/6 1 -crystallographer/10 1 -crystallographic -crystallography 1 -crystal 1 -ct -Ct -CT/2 1 -Ctesiphon -Cthulhu/3 -ctn -ctr -c 1 -cu -Cu/2 1 -cub/18 1 -Cuba/2 1 -Cuban/1 1 -cubbyhole/1 1 -cube/28 1 -cuber/1 1 -cubical/8 1 -cubicle/1 1 -cubic 1 -cubing/11 1 -cubism/2 1 -cubist/1 1 -cubit/1 1 -cuboid/10 1 -Cuchulain/3 -cuckold/23 1 -cuckoldry/2 1 -cuckoo/18 1 -cucumber/1 1 -cud/1 1 -cuddle/28 1 -cuddliness -cuddly/34 1 -cudgel/23 1 -cudgelings -cue/28 1 -cuff/23 1 -cufflink/1 1 -Cuisinart -cuisine/1 1 -Culbertson -culinary 1 -cull/23 1 -Cullen/3 -cullender/1 1 -culling 1 -culminate/6 1 -culmination/1 1 -culotte/1 1 -culpability/2 1 -culpable/19 1 -culprit/1 1 -cult/1 1 -cultism/2 1 -cultist/1 1 -cultivable 1 -cultivatable -cultivate/6 1 -cultivation/1 1 -cultivator/1 1 -cultural/8 1 -culture/28 1 -culvert/1 1 -cum/1 1 -cumber/5 1 -Cumberland/2 1 -cumbersome/16 1 -cumbrous 1 -cumin/2 1 -cummerbund/1 1 -cumming -Cummings -cumquat/1 1 -cumulative/8 1 -cumuli 392 -cumulonimbi 393 -cumulonimbus/2 394 -cumulus/2 395 -Cunard/3 -cuneiform/2 1 -cunnilingus/2 1 -cunning/225 1 -Cunningham/3 -cunt/80 1 -cup/47 1 -cupboard/1 1 -cupcake/1 1 -cupful/1 1 -cupid/1 1 -Cupid/2 1 -cupidinously -cupidity/2 1 -cupola/62 1 -cuppa/10 1 -cupping 1 -cupric 1 -cur/226 1 -curability/2 1 -curable 1 -Curacao/2 1 -curacao 1 -curacy/15 1 -curare/2 1 -curate/28 1 -curative/1 1 -curator/1 1 -curatorial -curatorships -curb/23 1 -curbing/2 1 -curbside 1 -curbstone/1 1 -curd/18 1 -curdle/6 1 -curdling 1 -cure/28 1 -curer/1 1 -curettage/2 1 -curfew/1 1 -curia/53 1 -curial -curia's 396 -curia 397 -Curie -curie/1 1 -curio/1 1 -curiosity/15 1 -curious/21 1 -Curitiba -curium/2 398 -curl/23 1 -curled 1 -curler/1 1 -curlew/1 1 -curlicue/28 1 -curling/2 1 -curly/140 1 -curlycue/1 1 -curmudgeon/1 1 -curmudgeonly -currant/1 1 -currency/15 1 -current/30 1 -curricle 1 -curricular -curricula 399 -curriculum/2 400 -Currier/3 -Curry -curry/56 1 -currycomb/23 1 -currying 401 -curs/7 1 -curse/28 1 -cursed/75 1 -cursing 1 -cursive/37 1 -cursor/18 1 -cursory/72 1 -Curt/3 -curt/21 1 -curtail/11 1 -curtailment/1 1 -curtain/23 1 -Curtis/3 -curtsey/23 1 -curtsy/56 1 -curvaceous/33 1 -curvacious -curvature/1 1 -curve/28 1 -curved 1 -curvier 402 -curviest 402 -curvilinear 1 -curvy/34 1 -cushion/23 1 -cushy/34 1 -cusp/1 1 -cuspid/1 1 -cuspidor/1 1 -cuss/22 1 -cussed/83 1 -custard/1 1 -Custer -custodial 1 -custodian/1 1 -custodianship/2 1 -custody/2 1 -custom/129 1 -customary/211 1 -customer/1 1 -customhouse/1 1 -customizable -customization/1 1 -customize/6 1 -cut/227 1 -cutaneous 1 -cutaway/1 1 -cutback/1 1 -cute/27 1 -cutesie/150 1 -cutesy/34 1 -cute 1 -cutey/10 1 -cuticle/1 1 -cutie/1 1 -cutlas/228 1 -cutlass/4 1 -cutler/1 1 -cutlery/2 1 -cutlet/1 1 -cutoff/1 1 -cutout/1 1 -cutter/1 1 -cutthroat/1 1 -cutting/30 1 -cuttlefish/4 1 -cuttle 1 -cutup/1 1 -cutworm/1 1 -Cuvier/3 -Cuzco -CV -CVE/1 1 -cw -cwt 1 -cyan/2 1 -cyanide/2 1 -cyanogen 1 -cyan 1 -Cybele/2 1 -cybercafe/10 1 -cybernetic/32 1 -cyberpunk/1 1 -cyberspace/1 1 -cyborg/1 1 -Cyclades/2 1 -cyclamen/1 1 -cycle/28 1 -cycleway/10 1 -cyclical/8 1 -cyclic 1 -cycling 1 -cyclist/1 1 -cycloid 1 -cyclometer/1 1 -cyclone/1 1 -cyclonic 1 -cyclopaedia/1 1 -cyclopedia/1 1 -Cyclopes/2 1 -cyclops/229 1 -Cyclops/2 1 -cyclotron/1 1 -cyder/1 1 -cygnet/1 1 -Cygnus/2 1 -cylinder/18 1 -cylindrical/8 1 -cymbal/1 1 -cymbalist/1 1 -Cymbeline/3 -cynic/1 1 -cynical/8 1 -cynicism/2 1 -cynic 1 -cynosure/1 1 -Cynthia/2 1 -cypher/23 1 -cypress/4 1 -Cyprian/2 1 -Cypriot/1 1 -Cyprus/2 1 -Cyrano/3 -Cyril -Cyrillic/2 1 -Cyrus -cyst/1 1 -cysteine 1 -cystic 1 -cystitis 1 -cytochrome 1 -cytological 1 -cytologist/1 1 -cytology/2 1 -cytoplasm/2 1 -cytoplasmic -cytosine/2 1 -cytotoxic -CZ -czar/1 1 -czarina/1 1 -czarism 1 -czarist/1 1 -Czech/1 1 -Czechoslovakia/2 1 -Czechoslovakian/1 1 -Czechoslovak 1 -Czech 1 -Czerny -Csonka/3 -CST/2 1 -D/2 1 -d/230 1 -DA/2 1 -dab/136 1 -dabber/1 1 -dabble/6 1 -dabbler/1 1 -dabbling 1 -Dacca/2 1 -dace/1 1 -dacha/1 1 -Dachau/2 1 -dachshund/1 1 -Dacron/1 1 -dactyl/1 1 -dactylic/1 1 -dad/1 1 -Dada/2 1 -dadaism/2 1 -Dadaism/2 1 -dadaist/1 1 -daddy/15 1 -dado/40 1 -Daedalus/2 1 -daemon/1 1 -daemonic -daffiness/3 -daffodil/1 1 -daffy/34 1 -daft/21 1 -dag/70 1 -dagger/18 1 -dago/231 1 -Daguerre -daguerreotype/28 1 -Dagwood 1 -dahlia/1 1 -Dahomey/2 1 -dailies -daily/140 1 -daily's -Daimler/3 -dainty/221 1 -daiquiri/1 1 -dairy/15 1 -dairying/2 1 -dairymaid/1 1 -dairyman/2 403 -dairymen 404 -dairywoman/2 405 -dairywomen 406 -dais/4 1 -daisy/15 1 -Daisy 1 -Dakar/2 1 -Dakota/1 1 -Dakotan 1 -Dale -dale/1 1 -dalesman 1 -dales 407 -Daley/3 -Dali -Dalian/3 -Dallas/2 1 -dalliance/1 1 -dallier/1 1 -Dalmatia/2 1 -dalmatian/1 1 -Dalmatian/1 1 -Dalton/2 1 -dally/31 1 -dam/160 1 -damage/232 1 -damageable 1 -damaging/8 1 -Damascus/2 1 -damask/23 1 -dame/1 1 -Dame 1 -Damian/3 -Damien -Damion/3 -dammit 1 -damn/23 1 -damnable/19 1 -damnation/2 1 -damned/166 1 -damnedest 1 -damning/8 1 -damn 1 -Damocles -Damon/2 1 -damp/52 1 -dampen/11 1 -dampener/1 1 -damper/1 1 -damping 1 -damsel/1 1 -damselflies -damselfly/3 -damson/1 1 -Dana/53 1 -dance/28 1 -danceable 1 -dancer/1 1 -dancing/2 1 -dandelion/1 1 -dander/2 1 -dandify/31 1 -dandle/6 1 -dandruff/2 1 -dandy/42 1 -Dane/1 1 -Danelaw -dang/233 1 -danger/18 1 -Dangerfield/3 -dangerous/83 1 -dangle/43 1 -dangler/1 1 -dangling 1 -Danial/3 -Daniel/1 1 -Danielle/3 -Danish/2 1 -danish/4 1 -Danish 1 -dank/21 1 -Dannie/3 -Danone/3 -danseuse/1 1 -Dante/2 1 -Danton 1 -Dan 1 -Danube/2 1 -Danubian -Danny/3 -Daphne/2 1 -dapper/166 1 -dapple/28 1 -DAR -Darby/3 -Darcy/3 -Dardanelles/2 1 -Dare -dare/28 408 -daredevil/1 1 -daredevilry/2 1 -Daren/3 -darer/1 1 -daresay 1 -dares 409 -d'Arezzo -Darfur -Darin/3 -daring/37 1 -Dario/3 -Darius -Darjeeling 1 -dark/234 1 -darken/11 1 -darkener/1 1 -darkie/10 1 -darkish 1 -darkroom/1 1 -dark 1 -Darla/3 -Darlene/3 -darling/1 1 -Darling/2 1 -darling 1 -darn/78 1 -darned/166 1 -Darnell/3 -darner/1 1 -darning 1 -Darrel/3 -Darrell/3 -Darren/3 -Darrin/3 -Darrow -Darryl/3 -dart/23 1 -dartboard/1 1 -darter/1 1 -Darth/3 -darting 1 -Dartmoor -Dartmouth -Darvon/2 1 -Darwin/2 1 -Darwinian 1 -Darwinism/1 1 -Darwinist 1 -Daryl/3 -dash/22 1 -dashboard/1 1 -dashed 1 -dasher/1 1 -dashes 410 -dashiki/1 1 -dashing/8 1 -dastard/30 1 -dastardly/140 1 -DAT/2 1 -databank/1 1 -database/18 1 -datable 1 -Datamation/10 1 -data 411 -date/28 1 -datebook/10 1 -dateless 1 -dateline/28 1 -dater/1 1 -dative/1 1 -datum/1 412 -daub/23 1 -dauber/1 1 -daubing 1 -Daugherty/3 -daughter/1 1 -daughterly 1 -Daumier -daunt/11 1 -daunting/8 1 -dauntless/16 1 -dauphin/1 1 -Davao -Dave/3 -Davenport -davenport/1 1 -David/1 1 -Davidson/3 -Davis -davit/1 1 -Davy/60 1 -dawdle/6 1 -dawdler/1 1 -dawdling 1 -Dawes -Dawn/3 -dawn/23 1 -dawning 1 -Dawson -day/1 1 -Dayan -daybed/1 1 -daybreak/2 1 -daycare/2 1 -daydream/23 1 -daydreamer/1 1 -daylight/138 1 -daylong 1 -daysack -daytime/2 1 -Dayton 1 -Day 1 -daze/28 1 -dazed/8 1 -dazzle/28 1 -dazzler/1 1 -dazzling/8 1 -dbl -DBMS/2 1 -db 1 -dB 1 -dc -DC/2 1 -dd -DD/2 1 -dded -dding -dds -DDS/2 1 -DDT/10 1 -DE -DEA -deacon/18 1 -deaconess/3 -deaconesses -deactivate/6 1 -deactivation/2 1 -dead/235 1 -deadbeat/1 1 -deadbolt/1 1 -deaden/11 1 -deadening 1 -deader 1 -Deadhead/3 -deadhead/5 1 -deadline/18 1 -deadlines 1 -deadlock/23 1 -deadly/140 1 -deadpan/133 1 -deadweight/1 1 -deadwood/2 1 -deaf/236 1 -deafen/11 1 -deafening/8 1 -deaf 1 -deal/237 1 -dealer/1 1 -dealership/1 1 -dealing/1 1 -Dean -dean/18 1 -Deana/3 -Deandre/3 -deanery/15 1 -Deann/3 -Deanna/3 -Deanne/3 -deanship/2 1 -dear/38 1 -dearests -dearie/1 1 -dearth/1 1 -deary/15 1 -death/1 1 -deathbed/1 1 -deathblow/1 1 -deathless/8 1 -deathlike 1 -deathly/34 1 -deathtrap/1 1 -deathwatch/4 1 -deb/1 1 -debacle/1 1 -debar/13 1 -debark/11 1 -debarkation/2 1 -debarment/2 1 -debase/6 1 -debased 1 -debasement/1 1 -debaser 1 -debasing 1 -debatable -debate/28 1 -debater/1 1 -debating's -debauch/22 1 -debauched 1 -debauchee/1 1 -debauchery/15 1 -Debbie/3 -Debby/3 -debenture/1 1 -Debian/3 -debilitate/6 1 -debilitation/2 1 -debility/15 1 -debit/23 1 -debonair/16 1 -debonaire -Debora/3 -Deborah -debouch/156 1 -Debouillet/3 -Debra/3 -debrief/11 1 -debriefing/1 1 -debris/2 1 -Debs -debt/1 1 -debtor/1 1 -debug/117 1 -debugger/10 1 -debunk/11 1 -Debussy -debut/23 1 -debutante/1 1 -debutant 1 -Dec/2 1 -DEC/5 1 -decade/1 1 -decadence/2 1 -decadency/2 1 -decadent/30 1 -decaf/1 1 -decaff -decaffeinate/6 1 -decaffs -decagon/1 1 -decal/18 1 -Decalog -Decalogue/2 1 -decamp/11 1 -decampment/2 1 -decant/11 1 -decanter/1 1 -decapitate/6 1 -decapitation/1 1 -decapitator/1 1 -decathlete/10 1 -decathlon/1 1 -Decatur -decay/23 1 -decayed 1 -Decca/3 -Deccan -decease/28 1 -deceased's -decedent/1 1 -deceit/1 1 -deceitful/16 1 -deceive/6 1 -deceiver/1 1 -deceivingly -decelerate/6 1 -deceleration/1 1 -decelerator/1 1 -December/1 1 -decency/15 1 -decennial/1 1 -decent/75 1 -decenter 1 -decentralization/2 1 -decentralize/6 1 -deception/1 1 -deceptive/16 1 -decibel/1 1 -decidability 1 -decidable -decide/6 1 -decided/8 1 -decider/10 1 -deciduous 1 -deciles -deciliter/1 1 -decimal/1 1 -decimalization 1 -decimalize 1 -decimal 1 -decimate/6 1 -decimation/2 1 -decimeter/1 1 -decipher/11 1 -decipherable 1 -decipherment/10 1 -decision/18 1 -decisive/16 1 -deck/23 1 -deckchair/10 1 -Decker -deckhand/1 1 -decking 1 -deckle/10 1 -declaim/11 1 -declaimer/1 1 -declaiming 1 -declamation/1 1 -declamatory -declarable -declaration/1 1 -declarative 1 -declaratory -declare/6 1 -declared 1 -declarer/1 1 -declassification/2 1 -declassify/31 1 -declension/1 1 -declination/1 1 -decline/28 1 -decliner/1 1 -declivity/15 1 -decode/6 1 -decoder/1 1 -decolletage/1 1 -decollete 1 -decolonization/2 1 -decolonize/6 1 -decolorizing -decommission/11 1 -decomposable -decompose/6 1 -decomposition/1 1 -decompress/7 1 -decompression/2 1 -decongestant/1 1 -deconstruct/11 1 -deconstruction/1 1 -deconstructionism 1 -deconstructionist/10 1 -deconstructive -decontaminate/6 1 -decontamination/2 1 -decontrol/61 1 -decontrolling 1 -deconvolution -deconvolve -decor/1 1 -decorate/6 1 -decorating/2 1 -decoration/1 1 -decorative/8 1 -decorator/1 1 -decorous/16 1 -decorum/2 1 -deco 1 -decoupage/28 1 -decouple/6 1 -decoy/23 1 -decrease/28 1 -decreasing/8 1 -decree/63 1 -decrement/5 1 -decremental -decrepit 1 -decrepitude/2 1 -decrescendo/18 1 -decriminalization/2 1 -decriminalize/6 1 -decry/31 1 -decrypt/11 1 -decryption 1 -decustomised -Dedekind/3 -dedicate/6 1 -dedication/1 1 -dedicator/1 1 -dedicatory 1 -deduce/6 1 -deducible 1 -deduct/11 1 -deductible/1 1 -deduction/1 1 -deductive/8 1 -Dee -deed/23 1 -deejay/18 1 -deem/11 1 -Deena/3 -deep/38 1 -deepen/11 1 -deepening 1 -deepish -deer/1 1 -Deere/3 -deerskin/2 1 -deerstalker/10 1 -deerstalking 1 -deescalate/6 1 -deescalation/2 1 -def/238 1 -deface/6 1 -defacement/2 1 -defacer/1 1 -defaecate -defalcate/6 1 -defalcation/1 1 -defamation/2 1 -defamatory -defame/6 1 -defamer/1 1 -defaming 1 -default/23 1 -defaulter/1 1 -defeat/23 1 -defeater/1 1 -defeatism/2 1 -defeatist/1 1 -defecate/6 1 -defecation/2 1 -defect/23 1 -defection/1 1 -defective/36 1 -defector/1 1 -defend/11 1 -defendant/1 1 -defender/1 1 -defenestrate/214 1 -defenestration/10 1 -defense/28 1 -defenseless/16 1 -defensibility 1 -defensible/19 1 -defensive/239 1 -defer/13 1 -deference/2 1 -deferential/8 1 -deferment/1 1 -deferral/1 1 -defiance/2 1 -defiant/8 1 -defibrillator/10 1 -deficiency/15 1 -deficient 1 -deficit/1 1 -defile/28 1 -defilement/2 1 -defiler/1 1 -defiling 1 -definable/19 1 -define/6 1 -definer/1 1 -definite/16 1 -definition/1 1 -definitional -definitive/83 1 -deflatable -deflate/6 1 -deflation/2 1 -deflationary -deflect/11 1 -deflection/1 1 -deflective -deflector/1 1 -deflower/11 1 -Defoe -defog/117 1 -defogger/1 1 -defoliant/1 1 -defoliate/6 1 -defoliation/2 1 -defoliator/1 1 -deforest/11 1 -deforestation/2 1 -deform/11 1 -deformable -deformation/1 1 -deformed 1 -deformity/15 1 -defraud/11 1 -defrauder/1 1 -defray/11 1 -defrayal/2 1 -defrock/11 1 -defrost/11 1 -defroster/1 1 -deft/21 1 -defunct 1 -defuse/6 1 -defy/31 1 -deg -Degas -degas/240 1 -degauss/241 1 -degeneracy/15 1 -degenerate/28 1 -degeneration/2 1 -degenerative -DeGeneres/3 -degradable -degradation/1 1 -degrade/6 1 -degraded 1 -degrading 1 -degrease 1 -degree/1 1 -dehumanization/2 1 -dehumanize/6 1 -dehumidifier/1 1 -dehumidify/31 1 -dehydrate/6 1 -dehydration/2 1 -dehydrator/1 1 -dehydrogenate/6 1 -dehydrogenation 1 -deice/6 1 -deicer/1 1 -deictic 1 -Deidre/3 -deification/2 1 -deify/31 1 -deign/11 1 -Deimos -deionized -Deirdre -deism/2 1 -deist/1 1 -deistic 1 -Deity -deity/15 1 -deject/11 1 -dejected/8 1 -dejection/2 1 -deject 1 -Dejesus/3 -Del -Delacroix -Delacruz/3 -Delaney/3 -Delano/3 -Delaware/1 1 -Delawarean/1 1 -delay/23 1 -delayer/18 1 -Delbert/3 -delectable/19 1 -delectation/2 1 -delegate/28 1 -delegation/1 1 -Deleon/3 -deletable -delete/6 1 -deleter -deleterious/8 1 -deletion/1 1 -delft/2 1 -delftware/2 1 -Delgado -Delhi/2 1 -deli/1 1 -Delia/3 -deliberate/67 1 -deliberation/1 1 -deliberative 1 -Delibes -delicacy/15 1 -delicate/16 1 -delicatessen/1 1 -delicate 1 -delicious/16 1 -Delicious/2 1 -delight/23 1 -delighted/8 1 -delightful/8 1 -Delilah/1 1 -deliminator -deliminators -delimit/11 1 -delimitation/2 1 -delimiter/10 1 -delineate/6 1 -delineation/1 1 -delinquency/15 1 -delinquent/30 1 -delint -delinted -delinting -delints -deliquesce/6 1 -deliquescent -delirious/16 1 -delirium/1 1 -delis 1 -Delius -deliver/11 1 -deliverable -deliverance/2 1 -deliverer/1 1 -delivery/15 1 -deliveryman/2 413 -deliverymen 414 -Dell/3 -dell/1 1 -Della/3 -Delmar/3 -Delmarva/3 -Delmer/3 -Delmonico 1 -Delores/3 -Deloris/3 -delouse/6 1 -Delphi/2 1 -Delphic 1 -delphinium/1 1 -Delphinus/2 1 -Delta -delta/1 1 -deltoids -delude/6 1 -deluge/28 1 -delusion/1 1 -delusional -delusive/8 1 -deluxe 1 -delve/6 1 -delver/1 1 -Dem -demagnetization/2 1 -demagnetize/6 1 -demagog/18 1 -demagogic -demagogically -demagogue/18 1 -demagoguery/2 1 -demagogy/2 1 -demand/23 1 -demanding 1 -demarcate/6 1 -demarcation/1 1 -dematerialize/122 1 -Demavend/2 1 -demean/11 1 -demeaning 1 -demeanor/2 1 -demented/8 1 -dementia/2 1 -demerit/18 1 -Demerol/2 1 -demesne/1 1 -Demeter/2 1 -Demetrius/2 1 -demigod/1 1 -demigoddess/4 1 -demijohn/1 1 -demilitarization/2 1 -demilitarize/6 1 -demimondaine/1 1 -demimonde/2 1 -Deming/3 -demise/28 1 -demist/11 1 -demister/10 1 -demitasse/1 1 -demo/23 1 -demob/145 1 -demobilization/2 1 -demobilize/6 1 -democracy/15 1 -democrat/1 1 -Democrat/1 1 -Democratic -democratic/39 1 -democratization/2 1 -democratize/6 1 -Democritus -demode 1 -demodulate/6 1 -demodulation/2 1 -demodulator 1 -demographer/1 1 -demographic/130 1 -demographically -demography/2 1 -demolish/7 1 -demolisher 1 -demolition/1 1 -demon/1 1 -demonetization/2 1 -demonetize/6 1 -demoniacal/8 1 -demoniac 1 -demonic -demonically -demonize/6 1 -demonology/15 1 -demonstrability 1 -demonstrable/19 1 -demonstrate/6 1 -demonstrated 1 -demonstration/1 1 -demonstrative/36 1 -demonstrator/1 1 -demoralization/2 1 -demoralize/6 1 -Demosthenes/2 1 -demos 1 -demote/6 1 -demotic 1 -demotion/1 1 -demotivate/6 1 -demount/241 1 -demountable -Dempsey -demulcent/1 1 -demur/242 1 -demure/27 1 -demurral/1 1 -demurrer/1 1 -demystification/2 1 -demystify/31 1 -den/18 1 -Dena/3 -Denali -denationalization 1 -denationalize/6 1 -denature/6 1 -dendrite/1 1 -dendrochronological 1 -dendrochronology 1 -Deneb -Denebola/3 -Deng/3 -dengue/2 1 -deniable 1 -denial/1 1 -denier/1 1 -denigrate/6 1 -denigration/1 1 -denim/1 1 -Denise/3 -Denis 1 -denizen/18 1 -Denmark/2 1 -Dennis -denominate/6 1 -denomination/1 1 -denominational 1 -denominator/1 1 -denotation/1 1 -denotational -denotative 1 -denote/6 1 -denouement/1 1 -denounce/6 1 -denouncement/1 1 -dens/166 1 -dense/27 1 -density/15 1 -dent/23 1 -dental 1 -dentally 1 -dentifrice/1 1 -dentin/2 1 -dentine/2 1 -dentist/1 1 -dentistry/2 1 -dentition/2 1 -denture/1 1 -denuclearize/6 1 -denudation/2 1 -denude/6 1 -denunciation/1 1 -Denver/2 1 -deny/31 1 -Denny/3 -deodorant/1 1 -deodorization/2 1 -deodorize/6 1 -deodorizer/1 1 -Deon/3 -depart/11 1 -departed's -departing 1 -department/1 1 -departmental/8 1 -departmentalization/2 1 -departmentalize/6 1 -departure/1 1 -depend/11 1 -dependability/2 1 -dependable/19 1 -dependance/2 1 -dependence/2 1 -dependency/15 1 -dependent/30 1 -depersonalization 1 -depersonalize/6 1 -depict/11 1 -depiction/1 1 -depilatory/15 1 -deplane/6 1 -deplete/6 1 -depletion/2 1 -deplorable/19 1 -deplore/6 1 -deploy/11 1 -deployment/1 1 -depolarization/1 1 -depolarize/6 1 -depoliticize/6 1 -deponent/1 1 -depopulate/6 1 -depopulation/2 1 -deport/11 1 -deportation/1 1 -deportee/1 1 -deportment/2 1 -depose/6 1 -deposit/23 1 -depositary 1 -deposition/1 1 -depositional -depositor/1 1 -depository/15 1 -depot/1 1 -Depp/3 -deprave/6 1 -depraved 1 -depravity/15 1 -deprecate/6 1 -deprecating/8 1 -deprecation/1 1 -deprecatory 1 -depreciate/6 1 -depreciating 1 -depreciation/2 1 -depredation/1 1 -depress/7 1 -depressant/1 1 -depressing/8 1 -depression/1 1 -depressive/1 1 -depressor/1 1 -depressurization 1 -depressurize/6 1 -deprivation/1 1 -deprive/6 1 -deprogram/114 1 -dept -depth/1 1 -deputation/1 1 -depute/6 1 -deputize/6 1 -deputy/15 1 -derail/5 1 -derailleur/1 1 -derailment/1 1 -derange/6 1 -derangement/2 1 -derby/15 1 -Derby 1 -deregulate/6 1 -deregulation/2 1 -Derek/3 -derelict/1 1 -dereliction/1 1 -derelict 1 -deres -Derick/3 -deride/6 1 -deriders -derision/2 1 -derisive/16 1 -derisory 1 -derivable -derivation/1 1 -derivative/30 1 -derive/6 1 -dermal 1 -dermatitis/2 1 -dermatological -dermatologist/1 1 -dermatology/2 1 -dermis/2 1 -derogate/6 1 -derogation/2 1 -derogatory/211 1 -Derrick/3 -derrick/18 1 -Derrida/3 -derriere/1 1 -derringer/1 1 -dervish/4 1 -derv 1 -desalinate/6 1 -desalination/2 1 -desalinization/2 1 -desalinize/6 1 -desalt/11 1 -desalting 1 -desaturated -descale/6 1 -descant/23 1 -Descartes/2 1 -descend/11 1 -descendant/1 1 -descendent/1 1 -descender/10 1 -descending 1 -descent/1 1 -describable 1 -describe/6 1 -describer/1 1 -description/1 1 -descriptive/16 1 -descriptivism 1 -descriptor/10 1 -descry/31 1 -Desdemona/3 -desecrate/6 1 -desecration/2 1 -desegregate/6 1 -desegregation/2 1 -deselect/11 1 -deselection 1 -desensitization/2 1 -desensitize/6 1 -desert/78 1 -deserted 1 -deserter/1 1 -desertification 1 -desertion/1 1 -deserve/6 1 -deserved/8 1 -deserving 1 -deshabille/2 1 -desiccant/1 1 -desiccate/6 1 -desiccation/2 1 -desiccator/1 1 -desiderata 415 -desideratum/2 416 -design/23 1 -designable -designate/6 1 -designation/1 1 -designational -designator/10 1 -designed/8 1 -designer/1 1 -designing/2 1 -desirabilia -desirability/2 1 -desirable/29 1 -desire/28 1 -desired 1 -Desiree/3 -desirous 1 -desist/11 1 -desk/1 1 -deskill/11 1 -desktop/1 1 -Desmond/3 -desolate/67 1 -desolation/2 1 -desorption 1 -despair/23 1 -despairing/8 1 -desperado/4 1 -desperate/16 1 -desperation/2 1 -despicable/19 1 -despise/6 1 -despite 1 -despoil/11 1 -despoiler/1 1 -despoilment/2 1 -despoliation/2 1 -despondence/2 1 -despondency/2 1 -despondent/8 1 -despond 1 -despot/1 1 -despotic -despotically -despotism/2 1 -dessert/1 1 -dessertspoon/10 1 -dessertspoonful/10 1 -destabilization/2 1 -destabilize/6 1 -d'Estaing -destination/1 1 -destine/6 1 -destiny/15 1 -destitute 1 -destitution/2 1 -destroy/11 1 -destroyable -destroyer/1 1 -destruct/23 1 -destructibility/2 1 -destructible 1 -destruction/2 1 -destructive/16 1 -destruct 1 -desuetude/2 1 -desultory/243 1 -detach/7 1 -detachable -detached 1 -detachment/1 1 -detail/23 1 -detailed 1 -detain/11 1 -detainee/1 1 -detainment/2 1 -detect/11 1 -detectability 1 -detectable -detectably -detectible -detection/1 1 -detective/1 1 -detector/1 1 -detente/1 1 -detention/1 1 -deter/13 1 -detergent/1 1 -deteriorate/6 1 -deterioration/2 1 -determent/2 1 -determinable 1 -determinacy 1 -determinant/1 1 -determinate/8 1 -determination/1 1 -determinative 1 -determine/6 1 -determined/8 1 -determiner/1 1 -determinism/2 1 -deterministic -deterministically -determinist 1 -deterrence/2 1 -deterrent/1 1 -detest/11 1 -detestable/19 1 -detestation/2 1 -detester/10 1 -dethrone/6 1 -dethronement/2 1 -dethroning 1 -detonate/6 1 -detonation/1 1 -detonator/1 1 -detour/23 1 -detox/22 1 -detoxification/2 1 -detoxify/31 1 -detract/11 1 -detracting 1 -detraction/2 1 -detractor/1 1 -detriment/1 1 -detrimental/8 1 -detritus/2 1 -Detroit/2 1 -deuce/18 1 -deuterium/2 1 -Deuteronomy/2 1 -deuteron 1 -Deutschmark/1 1 -devaluation/1 1 -devalue/6 1 -Devanagari/2 1 -devastate/6 1 -devastatingly -devastation/2 1 -devastator/1 1 -develop/11 1 -developer/1 1 -development/1 1 -developmental/8 1 -Devi/2 1 -deviance/2 1 -deviancy/2 1 -deviant/1 1 -deviate/28 1 -deviation/1 1 -device/1 1 -devil/1 1 -Devil/2 1 -devil/11 1 -deviling 1 -devilish/16 1 -devilment/2 1 -devilry/15 1 -deviltry/15 1 -Devin/3 -devious/16 1 -devise/28 1 -devitalize/6 1 -devoid 1 -devolution/2 1 -devolve/6 1 -Devon/2 1 -Devonian/2 1 -devote/6 1 -devoted/83 1 -devotee/1 1 -devotion/1 1 -devotional/1 1 -devour/11 1 -devourer/10 1 -devouring 1 -devout/21 1 -dew/18 1 -Dewar/2 1 -Dewayne/3 -dewberry/15 1 -dewclaw/1 1 -dewdrop/1 1 -Dewey/2 1 -Dewitt/3 -dewlap/1 1 -dewy/49 1 -Dexedrine/2 1 -Dexter -dexterity/2 1 -dexterous/16 1 -dextrose/2 1 -dextrous/8 1 -DH -Dhaka/2 1 -Dhaulagiri/2 1 -dhoti/1 1 -dhow/1 1 -Di -DI -diabetes/2 1 -diabetic/1 1 -diabolic -diabolical/8 1 -diabolism 1 -diachronic -diacritic/1 1 -diacriticals -diacritical 1 -diadem/18 1 -diaereses 417 -diaeresis/2 418 -Diaghilev -diagnosable -diagnose/6 1 -diagnoses 419 -diagnosis/2 420 -diagnostic/35 1 -diagnostician/1 1 -diagonal/30 1 -diagonalize/6 1 -diagram/160 1 -diagrammatic -diagrammatically -Dial/3 -dial/23 1 -dialect/1 1 -dialectal 1 -dialectic/130 1 -dialectical/8 1 -dialer 1 -dialing/10 1 -dialog/18 1 -dialogue/18 1 -dialysis/2 1 -dialyzes -diamante 1 -diameter/1 1 -diametric -diametrical/8 1 -diamond/18 1 -diamondback/1 1 -diamond 1 -diam 1 -Diana/2 1 -Diane/3 -Diann/3 -Dianna/3 -Dianne/3 -diapason/1 1 -diaper/23 1 -diapering 1 -diaphanous 1 -diaphragm/18 1 -diaphragmatic 1 -diarist/1 1 -diarrhea/2 1 -diary/15 1 -Dias -Diaspora/1 1 -diaspora 1 -diastase/2 1 -diastole/2 1 -diastolic -diathermy/2 1 -diatom/1 1 -diatomic -diatonic 1 -diatribe/1 1 -Diaz -dibble/28 1 -dibs -dibs's -DiCaprio/3 -dice/43 1 -dices 421 -dicey 422 -dichloride 1 -dichotomous 1 -dichotomy/15 1 -dicier 423 -diciest 423 -dicing 1 -Dick -dick/18 1 -Dickens -Dickensian 1 -dickens 1 -dicker/5 1 -Dickerson/3 -dickey/1 424 -dickhead/10 1 -dickier 425 -dickiest 425 -Dickinson -Dickson/3 -dicky/244 1 -dickybird/10 1 -dicotyledon/1 1 -dicotyledonous -dict -Dictaphone/1 1 -dicta 426 -dictate/28 1 -dictation/1 1 -dictator/1 1 -dictatorial/8 1 -dictatorship/1 1 -diction/2 1 -dictionary/15 1 -dictum/2 427 -didactically -didactic 1 -diddle/6 1 -diddler/1 1 -diddly -diddlysquat -diddums -Diderot -didgeridoo/10 1 -didn't -Dido/2 1 -dido/4 1 -Didrikson/3 -did 428 -didst 428 -die/245 429 -Diefenbaker -Diego/3 -diehard/1 1 -dielectric/1 1 -Diem/3 -diereses 430 -dieresis/2 431 -diesel/1 1 -Diesel/2 1 -diesel/11 1 -dieseling 1 -dies 1 -diet/78 1 -dietary/15 1 -dieter/1 1 -dietetic/32 1 -dietician/1 1 -dietitian/1 1 -Dietrich -diff/11 1 -differ/11 1 -difference/73 1 -different/8 1 -differentiability 1 -differentiable -differential/30 1 -differentiate/6 1 -differentiation/1 1 -differentiators -difficult/8 1 -difficulty/15 1 -diffidence/2 1 -diffident/8 1 -diffract/11 1 -diffraction/2 1 -diffuse/246 1 -diffused 1 -diffuser/10 1 -diffusion/2 1 -diffusional -diffusive 1 -diffusivity 1 -dig/247 432 -digerati/2 1 -digest/23 1 -digested 1 -digestibility/2 1 -digestible 1 -digestion/1 1 -digestive/10 1 -digger/1 1 -digging/32 1 -digit/1 1 -digital/8 1 -digitalis/2 1 -digital 1 -digitization 1 -digitize/6 1 -digitizer/10 1 -dignified 1 -dignify/31 1 -dignitary/15 1 -dignity/15 1 -digraph/1 1 -digress/7 1 -digression/1 1 -digressive 1 -dihedral 1 -Dijkstra/3 -Dijon -dike/28 1 -diktat/10 1 -dilapidated -dilapidation/2 1 -dilatation/2 1 -dilate/6 1 -dilation/2 1 -dilator/1 1 -dilatory 1 -Dilbert/1 1 -dildo/10 1 -dilemma/1 1 -dilettante/1 1 -dilettantish -dilettantism/2 1 -diligence/2 1 -diligent/8 1 -dill/18 1 -Dillard/3 -dillies -Dillinger/3 -Dillon/3 -diluent 1 -dilute/6 1 -dilution/1 1 -dilly/3 -dillydally/31 1 -dim/248 1 -DiMaggio -dime/48 1 -dimension/23 1 -dimensional/8 1 -dimensionality 1 -dimensionless 1 -dimer/10 1 -diminish/7 1 -diminishable 1 -diminishing 1 -diminuendo/1 1 -diminution/1 1 -diminutive/1 1 -dimity/2 1 -dimmer/1 1 -dimorphic -dimorphism 1 -dimple/28 1 -dimply/34 1 -dimwit/1 1 -dimwitted -din/133 1 -Dina/3 -Dinah -dinar/1 1 -dine/6 1 -diner/1 1 -dinette/1 1 -ding/23 1 -dingbat/1 1 -dingdong/23 1 -dinghy/15 1 -dingier 433 -dingiest 433 -dingle/1 1 -dingo/4 1 -dingos -dingus/4 1 -dingy/50 1 -dink/166 1 -dinkier 434 -dinkiest 434 -dink 1 -dinky/42 1 -dinner/23 1 -dinnertime/2 1 -dinnerware/2 1 -Dino/3 -dinosaur/1 1 -dint/18 1 -diocesan/1 1 -diocese/1 1 -Diocletian -diode/1 1 -Diogenes -Dion/3 -Dionne/3 -Dionysian -Dionysus/2 1 -Diophantine/3 -diopter/10 1 -Dior -diorama/1 1 -dioxide/1 1 -dioxin/1 1 -dip/47 1 -diphtheria/2 1 -diphthong/18 1 -diplexers -diploid/1 1 -diploma/249 1 -diplomacy/2 1 -diplomat/1 1 -diplomatically -diplomatic 1 -diplomatist/1 1 -dipole/1 1 -dipper/1 1 -Dipper/2 1 -dippy/34 1 -dipso/10 1 -dipsomania/2 1 -dipsomaniac/1 1 -dipstick/1 1 -dipterous -diptych/1 1 -Dir -Dirac -dire/250 1 -direct/98 1 -direction/1 1 -directionality 1 -directional 1 -directionally -directionless 1 -directive/1 1 -director/1 1 -directorate/1 1 -directorial 1 -directorship/1 1 -directory/15 1 -direful 1 -dirge/1 1 -Dirichlet -dirigible/1 1 -Dirk/3 -dirk/18 1 -dirndl/1 1 -dirt/2 1 -dirtball -dirtballs -dirt 1 -dirty/143 1 -dis/228 1 -Dis/2 1 -dis/79 1 -disability/15 1 -disable/6 1 -disablement/2 1 -disabuse/6 1 -disadvantage/28 1 -disadvantageous/8 1 -disaffect/11 1 -disaffected 1 -disaffection/2 1 -disaffiliate/6 1 -disaffiliation/2 1 -disafforest/11 1 -disaggregated -disaggregation 1 -disagree/46 1 -disagreeable/29 1 -disagreement/1 1 -disallow/11 1 -disambiguate/251 1 -disambiguation 1 -disappear/11 1 -disappearance/1 1 -disappoint/11 1 -disappointed 1 -disappointing/8 1 -disappointment/1 1 -disapprobation/2 1 -disapproval/2 1 -disapprove/6 1 -disapproving/8 1 -disarm/11 1 -disarmament/2 1 -disarming/8 1 -disarrange/6 1 -disarrangement/2 1 -disarray/23 1 -disassemble/6 1 -disassembler 1 -disassociate/6 1 -disassociation/2 1 -disaster/1 1 -disastrous/8 1 -disavow/11 1 -disavowal/1 1 -disband/11 1 -disbandment/2 1 -disbar/13 1 -disbarment/2 1 -disbelief/120 1 -disbelieve/6 1 -disbeliever/1 1 -disbelieving/8 1 -disbursal/2 1 -disburse/6 1 -disbursement/1 1 -disc/18 1 -discard/23 1 -discern/11 1 -discernible/19 1 -discerning/8 1 -discernment/2 1 -discharge/28 1 -disciple/18 1 -discipleship/2 1 -disciplinarian/1 1 -disciplinary -discipline/28 1 -disclaim/11 1 -disclaimer/1 1 -disclose/6 1 -disclosure/1 1 -disco/23 1 -discography/15 1 -discolor/11 1 -discoloration/1 1 -discombobulate/6 1 -discombobulation/2 1 -discomfit/5 1 -discomfiture/2 1 -discomfort/23 1 -discommode/6 1 -discompose/6 1 -discomposed 1 -discomposure/2 1 -disconcert/11 1 -disconcerted 1 -disconcerting/8 1 -disconnect/11 1 -disconnected/16 1 -disconnection/1 1 -disconsolate/8 1 -disconsolation 1 -discontent/23 1 -discontented/8 1 -discontentment/2 1 -discontinuance/1 1 -discontinuation/1 1 -discontinue/6 1 -discontinuity/15 1 -discontinuous/8 1 -discord/23 1 -discordance/2 1 -discordant/8 1 -discotheque/1 1 -disco 1 -discount/78 1 -discountability -discountable -discountenance/43 1 -discounter/1 1 -discourage/6 1 -discouragement/1 1 -discouraging/8 1 -discourse/28 1 -discourteous/8 1 -discourtesy/15 1 -discover/11 1 -discoverable 1 -discoverer/1 1 -discovery/15 1 -discredit/23 1 -discreditable/19 1 -discreet/21 1 -discrepancy/15 1 -discrepant 1 -discrete/16 1 -discretion/2 1 -discretionary 1 -discriminant/10 1 -discriminate/6 1 -discriminating 1 -discrimination/2 1 -discriminative 1 -discriminator/1 1 -discriminatory -discursive/16 1 -discus/252 1 -discuss/7 1 -discussable -discussant/1 1 -discussion/1 1 -disdain/23 1 -disdainful/8 1 -disease/77 1 -diseased 1 -disembark/11 1 -disembarkation/2 1 -disembodiment/2 1 -disembody/31 1 -disembowel/11 1 -disembowelment/2 1 -disenchant/11 1 -disenchantment/2 1 -disencumber/11 1 -disenfranchise/6 1 -disenfranchisement/2 1 -disengage/6 1 -disengagement/1 1 -disentangle/6 1 -disentanglement/2 1 -disequilibrium/2 1 -disestablish/7 1 -disestablishment/2 1 -disesteem/23 1 -disfavor/23 1 -disfigure/6 1 -disfigurement/1 1 -disfranchise/6 1 -disfranchisement/2 1 -disgorge/6 1 -disgorgement/2 1 -disgrace/28 1 -disgraceful/16 1 -disgruntle/6 1 -disgruntlement/2 1 -disguise/28 1 -disguised 1 -disguising 1 -disgust/23 1 -disgusted/8 1 -disgusting/8 1 -dish/22 1 -dishabille/2 1 -disharmonious -disharmony/2 1 -dishcloth/1 1 -dishearten/11 1 -disheartening/8 1 -dishevel/11 1 -dishevelment/2 1 -dishing 1 -dishonest/8 1 -dishonesty/2 1 -dishonor/23 1 -dishonorable/19 1 -dishpan/1 1 -dishrag/1 1 -dishtowel/1 1 -dishware/2 1 -dishwasher/1 1 -dishwater/2 1 -dishy 1 -disillusion/23 1 -disillusionment/2 1 -disincentive/10 1 -disinclination/2 1 -disincline/6 1 -disinfect/11 1 -disinfectant/1 1 -disinfection/2 1 -disinflation/2 1 -disinformation/2 1 -disingenuous/8 1 -disinherit/11 1 -disinheritance/2 1 -disintegrate/6 1 -disintegration/2 1 -disinter/13 1 -disinterest/62 1 -disinterested/16 1 -disinterment/2 1 -disinvestment/2 1 -disinvest 1 -disjoint/11 1 -disjointed/16 1 -disjointness -disjoint 1 -disjunction/10 1 -disjunctive 1 -disjuncture 1 -disk/18 1 -diskette/1 1 -dislike/28 1 -dislocate/6 1 -dislocation/1 1 -dislodge/6 1 -disloyal/8 1 -disloyalty/2 1 -dismal/75 1 -dismantle/6 1 -dismantlement/2 1 -dismay/23 1 -dismayed 1 -dismember/11 1 -dismemberment/2 1 -dismiss/7 1 -dismissal/1 1 -dismissible -dismissive -dismissively -dismount/23 1 -Disney -Disneyland 1 -disobedience/2 1 -disobedient/8 1 -disobey/11 1 -disoblige/6 1 -disobliging 1 -disorder/23 1 -disordered 1 -disorderly/140 1 -disorganization/2 1 -disorganize/6 1 -disorient/11 1 -disorientate/6 1 -disorientation/2 1 -disown/11 1 -disparage/6 1 -disparagement/2 1 -disparaging/8 1 -disparate/8 1 -disparity/15 1 -dispassion/2 1 -dispassionate/8 1 -dispatch/22 1 -dispatcher/1 1 -dispel/61 1 -dispelling 1 -dispensable 1 -dispensary/15 1 -dispensation/1 1 -dispense/6 1 -dispenser/1 1 -dispersal/2 1 -dispersant 1 -disperse/253 1 -dispersed 1 -disperser/10 1 -dispersion/1 1 -dispersive/8 1 -dispirit/11 1 -dispirited/8 1 -displace/6 1 -displacement/1 1 -displacer 1 -display/23 1 -displayable -displease/6 1 -displeasing 1 -displeasure/2 1 -disport/5 1 -disposable/1 1 -disposal/1 1 -dispose/43 1 -disposed 1 -disposer/1 1 -disposing 1 -disposition/1 1 -dispossess/7 1 -dispossession/2 1 -dispraise/28 1 -disproof/1 1 -disproportion/18 1 -disproportional/8 1 -disproportionate/8 1 -disprovable -disprove/6 1 -disputable/19 1 -disputant/1 1 -disputation/1 1 -disputatious/8 1 -dispute/28 1 -disputer/1 1 -disqualification/1 1 -disqualify/31 1 -disquiet/23 1 -disquieted 1 -disquieting 1 -disquiet 1 -disquietude/2 1 -disquisition/1 1 -Disraeli -disregard/23 1 -disregardful 1 -disrepair/2 1 -disreputable/19 1 -disrepute/2 1 -disrespect/23 1 -disrespectful/8 1 -disrobe/6 1 -disrupt/11 1 -disruption/1 1 -disruptive/8 1 -disruptor 1 -diss/7 1 -dissatisfaction/2 1 -dissatisfied 1 -dissatisfy/31 1 -dissect/11 1 -dissecting 1 -dissection/1 1 -dissector/1 1 -dissemblance/2 1 -dissemble/6 1 -dissembler/1 1 -dissembling 1 -disseminate/6 1 -dissemination/2 1 -dissension/1 1 -dissent/23 1 -dissenter/1 1 -dissenting 1 -dissertation/1 1 -disservice/1 1 -dissever/11 1 -dissidence/2 1 -dissident/1 1 -dissimilarity/15 1 -dissimilar 1 -dissimilitude/1 1 -dissimulate/6 1 -dissimulation/2 1 -dissimulator/1 1 -dissipate/6 1 -dissipated 1 -dissipation/2 1 -dissipative -dissociate/6 1 -dissociation/2 1 -dissociative -dissociatively -dissoluble 1 -dissolute/16 1 -dissolution/2 1 -dissolve/43 1 -dissolving 1 -dissonance/1 1 -dissonant 1 -dissuade/6 1 -dissuasion/2 1 -dissuasive 1 -dist -distaff/1 1 -distal/8 1 -distance/28 1 -distant/8 1 -distaste/18 1 -distasteful/16 1 -distemper/62 1 -distend/11 1 -distended 1 -distension/1 1 -distention/1 1 -distil/61 1 -distill/11 1 -distillate/1 1 -distillation/1 1 -distiller/1 1 -distillery/15 1 -distilling 1 -distinct/21 1 -distinction/1 1 -distinctive/16 1 -distinguish/7 1 -distinguishable/19 1 -distinguished 1 -distinguishing 1 -distort/11 1 -distorted 1 -distorter 1 -distortion/1 1 -distract/11 1 -distracted/83 1 -distractingly -distraction/1 1 -distrait 1 -distraught 1 -distress/22 1 -distressed 1 -distressful 1 -distressing/8 1 -distributable -distribute/6 1 -distribution/1 1 -distributional -distributive/8 1 -distributivity 1 -distributor/1 1 -distributorship/10 1 -district/18 1 -distrust/23 1 -distrustful/8 1 -disturb/11 1 -disturbance/1 1 -disturber/1 1 -disturbing/8 1 -disulphide 1 -disunion/2 1 -disunite/6 1 -disunity/2 1 -disuse/28 1 -disyllabic -disyllable 1 -ditch/22 1 -dither/23 1 -ditherer/1 1 -ditransitive 1 -ditsy/34 1 -ditto/23 1 -ditz/4 1 -ditzy/34 1 -ditty/167 1 -diuresis 1 -diuretic/1 1 -diurnal/8 1 -diva/1 1 -divalent 1 -divan/1 1 -dive/254 435 -diver/1 1 -diverge/6 1 -divergence/1 1 -divergent 1 -diverse/16 1 -diversification/2 1 -diversify/31 1 -diversion/1 1 -diversionary -diversity/15 1 -divert/11 1 -diverted 1 -diverticulitis/2 1 -diverting 1 -divest/11 1 -divestiture/1 1 -divestment/2 1 -dividable 1 -divide/28 1 -divided 1 -dividend/1 1 -divider/1 1 -dividing 1 -divination/2 1 -divine/255 1 -Divine/2 1 -divine/6 1 -diviner/1 1 -diving/2 1 -divinity/15 1 -divisibility/2 1 -divisible 1 -division/1 1 -divisional 1 -divisive/16 1 -divisor/1 1 -divorce/28 1 -divorcee/1 1 -divorcement/1 1 -divot/1 1 -div 1 -divulge/6 1 -divvy/56 1 -Diwali/3 -Dix -Dixie/2 1 -Dixiecrat 1 -Dixieland/1 1 -dixieland/2 1 -Dixon/3 -dizzy/143 1 -Djakarta/2 1 -djellaba/1 1 -djellabah/1 1 -Djibouti/2 1 -djinn's -DJ 1 -DMD/2 1 -Dmitri/3 -DMZ -DNA/2 1 -Dnepr -Dnepropetrovsk -Dnieper -Dniester -do/256 436 -DOA -doable 1 -dob -DOB -dobbed -Dobbin/3 -dobbin/1 1 -dobbing -doberman/3 -Doberman/2 1 -dobermans -Dobro 1 -dobs -doc/64 1 -docent/1 1 -docile/8 1 -docility/2 1 -dock/23 1 -docker/10 1 -docket/23 1 -docking 1 -dockland/10 1 -dockside 1 -dockworker/1 1 -dockyard/1 1 -doctor/23 1 -doctoral 1 -doctorate/1 1 -Doctorow/3 -Doctor 1 -doctrinaire/1 1 -doctrinal/8 1 -doctrine/1 1 -docudrama/1 1 -document/23 1 -documentary/15 1 -documentation/1 1 -DOD -dodder/23 1 -doddery 1 -doddle 1 -dodecahedral -dodecahedra 437 -dodecahedron 438 -Dodge/3 -dodge/28 1 -dodgem/10 1 -dodger/1 1 -Dodgson/2 1 -dodgy/34 1 -dodo/1 1 -Dodoma/3 -Dodson/3 -Doe -DOE -doe/48 1 -doer/1 1 -doeskin/1 1 -doesn't -doff/11 1 -dog/92 1 -dogcart/1 1 -dogcatcher/1 1 -doge/1 1 -dogear/11 1 -dogear's -dogfight/18 1 -dogfish/4 1 -dogged/16 1 -doggerel/2 1 -doggie/41 1 -dogging 1 -doggone/257 1 -doggoned/166 1 -doghouse/1 1 -dogie/1 1 -dogleg/92 1 -dogma/1 1 -dogmatically -dogmatic 1 -dogmatism/2 1 -dogmatist/1 1 -dogsbody/60 1 -dogsled/70 1 -dogtrot/109 1 -dogwood/1 1 -dogy/15 1 -doggy/42 1 -doh/2 1 -Doha/2 1 -doilies -doily/3 -doing/1 1 -Dolby 1 -doldrums/2 1 -Dole/3 -dole/28 1 -doleful/85 1 -dolerite 1 -doling 1 -doll/23 1 -dollar/1 1 -dollhouse/1 1 -Dollie/3 -dolling 1 -dollop/23 1 -dolmen/1 1 -dolmen's 439 -dolmen 440 -dolomite/2 1 -dolor/2 1 -Dolores/3 -dolorous/8 1 -dolphin/1 1 -dolt/1 1 -doltish/16 1 -Dolly/3 -dolly/258 1 -dolly's -domain/1 1 -dome/28 1 -Domesday/3 -domestic/51 1 -domesticate/6 1 -domestication/2 1 -domesticity/2 1 -domicile/28 1 -domiciliary -dominance/2 1 -dominant/30 1 -dominate/6 1 -dominating 1 -domination/2 1 -dominatrix/184 1 -domineer/11 1 -domineering/8 1 -Domingo/3 -Dominguez/3 -Dominic -Dominica/2 1 -Dominican/1 1 -Dominick/2 1 -dominion/1 1 -Dominion 1 -Dominique/2 1 -domino/4 1 -Domitian -don/1 1 -Don/1 1 -don/192 1 -Dona -dona/1 1 -Donahue/3 -Donald/3 -Donaldson/3 -donate/6 1 -Donatello -donation/1 1 -Donetsk/2 1 -dong/23 1 -dongle/1 1 -Donizetti/3 -donkey/1 1 -Donn/3 -Donna 1 -Donne/2 1 -Donnell/3 -Donner/3 -Donnie/3 -donnish 1 -donor/1 1 -Donovan/3 -don't -donuts/89 1 -Donny/3 -donnybrook/1 1 -doodad/1 1 -doodah/10 1 -doodle/28 1 -doodlebug/1 1 -doodler/1 1 -doohickey/1 1 -doolally -Dooley/3 -Doolittle -doom/23 1 -doomsayer/1 1 -doomsday/2 1 -doomster/10 1 -Doonesbury/3 -door/18 1 -doorbell/1 1 -doorhandles -doorjamb/10 1 -doorkeeper/1 1 -doorknob/1 1 -doorknocker/10 1 -doorman/2 441 -doormat/1 1 -doormen 442 -doornail 1 -doorplate/1 1 -doorpost/10 1 -doorstep/47 1 -doorstop/1 1 -doorway/1 1 -dooryard/1 1 -dopa/2 1 -dopamine 1 -dope/28 1 -doper/1 1 -dopey 443 -dopier 444 -dopiest 444 -dopiness/3 -doping/2 1 -doppelganger/10 1 -Doppler -dopy/34 1 -Dora/2 1 -Dorcas -Doreen/3 -Dorian/2 1 -Doric/2 1 -Doris/2 1 -Doritos/3 -dork/1 1 -dorky/34 1 -dorm/1 1 -dormancy/2 1 -dormant 1 -dormer/1 1 -dormice 445 -dormitory/15 1 -dormouse/2 446 -Dorothea/3 -Dorothy/3 -dorsal/8 1 -Dorset 1 -Dorsey/3 -Dorthy/3 -Dortmund -dory/15 1 -dos/240 1 -DOS/2 1 -dosage/1 1 -dose/28 1 -dosh -dosimeter/1 1 -doss/241 1 -dosser/10 1 -dosshouse/10 1 -dossier/1 1 -Dostoevsky/2 1 -Dostoyevsky/2 1 -DOT -Dot/3 -dot/109 1 -dotage/2 1 -dotard/1 1 -dote/6 1 -doter/1 1 -doting/8 1 -Dotson/3 -dotty/259 1 -Douala/2 1 -Douay/3 -double/260 1 -Doubleday/3 -doubleheader/1 1 -doubler 1 -doublespeak/2 1 -doublet/1 1 -doubletalk -doublethink 1 -doubling 1 -doubloon/1 1 -doubt/23 1 -doubter/1 1 -doubtful/16 1 -doubting/8 1 -doubtlessly 1 -doubtless 1 -douche/28 1 -Doug/3 -dough/1 1 -doughnut/18 1 -doughty/34 1 -doughy/34 1 -Douglas -Douglass -dour/21 1 -Douro -douse/43 1 -dove/1 1 -dovecot/10 1 -dovecote/1 1 -Dover/2 1 -dove 447 -dovetail/23 1 -dovish 1 -Dow -dowager/1 1 -dowdy/97 1 -dowel/23 1 -dower/23 1 -down/78 1 -downbeat/1 1 -downcast 1 -downdraft/1 1 -downer/1 1 -downfall/1 1 -downfallen -downgrade/28 1 -downhearted/16 1 -downhill/1 1 -downland/10 1 -download/11 1 -download's -downmarket -downpipes -downplay/11 1 -downpour/1 1 -downrange 1 -downright 1 -downriver -Downs -downscale 1 -downshift/11 1 -downside/1 1 -downsize/6 1 -downsizing/2 1 -downspout/1 1 -downstage 1 -downstairs -downstairs's -downstate/2 1 -downstream 1 -downswing/1 1 -downtime/2 1 -downtown/2 1 -downtrend/1 1 -downtrodden 1 -downturn/1 1 -downward/191 1 -downwind 1 -Downy/3 -downy/34 1 -dowry/15 1 -dowse/43 1 -dowser/1 1 -doxology/15 1 -doyen/1 1 -doyenne/1 1 -Doyle -doz -doze/28 1 -dozen/18 1 -dozenth 1 -dozen 1 -dozing 1 -dozy/193 1 -DP/1 1 -dpt -DPT -Dr -drab/261 1 -drabber 1 -drachma/1 1 -Draco/2 1 -draconian -Draconian -Dracula/2 1 -draft/23 1 -draftboard -draftee/1 1 -drafter/1 1 -drafting/2 1 -draftsman/2 448 -draftsmanship/2 1 -draftsmen 449 -draftswoman/2 450 -draftswomen 451 -drafty/50 1 -drag/92 1 -dragging 1 -dragnet/1 1 -dragon/1 1 -dragonflies -dragonfly/3 -dragoon/23 1 -dragster/10 1 -draggy/34 1 -drain/23 1 -drainage/2 1 -drainboard/1 1 -drainer/1 1 -drainpipe/1 1 -Drake -drake/1 1 -dram/18 1 -drama/1 1 -Dramamine/1 1 -dramatic/35 1 -dramatist/1 1 -dramatization/1 1 -dramatize/6 1 -Drambuie -drank 452 -Drano/3 -drape/28 1 -draper/1 1 -drapery/15 1 -drastic/39 1 -drat/262 1 -draughtboards -draughtswoman -draughtswomen -Dravidian/2 1 -draw/144 453 -drawable -drawback/1 1 -drawbridge/1 1 -drawcord -drawer/1 1 -drawing/1 1 -drawl/23 1 -drawling 1 -drawstring/1 1 -dray/18 1 -dread/23 1 -dreadful/16 1 -dreadlocks -dreadlocks's -dreadnaught/1 1 -dreadnought/1 1 -dread 1 -dream/23 1 -dreamboat/1 1 -dreamer/1 1 -dreaming 1 -dreamland/2 1 -dreamless 1 -dreamlike 1 -dreamworld/1 1 -dreamy/50 1 -drear 1 -dreary/50 1 -dredge/28 1 -dredger/1 1 -dredging 1 -dregs -dregs's -Dreiser -drench/156 1 -Dresden/2 1 -dress/147 1 -dressage/2 1 -dresser/1 1 -dressing/1 1 -dressmaker/1 1 -dressmaking/2 1 -dressy/49 1 -Drew/3 -drew 454 -Dreyfus/2 1 -dribble/28 1 -dribbler/1 1 -driblet/1 1 -drier/1 455 -driest 456 -drift/23 1 -drifter/1 1 -drifting 1 -driftnet -driftnets -driftwood/2 1 -drill/23 1 -driller/1 1 -drilling 1 -drillmaster/1 1 -drink/86 457 -drinkable 1 -drinker/1 1 -drinking/10 1 -drip/47 1 -dripping/1 1 -drippy/34 1 -Dristan/3 -drivable -drive/263 458 -drivel/23 1 -driveler/1 1 -driveling 1 -driver/1 1 -driveway/1 1 -driving/10 1 -drizzle/28 1 -drizzly/34 1 -drogue/1 1 -droid/10 1 -droll/178 1 -drollery/15 1 -droll 1 -drolly 1 -dromedary/15 1 -drone/28 1 -droning 1 -drool/23 1 -droop/23 1 -drooping/8 1 -droopy/49 1 -drop/47 1 -dropkick/1 1 -droplet/1 1 -dropout/1 1 -dropper/1 1 -dropping/32 1 -dropsical 1 -dropsy/2 1 -dross/2 1 -drought/1 1 -drouth/1 1 -drove/73 1 -drover/1 1 -drove 459 -drown/11 1 -drowning/1 1 -drowse/28 1 -drowsy/50 1 -drub/264 1 -drubber/1 1 -drubbing/1 1 -Drudge/3 -drudge/28 1 -drudgery/2 1 -drudging 1 -drug/92 1 -druggie/1 1 -druggist/1 1 -drugstore/1 1 -druggy/15 1 -druid/1 1 -druidism/2 1 -Druid 1 -drum/160 1 -drumbeat/18 1 -drumlin/1 1 -drummer/1 1 -drumstick/1 1 -drunk/188 1 -drunkard/1 1 -drunken/16 1 -drunk 452 -drupe/1 1 -druthers/2 1 -dry/265 1 -dryad/1 1 -Dryden -dryer/1 1 -drying 1 -dryish -drystone -drywall/2 1 -Dschubba/3 -DST -DTP -Du -dual/191 1 -dualism/2 1 -dualistic 1 -dualist 1 -duality/15 1 -Duane/3 -dub/136 1 -Dubai -dubber/1 1 -dubbin/2 1 -dubbing 1 -Dubcek/3 -Dubhe/3 -dubiety/2 1 -dubious/16 1 -Dublin/2 1 -Dubrovnik/2 1 -ducal 1 -ducat/1 1 -Duchamp -duchess/4 1 -duchy/15 1 -duck/23 1 -duckbill/1 1 -duckboards -ducking/10 1 -duckling/1 1 -duckpins -duckpins's -duckpond -duckweed/2 1 -ducky/42 1 -duct/23 1 -ductile 1 -ductility/2 1 -ducting 1 -ductless 1 -dud/18 1 -dude/28 1 -dudgeon/2 1 -Dudley -dud 1 -due/1 1 -duel/23 1 -dueler/1 1 -duelings -dueling 1 -duelist/1 1 -duenna/1 1 -duet/18 1 -due 1 -duff/23 1 -duffel 1 -duffer/1 1 -Duffy/3 -dugout/1 1 -dug 460 -duh -DUI -Duisburg -Duke/3 -duke/18 1 -dukedom/1 1 -dulcet 1 -dulcimer/1 1 -dull/266 1 -dullard/1 1 -Dulles -dulness/3 -Duluth -dully 1 -duly 1 -Dumas -dumb/21 1 -dumbbell/1 1 -dumbfound/11 1 -Dumbledore/3 -Dumbo/3 -dumbo/10 1 -dumbstruck 1 -dumb 1 -dumbwaiter/1 1 -dumdum/1 1 -dumfound/11 1 -dummy/167 1 -dump/23 1 -dumper/10 1 -dumping 1 -dumpling/1 1 -dumplings 1 -dumpster/1 1 -Dumpster 1 -dumpy/49 1 -dun/267 1 -Dunant -Dunbar -Duncan -dunce/1 1 -Dundee -dunderhead/1 1 -dune/1 1 -Dunedin -dung/23 1 -dungaree/1 1 -dungeon/18 1 -dunghill/1 1 -dunk/23 1 -Dunkirk/2 1 -Dunlap/3 -Dunn/3 -Dunne/3 -dunno -duo/1 1 -duodecimal 1 -duodenal -duodena 461 -duodenum/2 462 -duologue 1 -duopolies -duopoly -dupe/28 1 -duper/1 1 -duple 1 -duplex/40 1 -duplicability 1 -duplicate/28 1 -duplication/1 1 -duplicator/1 1 -duplicitous -duplicity/15 1 -DuPont -durability/2 1 -durable/268 1 -Duracell/3 -Duran/3 -durance/2 1 -Durant -Durante/3 -duration/1 1 -Durban -Durer -duress/2 1 -Durex/3 -Durham/1 1 -during -Durkheim -Durocher/3 -Duroc 1 -durst 463 -durum/2 1 -Duse/3 -Dushanbe/2 1 -dusk/2 1 -dusky/49 1 -Dusseldorf/2 1 -dust/23 1 -dustbin/1 1 -Dustbuster/3 -dustcart/10 1 -dustcover 1 -duster/1 1 -Dustin/3 -dusting 1 -dustless 1 -dustman 464 -dustmen 465 -dustpan/1 1 -dustsheet/10 1 -Dusty/3 -dusty/50 1 -Dutch/2 1 -Dutchman/2 466 -Dutchmen 467 -dutch 1 -Dutch 1 -dutch 1 -Dutchwoman 1 -duteous/8 1 -dutiable 1 -dutiful/16 1 -duty/15 1 -Duvalier -duvet/1 1 -DVD 1 -Dvina -Dvorak -dwarf/179 1 -dwarfish 1 -dwarfism/2 1 -Dwayne/3 -dweeb/1 1 -dwell/269 1 -dweller/1 1 -dwelling/1 1 -DWI -Dwight/3 -dwindle/6 1 -Dy/2 1 -dyadic 1 -dyad 1 -dybbuk/186 1 -dye/270 1 -dyeing 1 -Dyer/3 -dyer/1 1 -dyestuff/1 1 -dying/2 468 -dyke/18 1 -Dylan/2 1 -dynamic/130 1 -dynamical/8 1 -dynamic 1 -dynamism/2 1 -dynamite/139 1 -dynamiter/1 1 -dynamo/1 1 -dynastic 1 -dynasty/15 1 -dyne 1 -dysentery/2 1 -dysfunction/1 1 -dysfunctional -dyslectic/1 1 -dyslexia/2 1 -dyslexic/1 1 -dyslexically -dyslexic 1 -Dyson/3 -dyspepsia/2 1 -dyspeptic/1 1 -dysprosium/2 1 -dystrophy 1 -dz -Dzerzhinsky/3 -Dzungaria -E/1 1 -e/10 1 -each 1 -eager/21 1 -eagle/18 1 -eaglet/1 1 -Eakins -ear/62 1 -earache/1 1 -eardrum/1 1 -earful/1 1 -Earhart -Earl/3 -earl/1 1 -earldom/1 1 -Earle/3 -Earlene/3 -Earline/3 -earlobe/1 1 -early/49 1 -earmark/23 1 -earmuff/1 1 -earn/271 1 -earner/1 1 -Earnest/3 -earnest/36 1 -Earnestine/3 -Earnhardt/3 -earning/32 1 -Earp/3 -earphone/1 1 -earpiece/10 1 -earplug/1 1 -earring/1 1 -earshot/2 1 -earsplitting -earth/1 1 -Earth/2 1 -earth/11 1 -earthbound 1 -earthen 1 -earthenware/2 1 -earthling/1 1 -earthly/34 1 -earthquake/18 1 -earthshaking -earthward/10 1 -earthwork/1 1 -earthworm/1 1 -earthy/49 1 -earwax/2 1 -earwig/18 1 -ease/28 1 -easel/1 1 -easement/1 1 -East/1 1 -east/2 1 -eastbound 1 -ea 469 -Easter/1 1 -easterlies -easterly's -easterly 1 -Eastern -eastern/44 1 -easterner/1 1 -Easterner 1 -easternmost -easting 1 -Eastman -east 1 -eastward/10 1 -Eastwood/3 -easy/50 1 -easygoing 1 -easy 1 -eat/116 470 -eatable/1 1 -eater/1 1 -eatery/15 1 -eating 1 -Eaton/3 -eave/1 1 -eavesdrop/105 1 -eavesdropper/1 1 -eBay/3 -ebb/23 1 -Eben/3 -Ebeneezer/3 -Ebert -Ebola 1 -Ebonics/2 1 -Ebony/3 -ebony/15 1 -Ebro/2 1 -ebullience/2 1 -ebullient/8 1 -ebullition/2 1 -EC -eccentric/1 1 -eccentrically -eccentricity/15 1 -eccl -Ecclesiastes -ecclesiastic/1 1 -ecclesiastical/8 1 -ECG/2 1 -echelon/18 1 -echinoderm/1 1 -echo/272 1 -echoic 1 -echolocation/2 1 -eclair/1 1 -eclat/2 1 -eclectic/51 1 -eclecticism/2 1 -eclipse/28 1 -eclipses 471 -ecliptic/2 1 -eclogue/1 1 -Eco/3 -ecocide/2 1 -ecol -ecologic -ecological/8 1 -ecologist/1 1 -ecology/2 1 -econ -econometric/10 1 -economic/32 1 -economical/8 1 -economist/1 1 -economization -economize/6 1 -economizer/1 1 -economy/15 1 -ecosystem/1 1 -ecru/2 1 -ectopic -ectoplasm 1 -ecu/10 1 -Ecuador/2 1 -Ecuadoran/1 1 -Ecuadorean 1 -Ecuadorian/1 1 -ecumenical/8 1 -ecumenicism/2 1 -ecumenism/2 1 -eczema/2 1 -ecstasy/15 1 -Ecstasy 1 -ecstatic/39 1 -ed/3 -Ed/3 -Edam/1 1 -Edda -Eddie/3 -Eddington/2 1 -eddy/15 1 -Eddy/2 1 -eddy/31 1 -edelweiss/2 1 -edema/1 1 -Eden/1 1 -Edgardo/3 -Edgar 1 -edge/139 1 -edgeless 1 -edger/1 1 -edgeways -edgewise -edging/1 1 -edgy/50 1 -edibility/2 1 -edible/20 1 -edict/1 1 -edification/2 1 -edifice/1 1 -edifier/1 1 -edify/31 1 -edifying 1 -Edinburgh/2 1 -Edison/2 1 -edit/23 1 -editable -Edith/3 -edition/1 1 -editor/1 1 -editorial/30 1 -editorialize/6 1 -editorship/1 1 -Edmond/3 -Edmonton/2 1 -Edmund/3 -Edna/3 -EDP/2 1 -eds -Edsel 1 -EDT -Eduardo/3 -educ -educability/2 1 -educable 1 -educate/6 1 -education/1 1 -educational/8 1 -educationalist/10 1 -educationist/10 1 -educative -educator/1 1 -educe/6 1 -eduction 1 -edutainment/2 1 -Edward/1 1 -Edwardian/2 1 -Edwardo/3 -Edwin -Edwina/3 -EEC/2 1 -EEG/2 1 -eek 1 -eel/1 1 -e'en -EEO -EEOC -e'er -eerie/150 1 -eery/50 1 -Eeyore/3 -eff/11 1 -efface/6 1 -effacement/2 1 -effect/23 1 -effective/16 1 -effector/10 1 -effectual/8 1 -effectuate/6 1 -effeminacy/2 1 -effeminate/8 1 -effendi/1 1 -efferent 1 -effervesce/6 1 -effervescence/2 1 -effervescent/8 1 -effervescing 1 -effete/16 1 -efficacious/8 1 -efficacy/2 1 -efficiency/15 1 -efficient/8 1 -Effie/3 -effigy/15 1 -efflorescence/2 1 -efflorescent -effluence/2 1 -effluent/1 1 -effluvia 472 -effluvium/2 473 -effort/1 1 -effortless/16 1 -effrontery/2 1 -effulgence/2 1 -effulgent 1 -effuse/6 1 -effusion/1 1 -effusive/16 1 -EFL -Efrain/3 -Efren/3 -EFT -egad 1 -egalitarian/1 1 -egalitarianism/2 1 -egg/23 1 -eggbeater/1 1 -eggcup/1 1 -egghead/1 1 -eggnog/2 1 -Eggo/3 -eggplant/1 1 -eggshell/1 1 -egis/2 1 -eglantine/1 1 -ego/1 1 -egocentric/1 1 -egocentrically -egocentricity/2 1 -egoism/2 1 -egoist/1 1 -egoistic -egoistical/8 1 -egomania/2 1 -egomaniac/1 1 -egotism/2 1 -egotist/1 1 -egotistic -egotistical/8 1 -egregious/16 1 -egress/40 1 -egret/1 1 -Egypt/2 1 -Egyptian/1 1 -Egyptology/2 1 -eh -Ehrenberg/3 -Ehrlich -Eichmann -eider/1 1 -eiderdown/1 1 -eidetic 1 -Eiffel -eigenfunction -eigenfunctions -eigenstate -eigenstates -eigenvalue/10 1 -eight/1 1 -eighteen/1 1 -eighteenth/1 1 -eighteen 1 -eightfold 1 -eighth/1 1 -eightieth/1 1 -eightpence 1 -eight 1 -eighty/15 1 -Eileen/3 -Einstein/1 1 -einsteinium/2 1 -Eire/2 1 -Eisenhower/2 1 -Eisenstein -Eisner/3 -eisteddfod/10 1 -either 1 -ejaculate/43 1 -ejaculation/1 1 -ejaculatory -eject/11 1 -ejecta -ejection/1 1 -ejector/1 1 -eke/6 1 -EKG/2 1 -elaborate/67 1 -elaboration/1 1 -Elaine -Elam -elan/2 1 -eland/1 1 -Elanor/3 -elapse/6 1 -elastic/51 1 -elasticated -elasticity/15 1 -elasticize/6 1 -elastodynamics -Elastoplast/2 1 -elate/6 1 -elated/8 1 -elation/2 1 -Elba 1 -Elbe/2 1 -Elbert -elbow/23 1 -elbowroom/2 1 -Elbrus -elder/30 1 -elderberry/15 1 -elderflower 1 -elderly 1 -elder 474 -eldest 474 -Eldon/3 -Eldorado 1 -Eleanor/3 -Eleazar/3 -elect/273 1 -electability 1 -electable -election/1 1 -electioneer/11 1 -electioneering 1 -elective/1 1 -elector/1 1 -electoral/8 1 -electorate/1 1 -Electra/2 1 -electric/10 1 -electrical/8 1 -electrician/1 1 -electricity/2 1 -electrification/2 1 -electrifier/1 1 -electrify/31 1 -electrocardiogram/1 1 -electrocardiograph/1 1 -electrocardiography/2 1 -electrochemical/8 1 -electrocute/6 1 -electrocution/1 1 -electrode/1 1 -electrodynamic/10 1 -electroencephalogram/1 1 -electroencephalograph/1 1 -electroencephalographic -electroencephalography/2 1 -electrologist/1 1 -electroluminescent -electrolysis/2 1 -electrolyte/1 1 -electrolytic/39 1 -electrolyze/251 1 -electromagnet/1 1 -electromagnetically -electromagnetic 1 -electromagnetism/2 1 -electromechanical -electromechanics -electromotive -electron/1 1 -electronegative -electronic/35 1 -electrophoresis 1 -electroplate/43 1 -electroplating 1 -electroscope/1 1 -electroscopic -electroshock/2 1 -electrostatic/32 1 -electrotype/18 1 -eleemosynary -elegance/2 1 -elegant/8 1 -elegiac/1 1 -elegiacal -elegy/15 1 -elem -element/1 1 -elemental/8 1 -elementary/211 1 -Elena/3 -elephant/1 1 -elephantiasis/2 1 -elephantine -elev -elevate/6 1 -elevated 1 -elevation/1 1 -elevator/1 1 -eleven/1 1 -elevens/89 1 -eleventh/1 1 -elf/120 1 -ELF/2 1 -elfin 1 -elfish 1 -Elgar -Eli -Elias -elicit/11 1 -elicitation/2 1 -elide/6 1 -eligibility/2 1 -eligible/19 1 -Elijah/2 1 -eliminate/6 1 -elimination/1 1 -eliminator/10 1 -Elinor/3 -Eliot -Elisa/3 -Elisabeth -Elise/3 -Eliseo/3 -Elisha -elision/1 1 -elite/1 1 -elitism/2 1 -elitist/1 1 -elixir/1 1 -Eliza/3 -Elizabeth/2 1 -Elizabethan/1 1 -elk/1 1 -ell/1 1 -Ella/2 1 -Ellen/3 -Ellesmere/3 -Ellie/3 -Ellington -Elliot/3 -Elliott/3 -ellipse/1 1 -ellipses 475 -ellipsis/2 476 -ellipsoid/1 1 -ellipsoidal -elliptic -elliptical/8 1 -Ellis -Ellison/3 -elm/1 1 -Elma/3 -Elmer/3 -Elmo/3 -Elnath/3 -Elnora/3 -elocution/2 1 -elocutionary -elocutionist/1 1 -elodea/1 1 -Elohim -Eloise/3 -elongate/6 1 -elongation/1 1 -elope/6 1 -elopement/1 1 -eloquence/2 1 -eloquent/8 1 -Eloy/3 -Elroy/3 -Elsa/3 -else 1 -elsewhere -Elsie/3 -Elsinore -Eltanin/3 -Elton/3 -elucidate/6 1 -elucidation/1 1 -elude/6 1 -Elul/2 1 -elusive/16 1 -eluted -Elva/3 -elven -elver/1 1 -Elvia/3 -Elvin/3 -Elvira/3 -Elvis/3 -elvish/89 1 -Elway/3 -Elwood/3 -Elysee/3 -Elysian -Elysium/1 1 -EM -em/1 1 -emaciate/6 1 -emaciation/2 1 -Emacs/3 -email/23 1 -emanate/6 1 -emanation/1 1 -emancipate/6 1 -emancipation/2 1 -emancipator/1 1 -emancipatory -Emanuel/3 -emasculate/6 1 -emasculation/2 1 -embalm/11 1 -embalmer/1 1 -embalming 1 -embank/11 1 -embankment/1 1 -embargo/22 1 -embark/11 1 -embarkation/1 1 -embarrass/7 1 -embarrassed 1 -embarrassing/8 1 -embarrassment/1 1 -embassy/15 1 -embattled -embed/274 1 -embeddable -embedding/10 1 -embellish/7 1 -embellishment/1 1 -ember/1 1 -embezzle/6 1 -embezzlement/2 1 -embezzler/1 1 -embitter/11 1 -embitterment/2 1 -emblazon/11 1 -emblazonment/2 1 -emblem/18 1 -emblematic -emblematically -embodiment/1 1 -embody/31 1 -embolden/11 1 -embolism/1 1 -embosom 1 -emboss/7 1 -embosser/1 1 -embouchure/2 1 -embower/11 1 -embrace/28 1 -embraceable -embrasure/1 1 -embrocation/1 1 -embroider/11 1 -embroiderer/1 1 -embroidery/15 1 -embroil/11 1 -embroilment/2 1 -embryo/1 1 -embryological 1 -embryologist/1 1 -embryology/2 1 -embryonic 1 -embryo 1 -emcee/63 1 -emend/11 1 -emendation/1 1 -emerald/1 1 -emerge/6 1 -emergence/2 1 -emergency/15 1 -emergent 1 -emerita 1 -emeritus 1 -Emerson -Emery/3 -emery/2 1 -emetic/1 1 -emf/10 1 -emigrant/1 1 -emigrate/6 1 -emigration/1 1 -emigre/1 1 -Emil/3 -Emile/2 1 -Emilia/2 1 -Emilio/3 -Emily/3 -Eminem/3 -eminence/1 1 -Eminence 1 -eminent/8 1 -emir/1 1 -emirate/1 1 -emissary/15 1 -emission/1 1 -emissivity/60 1 -emit/12 1 -emitter/1 1 -Emma/3 -Emmanuel -Emmett/3 -Emmy 1 -emollient/1 1 -emolument/1 1 -Emory/3 -emote/6 1 -emoticon/1 1 -emotion/1 1 -emotional/8 1 -emotionalism/2 1 -emotionality 1 -emotionalize/6 1 -emotionless 1 -emotive/8 1 -empanel/11 1 -empathetical -empathetic 1 -empathic 1 -empathize/6 1 -empathy/2 1 -emperor/1 1 -emphases 477 -emphasis/2 478 -emphasize/6 1 -emphatic/39 1 -emphysema/2 1 -empire/1 1 -empirical/8 1 -empiricism/2 1 -empiricist/1 1 -empiric 1 -emplacement/1 1 -employ/23 1 -employable 1 -employe/28 1 -employee/1 1 -employer/1 1 -employment/1 1 -emporium/1 1 -empower/11 1 -empowerment/2 1 -empress/4 1 -emptier 1 -empty/275 1 -emptying 1 -empyrean/2 1 -EMT -emu/1 1 -emulate/6 1 -emulation/1 1 -emulative 1 -emulator/1 1 -emulsification/2 1 -emulsifier/1 1 -emulsify/31 1 -emulsion/1 1 -en/1 1 -enable/6 1 -enabler/1 1 -enact/11 1 -enactment/1 1 -enamel/23 1 -enameler/1 1 -enamelings -enamelware/2 1 -enamor/11 1 -enamored 1 -enc -encamp/11 1 -encampment/1 1 -encapsulate/6 1 -encapsulation/1 1 -Encarta/3 -encase/6 1 -encasement/2 1 -encephalitic -encephalitis/2 1 -encephalopathy 1 -enchain/11 1 -enchant/11 1 -enchanter/1 1 -enchanting/8 1 -enchantment/1 1 -enchantress/4 1 -enchilada/1 1 -encipher/11 1 -encircle/6 1 -encirclement/1 1 -encircling 1 -encl -enclave/18 1 -enclose/6 1 -enclosure/1 1 -encode/6 1 -encoder/1 1 -encomium/1 1 -encompass/7 1 -encore/28 1 -encounter/23 1 -encourage/6 1 -encouragement/1 1 -encourager 1 -encouraging/8 1 -encroach/7 1 -encroachment/1 1 -encrust/11 1 -encrustation/1 1 -encrypt/11 1 -encryption 1 -encumber/11 1 -encumbrance/1 1 -ency -encyclical/1 1 -encyclopaedic 1 -encyclopedia/1 1 -encyclopedic 1 -encyst/11 1 -encystment/2 1 -end/23 1 -endanger/11 1 -endangerment/2 1 -endear/11 1 -endearing/8 1 -endearment/1 1 -endeavor/23 1 -endemic/51 1 -endgame/10 1 -ending/1 1 -endive/1 1 -endless/16 1 -endmost 1 -endocrine/1 1 -endocrinologist/1 1 -endocrinology/2 1 -endogenous -endogenously -endomorphism/10 1 -endoplasmic -endorphin/1 1 -endorse/6 1 -endorsement/1 1 -endorser/1 1 -endoscope/1 1 -endoscopic -endoscopy/2 1 -endothermic 1 -endow/11 1 -endowment/1 1 -endpapers -endpoint/1 1 -endue/6 1 -endungeoned -endurable 1 -endurance/2 1 -endure/6 1 -enduring 1 -endways 1 -endwise 1 -Endymion -ENE/2 1 -enema/1 1 -enemy/15 1 -energetic/276 1 -energize/6 1 -energizer/1 1 -energy/15 1 -enervate/6 1 -enervation/2 1 -enfeeble/6 1 -enfeeblement/2 1 -enfilade/28 1 -enfold/11 1 -enforce/6 1 -enforceability 1 -enforceable -enforced 1 -enforcement/1 1 -enforcer/1 1 -enfranchise/6 1 -enfranchisement/2 1 -enfranchiser -Eng -engage/6 1 -engaged 1 -engagement/1 1 -engaging/8 1 -Engels/2 1 -engender/11 1 -engine/77 1 -engineer/23 1 -engineering/2 1 -England/2 1 -English/277 1 -Englishman/2 479 -Englishmen 480 -Englishwoman/2 481 -Englishwomen 482 -engorge/6 1 -engorgement/2 1 -engrained 1 -engram/1 1 -engrave/6 1 -engraver/1 1 -engraving/1 1 -engross/7 1 -engrossed 1 -engrossing 1 -engrossment/2 1 -engulf/11 1 -engulfment/2 1 -enhance/6 1 -enhanceable -enhancement/1 1 -enhancer/10 1 -enharmonic 1 -Enid -Enif/3 -enigma/1 1 -enigmatic -enigmatically -Eniwetok/2 1 -enjambement/1 1 -enjambment/1 1 -enjoin/11 1 -enjoy/11 1 -enjoyability -enjoyable/19 1 -enjoyment/1 1 -Enkidu/2 1 -enlarge/6 1 -enlargeable -enlarged 1 -enlargement/1 1 -enlarger/1 1 -enlighten/11 1 -enlightened 1 -enlightening 1 -enlightenment/2 1 -enlist/11 1 -enlistee/1 1 -enlistment/1 1 -enliven/11 1 -enlivening 1 -enlivenment/2 1 -enmesh/7 1 -enmeshment/2 1 -enmity/15 1 -ennoble/6 1 -ennoblement/2 1 -ennobling 1 -ennui/2 1 -Enoch -enormity/15 1 -enormous/16 1 -Enos -enough/2 1 -enplane/6 1 -enquirer/10 1 -enquiringly -enrage/6 1 -enraged 1 -enrapture/6 1 -enraptured 1 -enrich/7 1 -enrichment/2 1 -Enrico/3 -Enrique/3 -enrobed -enroll/11 1 -enrolling 1 -enrollment/1 1 -Enron/3 -ensconce/6 1 -ensemble/1 1 -enshrine/6 1 -enshrinement/2 1 -enshroud/11 1 -ensign/1 1 -ensilage/2 1 -enslave/6 1 -enslavement/2 1 -ensnare/6 1 -ensnarement/2 1 -ensue/6 1 -ensuing 1 -ensure/6 1 -ensurer/1 1 -entail/5 1 -entailment/2 1 -entangle/6 1 -entangled 1 -entanglement/1 1 -entangler 1 -entente/1 1 -enter/11 1 -entering 1 -enteritis/2 1 -Enterprise/3 -enterprise/1 1 -enterprising/8 1 -entertain/11 1 -entertainer/1 1 -entertaining/37 1 -entertainment/1 1 -enthalpy/60 1 -enthrall/11 1 -enthralling 1 -enthrallment/2 1 -enthrone/6 1 -enthronement/1 1 -enthuse/6 1 -enthusiasm/1 1 -enthusiast/1 1 -enthusiastic/39 1 -entice/6 1 -enticement/1 1 -enticing/8 1 -entire/8 1 -entirety/2 1 -entitle/6 1 -entitlement/1 1 -entity/15 1 -entomb/11 1 -entombment/2 1 -entomological 1 -entomologist/1 1 -entomology/2 1 -entourage/1 1 -entr'acte 1 -entrails -entrails's -entrain/195 1 -entrainment 1 -entrance/28 1 -entrancement/2 1 -entrancing/8 1 -entrant/1 1 -entrap/105 1 -entrapment/2 1 -entreat/11 1 -entreatingly -entreaty/15 1 -entree/1 1 -entrench/7 1 -entrenchment/1 1 -entrepreneur/1 1 -entrepreneurial -entrepreneurship 1 -entropic -entropy/2 1 -entrust/11 1 -entry/15 1 -entryphone -entryphones -entryway/1 1 -entwine/6 1 -enumerable 1 -enumerate/6 1 -enumeration/1 1 -enumerator/1 1 -enunciate/6 1 -enunciation/2 1 -enure/6 1 -enuresis/2 1 -enures 1 -envelop/11 1 -envelope/28 1 -enveloper/1 1 -envelopment/2 1 -envenom/11 1 -enviable/19 1 -envious/16 1 -environ/58 1 -environment/1 1 -environmental/8 1 -environmentalism/2 1 -environmentalist/1 1 -environs's -envisage/6 1 -envision/11 1 -envoy/1 1 -envy/56 1 -envyingly 1 -enzymatic 1 -enzyme/1 1 -Eocene/2 1 -EOE -eolian 1 -eon/1 483 -EPA/2 1 -epaulet/1 1 -epaulette/1 1 -Epcot/3 -epee/1 1 -ephedrine/2 1 -ephemera/2 1 -ephemeral/8 1 -ephemera's 484 -ephemera 485 -ephemeris 1 -Ephesian/10 1 -Ephesus -Ephraim -epic/1 1 -epically -epicenter/1 1 -Epictetus -epic 1 -epicure/1 1 -epicurean/1 1 -Epicurean 1 -Epicurus/2 1 -epicycles -epicycloid 1 -epidemic/51 1 -epidemiological 1 -epidemiologist/1 1 -epidemiology/2 1 -epidermal -epidermic 1 -epidermis/4 1 -epidural/10 1 -epiglottis/4 1 -epigram/1 1 -epigrammatic 1 -epigraph/1 1 -epigraphical -epigraphy/2 1 -epilepsy/2 1 -epileptic/1 1 -epilog/1 1 -epilogue/18 1 -Epimethius/3 -epinephrin/2 1 -epinephrine/2 1 -epiphany/15 1 -Epiphany/15 1 -epiphenomena 486 -epiphenomenon 487 -episcopacy/2 1 -Episcopalian/1 1 -episcopalian 1 -episcopal 1 -Episcopal 1 -episcopate/2 1 -episode/1 1 -episodic/39 1 -epistemic 1 -epistemological 1 -epistemology 1 -epistle/1 1 -Epistle 1 -epistolary 1 -epitaph/18 1 -epitaxial -epitaxy 1 -epithelial -epithelium/2 1 -epithet/1 1 -epithetic -epitome/1 1 -epitomize/6 1 -epoch/1 1 -epochal 1 -eponymous -epoxy/56 1 -epsilon/1 1 -Epsom -Epson/3 -Epstein -equability/2 1 -equable/19 1 -equal/210 1 -equality/15 1 -equalization/2 1 -equalize/6 1 -equalizer/1 1 -equanimity/2 1 -equatable -equate/6 1 -equation/1 1 -equator/1 1 -equatorial 1 -equerry/15 1 -equestrian/1 1 -equestrianism/2 1 -equestrienne/1 1 -equiangular -equidistant/8 1 -equilateral/1 1 -equilibrating -equilibration 1 -equilibrium/2 1 -equine/1 1 -equinoctial 1 -equinox/4 1 -equip/105 1 -equipage/1 1 -equipartition -equipment/1 1 -equipoise/2 1 -equitable/19 1 -equitation/2 1 -equity/15 1 -equiv -equivalence/1 1 -equivalency/15 1 -equivalent/30 1 -equivocal/16 1 -equivocate/6 1 -equivocation/1 1 -equivocator/1 1 -Equuleus -er -ER -Er/2 1 -ERA -era/1 1 -eradicable 1 -eradicate/6 1 -eradication/2 1 -eradicator/1 1 -eras/205 1 -erasable -erase/6 1 -eraser/1 1 -Erasmus/2 1 -erasure/1 1 -Erato/2 1 -Eratosthenes/2 1 -erbium/2 1 -ere -Erebus/2 1 -erect/158 1 -erectile -erection/1 1 -erector/1 1 -Erector 1 -erelong -eremite/1 1 -Erewhon/2 1 -erg/1 1 -ergodic -ergonomic/32 1 -ergonomically -ergophobia -ergosterol/2 1 -ergot/2 1 -ergo 1 -Erhard -Eric/3 -Erica/3 -Erich/3 -Erick/3 -Ericka/3 -Erickson/3 -Ericson -Ericsson -Eridanus -Erie 1 -Erik/3 -Erika/3 -Eriksson -Erin -Eris/4 1 -Eritrea/2 1 -Eritrean/1 1 -Erlenmeyer/3 -Erma/3 -ermine/1 1 -Erna/3 -Ernest/3 -Ernestine/3 -Ernesto/3 -Ernie/3 -Ernst -erode/6 1 -erodible -erogenous -Eros/4 1 -erosion/2 1 -erosional -erosive 1 -erotic/276 1 -erotica/2 1 -eroticism/2 1 -erotics/89 1 -err/11 1 -errand/1 1 -errant 1 -errata/1 1 -errata's 488 -errata 489 -erratic/39 1 -erratum/2 490 -erring 1 -Errol/3 -erroneous/8 1 -error/1 1 -ersatz/4 1 -Erse/2 1 -erst 1 -erstwhile 1 -eruct/11 1 -eructation/1 1 -erudite/8 1 -erudition/2 1 -erupt/11 1 -eruption/1 1 -eruptive 1 -ErvIn/3 -Erwin/3 -erysipelas/2 1 -erythrocyte/1 1 -Esau/2 1 -escalate/6 1 -escalation/1 1 -escalator/1 1 -escallop/23 1 -escalop/11 1 -escalope/6 1 -escapade/1 1 -escape/28 1 -escapee/1 1 -escapement/1 1 -escapism/2 1 -escapist/1 1 -escapologist/10 1 -escapology 1 -escargot/1 1 -escarole/1 1 -escarpment/1 1 -eschatology 1 -Escher/3 -Escherichia/3 -eschew/11 1 -Escondido -escort/23 1 -escritoire/1 1 -escrow/18 1 -escudo/1 1 -escutcheon/1 1 -ESE/2 1 -Eskimo/1 1 -ESL -Esmeralda/3 -esophageal -esophagi 491 -esophagus/2 492 -esoteric/39 1 -esoterica 1 -ESP/2 1 -espadrille/1 1 -espalier/23 1 -especial/8 1 -Esperanto/2 1 -Esperanza/3 -Espinoza/3 -espionage/2 1 -esplanade/1 1 -ESPN -espousal/2 1 -espouse/6 1 -espresso/1 1 -esprit/2 1 -esp 1 -espy/31 1 -Esq/2 1 -esquire/1 1 -Esquire/1 1 -esquire/58 1 -essay/23 1 -essayer/1 1 -essayist/1 1 -Essen/2 1 -essence/1 1 -Essene 1 -essential/30 1 -essentialist 1 -Essequibo -Essex -Essie/3 -est -EST/2 1 -establish/7 1 -establishment/1 1 -Establishment 1 -estate/18 1 -Esteban/3 -esteem/23 1 -Estela/3 -Estella/3 -Estelle/3 -Ester/3 -ester/1 1 -Esterhazy/3 -Estes -Esther/2 1 -esthete/1 1 -esthetic/32 1 -esthetically -estimable 1 -estimate/28 1 -estimation/1 1 -estimator/1 1 -Estonia/2 1 -Estonian/1 1 -Estrada/3 -estrange/6 1 -estranged 1 -estrangement/1 1 -estrogen/2 1 -estrous 1 -estrus/4 1 -estuarine -estuary/15 1 -ET -ETA -eta/1 1 -etc -etch/7 1 -etcher/1 1 -etching/1 1 -ETD -eternal/16 1 -eternity/15 1 -Ethan/3 -ethane/2 1 -ethanol/2 1 -Ethel/3 -Ethelred/3 -ether/2 1 -ethereal/8 1 -etherized -Ethernet -ethic/130 1 -ethical/8 1 -ethicist 1 -ethic 1 -Ethiopia/2 1 -Ethiopian/1 1 -ethnic/1 1 -ethnically -ethnicity/2 1 -ethnic 1 -ethnocentric 1 -ethnocentrism/2 1 -ethnographer/10 1 -ethnographic -ethnographically -ethnography 1 -ethnological/8 1 -ethnologist/1 1 -ethnology/2 1 -ethological 1 -ethologist/1 1 -ethology/2 1 -ethos/2 1 -ethyl/2 1 -ethylene/2 1 -etiolated -etiologic -etiological 1 -etiology/15 1 -etiquette/2 1 -Etna/2 1 -Eton 1 -Etruria -Etruscan 1 -Etta/3 -etude/1 1 -etymological/8 1 -etymologist/1 1 -etymology/15 1 -EU -Eu/2 1 -eucalypti 493 -eucalyptus/4 494 -Eucharist/1 1 -Eucharistic -euchre/28 1 -Euclid/2 1 -euclidean -Euclidean -Eugene -Eugenia/2 1 -eugenic/35 1 -eugenicist/1 1 -Eugenie/3 -Eugenio/3 -eukaryote 1 -Eula/3 -Euler -eulogist/1 1 -eulogistic 1 -eulogize/6 1 -eulogizer/1 1 -eulogy/15 1 -Eumenides/2 1 -Eunice/3 -eunuch/1 1 -euphemism/1 1 -euphemistic -euphemistically -euphonious/8 1 -euphonium/10 1 -euphony/2 1 -euphoria/2 1 -euphoric -euphorically -Euphrates/2 1 -Eur -Eurasia/2 1 -Eurasian/1 1 -eureka 1 -Euripides -euro/1 1 -Eurodollar/1 1 -Europa/2 1 -Europe/2 1 -European/1 1 -europium/2 1 -Eurydice/2 1 -Eustachian/3 -eutectic 1 -Euterpe/2 1 -euthanasia/2 1 -euthanize 1 -euthenics/2 1 -Eva/3 -evacuate/6 1 -evacuation/1 1 -evacuee/1 1 -evadable -evade/6 1 -evader/1 1 -evaluable -evaluate/6 1 -evaluation/1 1 -evaluational -evaluative -evaluator/10 1 -Evan/1 1 -evanescence/2 1 -evanescent 1 -evangelic -evangelical/30 1 -evangelicalism/2 1 -Evangelical 1 -Evangelina/3 -Evangeline/3 -evangelism/2 1 -evangelist/1 1 -evangelistic 1 -Evangelist 1 -evangelize/6 1 -Evansville -evaporate/6 1 -evaporation/2 1 -evaporator/1 1 -evasion/1 1 -evasive/16 1 -eve/1 1 -Eve/2 1 -Evelyn -even/52 1 -evener 1 -evenhanded/8 1 -evening/1 1 -Evenki/2 1 -evensong/2 1 -event/1 1 -eventful/16 1 -eventide/2 1 -eventing -eventual/8 1 -eventuality/15 1 -eventuate/6 1 -Everest/2 1 -Everett/3 -Everette/3 -everglade/1 1 -Everglades/2 1 -evergreen/1 1 -everlasting/30 1 -everliving -evermore -EverReady/3 -Evert/3 -ever 1 -everybody/2 1 -everyday 1 -everyman 1 -everyone/2 1 -everyplace -everything/2 1 -every 1 -everywhere -Evian/3 -evict/11 1 -eviction/1 1 -evidence/28 1 -evident/8 1 -evidential 1 -evident 1 -evil/278 1 -evildoer/1 1 -evildoing/2 1 -evince/6 1 -eviscerate/6 1 -evisceration/2 1 -Evita/3 -evocation/1 1 -evocative/8 1 -evoke/6 1 -evolute 1 -evolution/1 1 -evolutionary/211 1 -evolutionism 1 -evolutionist/1 1 -evolve/6 1 -ewe/1 1 -ewer/1 1 -Ewing/3 -ex/4 495 -exacerbate/6 1 -exacerbating 1 -exacerbation/2 1 -exact/98 1 -exacter 1 -exacting/8 1 -exaction/2 1 -exactitude/2 1 -exaggerate/6 1 -exaggerated/8 1 -exaggeration/1 1 -exaggerator/1 1 -exalt/11 1 -exaltation/2 1 -exalted 1 -exam/1 1 -examinable -examination/1 1 -examine/6 1 -examinees -examiner/1 1 -example/28 1 -exasperate/6 1 -exasperated/8 1 -exasperating/8 1 -exasperation/2 1 -Excalibur/2 1 -excavate/6 1 -excavation/1 1 -excavator/1 1 -Excedrin/3 -exceed/11 1 -exceeding/8 1 -excel/61 1 -excellence/2 1 -excellency/15 1 -Excellency/15 1 -excellent/8 1 -excelling 1 -excelsior/2 1 -except/11 1 -exception/1 1 -exceptionable 1 -exceptional/8 1 -excerpt/23 1 -excerpting 1 -excess/40 1 -excessive/8 1 -excess 1 -exchange/28 1 -exchangeable 1 -exchanger/10 1 -exchequer/1 1 -Exchequer 1 -excise/28 1 -excision/1 1 -excitability/2 1 -excitable/19 1 -excitation/1 1 -excite/6 1 -excited/8 1 -excitement/1 1 -exciter/1 1 -exciting/8 1 -exciton 1 -excl/10 1 -exclaim/11 1 -exclamation/1 1 -exclamatory 1 -exclude/6 1 -exclusion/1 1 -exclusionary -exclusive/36 1 -exclusivity/2 1 -excommunicate/43 1 -excommunication/1 1 -excoriate/6 1 -excoriation/1 1 -excrement/2 1 -excremental -excrescence/1 1 -excrescent 1 -excreta/2 1 -excrete/6 1 -excretion/1 1 -excretory 1 -excruciating/8 1 -excruciation 1 -exculpate/6 1 -exculpation/2 1 -exculpatory -excursion/18 1 -excursionist/1 1 -excursive/16 1 -excusable/19 1 -excuse/28 1 -exec/64 1 -execrable/19 1 -execrate/6 1 -execration/2 1 -executable 1 -execute/6 1 -execution/1 1 -executioner/1 1 -executive/1 1 -executor/1 1 -executrix/184 1 -exegeses 496 -exegesis/2 497 -exegetical 1 -exegetic 1 -exemplar/1 1 -exemplary 1 -exemplification/1 1 -exemplify/31 1 -exempt/5 1 -exemption/1 1 -exempt 1 -exercisable -exercise/28 1 -exerciser/1 1 -Exercycle 1 -exert/11 1 -exertion/1 1 -exeunt -exfoliate/6 1 -exfoliation 1 -exhalation/1 1 -exhale/6 1 -exhaust/23 1 -exhaustible -exhausting 1 -exhaustion/2 1 -exhaustive/16 1 -exhibit/23 1 -exhibition/1 1 -exhibitioner/10 1 -exhibitionism/2 1 -exhibitionist/1 1 -exhibitor/1 1 -exhilarate/6 1 -exhilarating 1 -exhilaration/2 1 -exhort/11 1 -exhortation/1 1 -exhumation/1 1 -exhume/6 1 -exigence/1 1 -exigency/15 1 -exigent 1 -exiguity/2 1 -exiguous 1 -exile/28 1 -exist/11 1 -existence/1 1 -existential/8 1 -existentialism/2 1 -existentialist/1 1 -existentialistic 1 -existent 1 -exit/23 1 -exobiology/2 1 -Exocet/2 1 -exocrine 1 -Exodus/2 1 -exodus/4 1 -exogenous 1 -exonerate/6 1 -exoneration/2 1 -exorbitance/2 1 -exorbitant/8 1 -exorcise/6 1 -exorcism/1 1 -exorcist/1 1 -exorcize/6 1 -exoskeleton/1 1 -exosphere/1 1 -exothermic/39 1 -exotic/51 1 -exotica -exoticism/2 1 -exp -expand/11 1 -expandability 1 -expandable -expanded 1 -expander 1 -expanse/1 1 -expansible -expansion/1 1 -expansionary -expansionism/2 1 -expansionist/1 1 -expansive/16 1 -expat/10 1 -expatiate/6 1 -expatiation/2 1 -expatriate/28 1 -expatriation/2 1 -expect/11 1 -expectancy/15 1 -expectant/8 1 -expectation/1 1 -expectational -expected 1 -expecting 1 -expectorant/1 1 -expectorate/6 1 -expectoration/2 1 -expedience/1 1 -expediency/15 1 -expedient/30 1 -expedite/6 1 -expediter/1 1 -expedition/1 1 -expeditionary -expeditious/16 1 -expeditor/1 1 -expel/61 1 -expelling 1 -expend/11 1 -expendable/1 1 -expenditure/1 1 -expense/18 1 -expensive/16 1 -experience/28 1 -experiential 1 -experiment/23 1 -experimental/8 1 -experimentalist/10 1 -experimentation/2 1 -experimenter/1 1 -expert/220 1 -expertise/2 1 -expertize 1 -expiate/6 1 -expiation/2 1 -expiatory -expiration/2 1 -expiratory -expire/6 1 -expiring 1 -expiry/2 1 -explain/11 1 -explainable -explanation/1 1 -explanatory 1 -expletive/1 1 -explicable -explicate/6 1 -explication/1 1 -explicative 1 -explicit/16 1 -explode/6 1 -exploder/10 1 -exploit/23 1 -exploitable -exploitation/1 1 -exploitative -exploiter/1 1 -explorable -exploration/1 1 -exploratory -explore/6 1 -explorer/1 1 -explosion/1 1 -explosive/36 1 -expo/1 1 -exponent/1 1 -exponential/8 1 -exponentiation 1 -export/23 1 -exportability 1 -exportable -exportation/2 1 -exporter/1 1 -expos/205 1 -expose/28 1 -exposed 1 -exposition/1 1 -expositor/1 1 -expository 1 -expostulate/6 1 -expostulation/1 1 -exposure/1 1 -expound/11 1 -expounder/1 1 -express/279 1 -expressible -expression/1 1 -expressionism/2 1 -expressionist/1 1 -expressionistic -expressionless/8 1 -expressive/16 1 -expressway/1 1 -expropriate/6 1 -expropriation/1 1 -expropriator/1 1 -expulsion/1 1 -expunge/6 1 -expurgate/6 1 -expurgation/1 1 -exquisite/16 1 -ext -extant 1 -extemporaneous/16 1 -extempore 1 -extemporization/2 1 -extemporize/6 1 -extend/11 1 -extendability 1 -extendable -extended 1 -extender/1 1 -extendible -extensibility 1 -extensible 1 -extension/1 1 -extensional/8 1 -extensive/16 1 -extensors -extent/1 1 -extenuate/6 1 -extenuating 1 -extenuation/2 1 -exterior/1 1 -exterminate/6 1 -extermination/1 1 -exterminator/1 1 -external/30 1 -externalization/1 1 -externalize/6 1 -extinct/11 1 -extinction/1 1 -extinct 1 -extinguish/7 1 -extinguishable -extinguisher/1 1 -extirpate/6 1 -extirpation/2 1 -extol/61 1 -extoll/11 1 -extolling 1 -extort/11 1 -extortion/2 1 -extortionate/8 1 -extortioner/1 1 -extortionist/1 1 -extra/1 1 -extracellular 1 -extract/23 1 -extractable -extraction/1 1 -extractive 1 -extractor/1 1 -extracurricular 1 -extraditable -extradite/6 1 -extradition/1 1 -extragalactic -extrajudicial 1 -extralegal 1 -extralinguistic -extramarital -extramural 1 -extraneous/8 1 -extraordinaire -extraordinary/211 1 -extrapolate/6 1 -extrapolation/1 1 -extrasensory -extrasolar -extraterrestrial/1 1 -extraterritoriality/2 1 -extraterritorial 1 -extra 1 -extravagance/1 1 -extravagant/8 1 -extravaganza/1 1 -extravehicular -extravert/18 1 -extremal -extrema 498 -extreme/25 1 -extremism/2 1 -extremist/1 1 -extremity/15 1 -extricable -extricate/6 1 -extrication/2 1 -extrinsic/39 1 -extroversion/2 1 -extrovert/62 1 -extrude/6 1 -extrusion/1 1 -extrusive -ex 1 -exuberance/2 1 -exuberant/8 1 -exudate 1 -exudation/2 1 -exude/6 1 -exult/11 1 -exultant/8 1 -exultation/2 1 -exulting/8 1 -exurb/1 1 -exurban -exurbanite/1 1 -exurbia/2 1 -Exxon/3 -Eyck/3 -eye/28 1 -eyeball/23 1 -eyebrow/1 1 -eyedropper/1 1 -eyed 1 -eyeful/1 1 -eyeglass/4 1 -eyelash/4 1 -eyeless 1 -eyelet/18 1 -eyelid/1 1 -eyeliner/1 1 -eyeopener/1 1 -eyeopening -eyepiece/1 1 -eyeshadow 1 -eyesight/2 1 -eyesore/1 1 -eyestrain/2 1 -eyeteeth 499 -eyetooth/2 500 -eyewash/2 1 -eyewitness/3 -eyewitnesses -Eyre -eyrie/1 1 -eyry/15 1 -Eysenck/3 -Ezekiel -Ezra -f/280 1 -F/2 1 -fa/2 1 -FAA -Faberge -Fabian/1 1 -fable/77 1 -fabric/1 1 -fabricate/6 1 -fabrication/1 1 -fabricator/1 1 -fab 1 -fabulists -fabulous/8 1 -facade/1 1 -face/28 1 -facecloth/1 1 -faceless 1 -facelift/18 1 -faceplate 1 -facet/23 1 -facetious/16 1 -facial/30 1 -facile/8 1 -facilitate/6 1 -facilitation/2 1 -facilitative -facilitator/1 1 -facility/15 1 -facing/1 1 -fact/1 1 -faction/1 1 -factional -factionalism/2 1 -factious 1 -factitious 1 -factoid/1 1 -factor/23 1 -factorial/1 1 -factorisable -factorization/10 1 -factorize/6 1 -factory/15 1 -factotum/1 1 -factual/8 1 -faculty/15 1 -facsimile/63 1 -fad/18 1 -faddiness -faddish/153 1 -faddist/1 1 -faddy 1 -fade/28 1 -faded 1 -fadeout 1 -fading 1 -faecal 1 -faeces/2 1 -faerie/1 1 -Faeroe/3 -faery/15 1 -faff/11 1 -Fafnir -fag/92 1 -fagging 1 -faggoting's -Fagin/2 1 -fagot/86 1 -fagoting/2 1 -Fahd/3 -Fahrenheit 1 -faience/2 1 -fail/23 1 -failing/1 1 -faille/2 1 -failure/1 1 -fain/166 1 -faint/52 1 -fainter 1 -fainthearted 1 -fainting 1 -fain 1 -fair/281 1 -Fairbanks -fairground/1 1 -fairing/1 1 -fairings/89 1 -fairish 1 -fairway/1 1 -fairy/15 1 -fairyland/1 1 -fairytale 1 -fairy 1 -Faisal/3 -Faisalabad -Faith -faith/18 1 -faithful/36 1 -faithless/16 1 -fajita/130 1 -fake/139 1 -faker/1 1 -fakir/1 1 -Falasha 1 -falcon/18 1 -falconer/1 1 -falconry/2 1 -Falkland/3 -Falklands -fall/112 501 -fallacious/8 1 -fallacy/15 1 -fallback 1 -faller/10 1 -fallibility/2 1 -fallible/29 1 -falling 1 -falloff/1 1 -fallopian -Fallopian/3 -fallout/2 1 -fallow/23 1 -false/27 1 -falsehood/1 1 -falsetto/1 1 -falsie/1 1 -falsifiability 1 -falsifiable -falsification/1 1 -falsifier/1 1 -falsify/31 1 -falsity/15 1 -Falstaff/2 1 -falter/23 1 -faltering/191 1 -Falwell/3 -fame/149 1 -familial -familiar/30 1 -familiarity/15 1 -familiarization/2 1 -familiarize/6 1 -families -family/3 -famine/1 1 -famish/7 1 -famous/8 1 -fan/133 1 -fanatic/1 1 -fanatical/8 1 -fanaticism/2 1 -fanciable -fancier/1 1 -fanciful/16 1 -fancily 1 -fancy/282 1 -fancywork/2 1 -fandango/1 1 -fanfare/1 1 -fang/62 1 -fanlight/1 1 -Fannie/3 -fanning 1 -fantail/1 1 -fantasia/1 1 -fantasist/10 1 -fantasize/6 1 -fantastical/8 1 -fantastic 1 -fantasy/56 1 -fantasying 502 -fanzine/1 1 -Fanny/3 -fanny/15 1 -FAQ/1 1 -far/283 503 -farad/1 1 -Faraday/2 1 -faradize/6 1 -faraway 1 -farce/18 1 -farcical/8 1 -fare/28 1 -farewell/18 1 -farfetched 1 -Fargo/2 1 -farina/2 1 -farinaceous -Farley/3 -farm/78 1 -Farmer -farmer/1 1 -farmhand/1 1 -farmhouse/1 1 -farming/1 1 -farmland/1 1 -farmstead/1 1 -farmyard/1 1 -faro/2 1 -farrago/4 1 -Farragut -Farrakhan/3 -Farrell/3 -farrier/1 1 -Farrow/3 -farrow/23 1 -farseeing 1 -Farsi/2 1 -farsighted/33 1 -fart/23 1 -farthermost -farthing/1 1 -far 1 -fascia/1 1 -fascicle/1 1 -fascinate/6 1 -fascinated 1 -fascinating/8 1 -fascination/1 1 -fascism/2 1 -Fascism 1 -fascist/1 1 -fascistic 1 -fascist 1 -Fascist 1 -fashion/23 1 -fashionable/19 1 -fashioner/1 1 -Fassbinder/3 -fa's 504 -fast/284 1 -fastback/1 1 -fastball/1 1 -fasten/11 1 -fastener/1 1 -fastening/1 1 -faster 1 -fa 505 -fastidious/16 1 -fasting 1 -fat/285 1 -Fatah/3 -fatal/8 1 -fatalism/2 1 -fatalist/1 1 -fatalistic/39 1 -fatality/15 1 -fatback/2 1 -fate/28 1 -fateful/16 1 -Fates -fathead/1 1 -fatheaded -fatheadedness -father/1 1 -Father/1 1 -father/11 1 -fatherhood/2 1 -fatherland/1 1 -fatherless 1 -fatherly 1 -fathom/23 1 -fathomable -fathomless 1 -fatigue/232 1 -Fatima -Fatimid 1 -fatso/10 1 -fatten/11 1 -fattening 1 -fatuity/2 1 -fatuous/16 1 -fatwa/1 1 -fatty/286 1 -faucet/1 1 -Faulkner/2 1 -Faulknerian -fault/23 1 -faultfinder/1 1 -faultfinding/2 1 -faultless/16 1 -faulty/50 1 -faun/1 1 -fauna/1 1 -Fauntleroy/3 -Faust/2 1 -Faustian 1 -Faustino/3 -Faustus/2 1 -fauvism/2 1 -fauvist/1 1 -fave/10 1 -favor/23 1 -favorable/19 1 -favored 1 -favoring 1 -favorite/1 1 -favoritism/2 1 -Fawkes -fawn/23 1 -fawner/1 1 -fawning/8 1 -fax/287 1 -Fay/3 -fay/288 1 -Faye/3 -faze/6 1 -FBI/2 1 -FCC -FD -FDA -FDIC/2 1 -FDR/2 1 -Fe/2 1 -fealty/2 1 -fear/23 1 -fearful/85 1 -fearless/16 1 -fearsome/83 1 -feasibility/2 1 -feasible/19 1 -feast/23 1 -feasting 1 -feat/1 1 -feather/23 1 -featherbedding/2 1 -featherbrained -feathering 1 -featherless 1 -featherlight -featherweight/1 1 -feathery/34 1 -feat 1 -feature/28 1 -featureless 1 -Feb/2 1 -febrile 1 -February/15 1 -fecal 1 -feces/2 1 -feckless/83 1 -fecundate/6 1 -fecundation/2 1 -fecundity/2 1 -fecund 1 -fed/1 1 -Fed/1 1 -federal/30 1 -Federal/1 1 -federalism/2 1 -federalist/1 1 -Federalist/2 1 -federalization/2 1 -federalize/6 1 -federate/6 1 -federation/1 1 -Federico/3 -FedEx -fedora/1 1 -fed 506 -fee/77 1 -feeble/289 1 -feed/86 507 -feedback/2 1 -feedbag/1 1 -feeder/1 1 -feeding/1 1 -feedlot/1 1 -feedstock 1 -feedstuffs -feel/86 508 -feeler/1 1 -feelgood -feeling/30 1 -feelings 1 -fees 509 -feet 510 -feign/11 1 -feigned 1 -feigning 1 -feint/23 1 -feisty/34 1 -felafel/10 1 -feldspar/2 1 -Felecia/3 -Felice/3 -Felicia/2 1 -felicitate/6 1 -felicitation/1 1 -felicitous/8 1 -Felicity/3 -felicity/15 1 -feline/1 1 -Felipe/3 -Felix/3 -fell/179 1 -fella/10 511 -fellatio/2 1 -feller/10 1 -Fellini -fellow/18 1 -fellowman/2 512 -fellowmen 513 -fellowship/18 1 -fellow 1 -fell 514 -felon/1 1 -felonious 1 -felon 1 -felony/15 1 -felt/23 1 -felting 1 -felt 515 -female/20 1 -feminine/30 1 -femininity/2 1 -feminism/2 1 -feminist/1 1 -feminize/6 1 -femoral -fem 1 -femur/1 1 -fen/1 1 -fence/28 1 -fencepost 1 -fencer/1 1 -fencing/2 1 -fend/11 1 -fender/1 1 -fenestration/2 1 -Fenian 1 -fenland 1 -fennel/2 1 -feral 1 -Ferber/3 -Ferdinand -Fergus -Ferguson/3 -Ferlinghetti/3 -Fermat/2 1 -ferment/23 1 -fermentation/2 1 -Fermi -fermion/10 1 -fermium/2 1 -Fern/3 -fern/1 1 -Fernandez/3 -Fernando/3 -ferny/34 1 -ferocious/16 1 -ferocity/2 1 -Ferrari/3 -Ferraro/3 -Ferrell/3 -ferret/23 1 -ferreting 1 -ferric 1 -Ferris -ferrite 1 -ferromagnetic -ferrous 1 -ferrule/18 1 -ferry/56 1 -ferryboat/1 1 -ferryman/2 516 -ferrymen 517 -fertile 1 -fertility/2 1 -fertilization/2 1 -fertilize/6 1 -fertilizer/1 1 -fer 1 -ferule/18 1 -fervency/2 1 -fervent/8 1 -fervid/8 1 -fervor/2 1 -fess/156 1 -fest/1 1 -festal 1 -fester/23 1 -festival/1 1 -festive/16 1 -festivity/15 1 -festoon/23 1 -feta/2 1 -fetal 1 -fetch/156 1 -fetcher/1 1 -fetching/8 1 -fete/28 1 -fetich/4 1 -fetid/33 1 -fetish/4 1 -fetishism/2 1 -fetishist/1 1 -fetishistic -fetlock/1 1 -fetter/23 1 -fettle/2 1 -fettuccine/2 1 -fetus/4 1 -feud/23 1 -feudalism/2 1 -feudalistic -feudal 1 -feuding 1 -fever/62 1 -feverish/16 1 -few/187 1 -Feynman/3 -fey 1 -Fez -fez/290 1 -ff -FHA/2 1 -fiance/1 1 -fiancee/1 1 -fiasco/4 1 -Fiat/3 -fiat/1 1 -fib/136 1 -fibber/1 1 -fiber/1 1 -fiberboard/2 1 -fibered -fiberfill/2 1 -fiberglass/2 1 -Fiberglas 1 -Fibonacci/3 -fibril/1 1 -fibrillate/6 1 -fibrillation/2 1 -fibrin/2 1 -fibroblast/10 1 -fibroid 1 -fibrosis/2 1 -fibrous 1 -fibula/53 1 -fibular -FICA/2 1 -fiche/1 1 -Fichte -fichu/1 1 -fickle/84 1 -fiction/1 1 -fictional/8 1 -fictionalization/1 1 -fictionalize/6 1 -fictitious/8 1 -fictive 1 -ficus/2 1 -fiddle/28 1 -fiddler/1 1 -fiddlesticks -fiddlier 518 -fiddliest 518 -fiddlings -fiddly/34 1 -Fidel/3 -fidelity/2 1 -fidget/23 1 -fidgety 1 -Fido/3 -fiduciary/15 1 -fief/1 1 -fiefdom/1 1 -field/23 1 -fielder/1 1 -Fielding -fielding 1 -Fields -fieldsman 519 -fieldsmen 520 -fieldwork/2 1 -fieldworker/1 1 -fiend/1 1 -fiendish/8 1 -fierce/27 1 -fiery/50 1 -fiesta/1 1 -fie 1 -fife/18 521 -fifer/1 1 -FIFO -fifteen/1 1 -fifteenth/1 1 -fifteen 1 -fifth/30 1 -fiftieth/1 1 -fifty/15 1 -fig/18 1 -Figaro/3 -fight/86 522 -fightback 1 -fighter/1 1 -fighting/2 1 -figment/1 1 -Figueroa/3 -figural 1 -figuration/2 1 -figurative/8 1 -figure/28 1 -figured 1 -figurehead/1 1 -figurine/1 1 -Fiji/2 1 -Fijian/1 1 -filament/1 1 -filamentary -filamentous -filbert/1 1 -filch/7 1 -filching 1 -file/28 1 -filer/1 1 -filet/23 1 -filial 1 -filibuster/23 1 -filibusterer/1 1 -filibustering 1 -filigree/63 1 -filing/1 1 -Filipino/1 1 -fill/23 1 -filler/1 1 -fillet/23 1 -fillies -filling/1 1 -fillip/23 1 -Fillmore/2 1 -film/23 1 -filmmaker/1 1 -filmstrip/1 1 -filmy/49 1 -Filofax 1 -filo 1 -filter/23 1 -filterable 1 -filterer/1 1 -filth/2 1 -filthy/50 1 -filtrable 1 -filtrate/28 1 -filtration/2 1 -filly/3 -fin/291 1 -finagle/6 1 -finagler/1 1 -final/30 1 -finale/1 1 -finalist/1 1 -finality/2 1 -finalization/2 1 -finalize/6 1 -finance/28 1 -financial/8 1 -financier/18 1 -financing/2 1 -Finch/3 -finch/4 1 -find/86 523 -findable -finder/1 1 -finding/130 1 -fine/107 1 -finer 1 -finery/2 1 -fines/79 1 -finespun -finesse/28 1 -finessing 1 -fines 524 -finger/23 1 -fingerboard/1 1 -fingering/1 1 -fingerless 1 -fingerling/1 1 -fingermark/10 1 -fingernail/1 1 -fingerprint/23 1 -fingerprinting 1 -fingertip/1 1 -finial/1 1 -finical 1 -finickiness/3 -finicky/34 1 -fining 1 -finis/4 525 -finish/22 1 -finisher/1 1 -finishing 1 -finite/83 1 -fink/23 1 -Finland/2 1 -Finley/3 -Finn/1 1 -Finnbogadottir/3 -Finnegan/3 -Finnish/2 1 -fin 1 -finny/34 1 -Fiona/3 -fiord/1 1 -fir/18 1 -fire/28 1 -firearm/1 1 -fireball/1 1 -firebomb/23 1 -firebombings -firebox/4 1 -firebrand/1 1 -firebreak/1 1 -firebrick/1 1 -firebug/1 1 -firecracker/1 1 -firedamp/2 1 -firefight/121 1 -firefighter/1 1 -firefighting/1 1 -firefight's -fireflies -firefly/3 -Firefox/3 -fireguard/10 1 -firehouse/1 1 -firelight/2 1 -firelighter/10 1 -fireman/2 526 -firemen 527 -fireplace/1 1 -fireplug/1 1 -firepower/2 1 -fireproof/11 1 -firer/1 1 -firesafe -firescreen -firescreens -fireside/1 1 -Firestone/3 -firestorm/1 1 -firetrap/1 1 -firetruck/1 1 -firewall/18 1 -firewater/2 1 -firewood/2 1 -firework/1 1 -firing/10 1 -firkin 1 -firm/52 1 -firmament/1 1 -firmer 1 -firmware/1 1 -first/30 1 -firstborn/1 1 -firsthand 1 -firth/1 1 -fiscal/30 1 -Fischer -fish/22 1 -fishbowl/1 1 -fishcake/1 1 -Fisher -fisher/1 1 -fisherman/2 528 -fishermen 529 -fishery/15 1 -fishhook/1 1 -fishing/2 1 -fishmonger/1 1 -fishnet/1 1 -fishpond/1 1 -fishtail/5 1 -fishwife/2 530 -fishwives 531 -fishy/50 1 -Fisk/3 -fissile 1 -fission/18 1 -fissionable 1 -fissure/77 1 -fist/18 1 -fistfight/18 1 -fistful/1 1 -fisticuffs -fisticuffs's -fistula/1 1 -fistulous/2 1 -fit/292 1 -Fitch/3 -fitful/16 1 -fitment/10 1 -fitted 1 -fitter/1 1 -fitting/30 1 -Fitzgerald -Fitzpatrick/3 -Fitzroy/3 -five/48 1 -fivefold -fiver/10 1 -fives 532 -fix/287 1 -fixable 1 -fixate/6 1 -fixation/1 1 -fixative/1 1 -fixed/8 1 -fixer/1 1 -fixing/32 1 -fixity/2 1 -fixture/1 1 -Fizeau/3 -fizz/22 1 -fizzing 1 -fizzle/28 1 -fizzling 1 -fizzy/34 1 -fjord/1 1 -fl -FL -Fla -flab/2 1 -flabbergast/11 1 -flabby/50 1 -flaccid/8 1 -flaccidity/2 1 -flack/18 1 -flag/92 1 -flagellant/10 1 -flagella 533 -flagellate/43 1 -flagellation/2 1 -flagellum/2 534 -flagging 1 -flagman/2 535 -flagmen 536 -flagon/1 1 -flagpole/1 1 -flagrance/2 1 -flagrancy/2 1 -flagrant/8 1 -flagship/1 1 -flagstaff/1 1 -flagstone/1 1 -flail/23 1 -flair/1 1 -flak/2 1 -flake/28 1 -flakier 537 -flakiest 537 -flak 1 -flaky/49 1 -flamage -flamages -flambe/23 1 -flamboyance/2 1 -flamboyancy/2 1 -flamboyant/8 1 -flame/28 1 -flamenco/1 1 -flameproof/11 1 -flamer/10 1 -flamethrower/1 1 -flaming/10 1 -flamingo/1 1 -flaming 1 -flammability/2 1 -flammable/1 1 -flam 1 -flan/1 1 -Flanagan/3 -Flanders/2 1 -flange/77 1 -flank/23 1 -flanker/1 1 -flannel/23 1 -flannelet/2 1 -flannelette/2 1 -flap/47 1 -flapjack/1 1 -flapper/1 1 -flare/28 1 -flareup/1 1 -flaring 1 -flash/293 1 -flashback/1 1 -flashbulb/1 1 -flashcard/1 1 -flashcube/1 1 -flasher/1 1 -flashgun/1 1 -flashing/2 1 -flashlight/1 1 -flashpoint/1 1 -flashy/50 1 -flask/1 1 -flat/292 1 -flatbed/1 1 -flatboat/1 1 -flatcar/1 1 -flatfeet 538 -flatfish/4 1 -flatfoot/62 539 -flatfooted 1 -Flathead 1 -flatiron/1 1 -flatland/2 1 -flatlet/10 1 -flatmate/10 1 -Flatt/3 -flatten/11 1 -flatter/11 1 -flatterer/1 1 -flattering/8 1 -flattery/2 1 -flattish 1 -flattop/1 1 -flatulence/2 1 -flatulent 1 -flatus/2 1 -flatware/2 1 -flatworm/1 1 -Flaubert -flaunt/23 1 -flauntingly 1 -flautist/1 1 -flavor/23 1 -flavorful 1 -flavoring/1 1 -flavorless 1 -flavorsome 1 -flaw/23 1 -flawed 1 -flawless/16 1 -flax/2 1 -flaxen 1 -flay/11 1 -flayer/10 1 -flea/1 1 -fleabag/1 1 -fleabite/10 1 -fleapit/10 1 -fleck/23 1 -fledged -fledgeling/1 1 -fledgling/1 1 -flee/294 1 -fleece/28 1 -fleecer/1 1 -fleecy/49 1 -fleet/52 1 -fleeting/16 1 -fleetingly/2 1 -Fleischer/3 -Fleming 1 -Flemish/2 1 -flesh/22 1 -fleshing 1 -fleshless 1 -fleshly/34 1 -fleshpot/1 1 -fleshy/34 1 -Fletcher -flew 1 -flex/22 1 -flexibility/15 1 -flexible/19 1 -flexitime/2 1 -flextime/2 1 -flibbertigibbet/1 1 -flick/23 1 -flicker/23 1 -flickering 1 -flickery -flier/1 540 -fliest 541 -flight/62 1 -flightless 1 -flightpath -flighty/49 1 -flimflam/160 1 -flimsy/50 1 -flinch/22 1 -fling/86 542 -Flint -flint/18 1 -flintlock/1 1 -Flintstones -flinty/34 1 -flip/295 1 -flippable -flippancy/2 1 -flippant/8 1 -flipper/1 1 -flippy/60 1 -flirt/23 1 -flirtation/1 1 -flirtatious/16 1 -flirting 1 -flirty 1 -flit/109 1 -flitting 1 -Flo/3 -float/23 1 -floatation 1 -floater/1 1 -floating 1 -floaty 1 -flocculation 1 -flock/23 1 -flocking/2 1 -floe/1 1 -flog/117 1 -flogger/1 1 -flogging/1 1 -flood/78 1 -flooder 1 -floodgate/1 1 -flooding 1 -floodlight/23 543 -floodlit 544 -floodplain/1 1 -floodwater/2 1 -floor/23 1 -floorboard/1 1 -flooring/2 1 -floorspace -floorwalker/1 1 -floozie/1 1 -floozy/15 1 -flop/296 1 -flophouse/1 1 -flopper 1 -floppy/221 1 -Flora -flora/1 1 -floral 1 -Florence/2 1 -Florentine 1 -Flores -florescence/2 1 -florescent -floret/1 1 -florid/16 1 -Florida/2 1 -Floridan 1 -Floridian/1 1 -florin/1 1 -Florine/3 -florist/1 1 -Florsheim/3 -Flory/3 -floss/22 1 -Flossie/3 -flossy/34 1 -flotation/1 1 -flotilla/1 1 -flotsam/2 1 -flounce/28 1 -flouncing 1 -flouncy/34 1 -flounder/23 1 -flour/23 1 -flourish/22 1 -flourishing 1 -floury/34 1 -flout/11 1 -flouter/1 1 -flout's -flow/23 1 -flowchart/1 1 -flower/23 1 -flowerbed/1 1 -flowering/10 1 -flowerless 1 -flowerpot/1 1 -Flowers -flowery/49 1 -flowing 1 -Floyd -flt -flu/2 1 -flub/136 1 -fluctuate/6 1 -fluctuation/1 1 -flue/1 1 -fluency/2 1 -fluent/8 1 -fluff/23 1 -fluffy/49 1 -fluid/30 1 -fluidity/2 1 -fluidized -fluke/18 1 -flukey 545 -flukier 546 -flukiest 546 -fluky/34 1 -flume/18 1 -flummox/7 1 -flung 547 -flunk/23 1 -flunkey/1 1 -flunky/15 1 -fluoresce/6 1 -fluorescence/2 1 -fluorescent 1 -fluoridate/6 1 -fluoridation/2 1 -fluoride/1 1 -fluorine/2 1 -fluorite/2 1 -fluorocarbon/1 1 -fluoroscope/18 1 -fluoroscopic 1 -flurried 1 -flurry/56 1 -flush/293 1 -flusher 1 -flushing 1 -fluster/23 1 -flute/28 1 -fluting/2 1 -flutist/1 1 -flutter/23 1 -fluttering 1 -fluttery 1 -fluvial 1 -flux/22 1 -fly/297 1 -flyable 1 -flyaway 1 -flyblown -flyby/1 1 -flycatcher/1 1 -flying/2 1 -flyleaf/120 1 -Flynn/3 -flyover/1 1 -flypaper/1 1 -flypast/10 1 -fly's -flysheet/10 1 -flyspeck/23 1 -flyswatter/1 1 -flytrap/10 1 -flyway/1 1 -flyweight/1 1 -flywheel/1 1 -FM/1 1 -Fm/2 1 -FNMA/2 1 -foal/23 1 -foam/23 1 -foaming 1 -foamy/49 1 -fob/136 1 -focal/8 1 -Foch -fo'c'sle -fo'c's'le 1 -focus/22 1 -fodder/18 1 -foe/1 1 -foetid 1 -FOFL -fog/92 1 -fogbound 1 -foghorn/1 1 -fogy/15 1 -foggy/50 1 -fogyish 1 -foible/1 1 -foil/23 1 -foiling 1 -foist/11 1 -Fokker -fol -fold/78 1 -foldaway 1 -folder/1 1 -folding 1 -foldout/1 1 -Foley -Folgers -foliage/2 1 -foliate 1 -folio/18 1 -folk/1 1 -folklore/2 1 -folkloric -folklorist/1 1 -folksinger/1 1 -folksinging/2 1 -folksong 1 -folksy/49 1 -folktale/1 1 -folk 1 -folkway/1 1 -foll -follicle/1 1 -follicular -follies -follow/5 1 -followable -follower/1 1 -following/1 1 -followup/10 1 -Folsom -folly/3 -Fomalhaut -foment/11 1 -fomentation/2 1 -fond/21 1 -Fonda -fondant/1 1 -fondle/6 1 -fondling 1 -fond 1 -fondu/2 1 -fondue/1 1 -fondu 1 -font/1 1 -fontanel/1 1 -fontanelle/1 1 -foobar -foobars -food/1 1 -foodie/1 1 -foodstuff/1 1 -fool/23 1 -foolery/15 1 -foolhardy/50 1 -fooling 1 -foolish/21 1 -foolproof 1 -foolscap/2 1 -fool 1 -Foosball/3 -foot/273 548 -footage/2 1 -football/1 1 -footballer/1 1 -footballing -footbridge/1 1 -footed 1 -footer/10 1 -footfall/1 1 -foothill/1 1 -foothold/1 1 -footie 1 -footing/1 1 -footless 1 -footlights -footlights's -footling/1 1 -footlocker/1 1 -footloose 1 -footman/2 549 -footmarks -footmen 550 -footnote/28 1 -footpads -footpath/1 1 -footplate/10 1 -footprint/1 1 -footrace/1 1 -footrest/1 1 -footsie/1 1 -footslogging -foo 1 -footsore 1 -footstep/1 1 -footstool/1 1 -footwear/2 1 -footwork/2 1 -footy 1 -fop/18 1 -foppery/2 1 -foppish/33 1 -forage/28 1 -forager/1 1 -fora 551 -foray/23 1 -forbade 552 -forbear/86 553 -forbearance/2 1 -forbearing 1 -Forbes -forbid/298 554 -forbidden 1 -forbidding/191 1 -forbore 555 -forborne 555 -force/28 1 -forced 1 -forceful/16 1 -forceps/2 1 -forcible/19 1 -ford/1 1 -Ford/2 1 -ford/11 1 -fordable 1 -fore/299 1 -forearm/23 1 -forebear/18 1 -forebode/6 1 -foreboding/1 1 -forecast/86 1 -forecaster/1 1 -forecastle/1 1 -foreclose/6 1 -foreclosure/1 1 -forecourt/1 1 -foredeck 1 -foredoom/11 1 -forefather/1 1 -forefeet 556 -forefinger/1 1 -forefoot/2 557 -forefront/1 1 -foregather/11 1 -foregoing 1 -foregone 1 -foreground/23 1 -forehand/1 1 -forehead/1 1 -foreign/300 1 -foreigner/1 1 -foreknew 558 -foreknow/301 559 -foreknowledge/2 1 -foreleg/1 1 -forelimb/1 1 -forelock/18 1 -Foreman/3 -foreman/2 560 -foremast/1 1 -foremen 561 -foremost -forename/1 1 -forenamed -forenoon/1 1 -forensic/69 1 -foreordain/11 1 -forepart/1 1 -forepaws -foreperson/1 1 -foreplay/2 1 -forequarter/1 1 -forerunner/1 1 -foresail/1 1 -foresaw 562 -foresee/301 563 -foreseeability 1 -foreseeable -foreseer/1 1 -foreshadow/11 1 -foreshadowing 1 -foreshore/10 1 -foreshorten/11 1 -foreshortening 1 -foresight/2 1 -foresighted/33 1 -foreskin/1 1 -Forest/3 -forest/23 1 -forestall/11 1 -forestalling 1 -forestation/2 1 -forester/1 1 -Forester 1 -forestland/2 1 -forestry/2 1 -foreswear/121 564 -foreswore 565 -foresworn 565 -foretaste/28 1 -foretell/121 566 -forethought/2 567 -foretold 568 -forever/2 1 -forevermore -forewarn/11 1 -forewarning 1 -forewent 569 -forewoman/2 570 -forewomen 571 -foreword/1 1 -forfeit/23 1 -forfeiture/1 1 -forgather/11 1 -forgave 572 -forge/28 1 -forger/1 1 -forgery/15 1 -forget/88 573 -forgetful/16 1 -forgettable -forgetting 1 -forging/1 1 -forgivable 1 -forgive/76 574 -forgiveness/3 -forgiver/1 1 -forgiving 1 -forgo/302 575 -forgoer/1 1 -forgot 576 -forgotten 576 -fork/23 1 -forked 1 -forkful/1 1 -forklift/18 1 -forlorn/303 1 -form/23 1 -formal/30 1 -formaldehyde/2 1 -formalin 1 -formalism/1 1 -formalist/1 1 -formalistic -formality/15 1 -formalization/1 1 -formalize/6 1 -formant 1 -format/109 1 -formation/1 1 -formative 1 -formatting's -former/30 1 -formfitting -Formica/1 1 -formic 1 -formidable/19 1 -forming 1 -formless/16 1 -Formosa/2 1 -Formosan/2 1 -formula/1 1 -formulaic 1 -formulate/6 1 -formulation/1 1 -formulator/1 1 -fornicate/6 1 -fornication/2 1 -fornicator/1 1 -Forrest -forsake/76 577 -forsaken 1 -forsaking 1 -forsook 578 -forsooth 1 -Forster -forswear/121 579 -forswore 580 -forsworn 580 -forsythia/1 1 -fort/18 1 -Fortaleza -forte/1 1 -fortes 581 -forte 1 -forthcoming/2 1 -forthright/16 1 -forth 1 -forthwith 1 -fortieth/1 1 -fortification/1 1 -fortifier/1 1 -fortify/31 1 -fortifying 1 -fortissimo 1 -fortitude/2 1 -fortnight/1 1 -fortnightly 1 -FORTRAN/2 1 -fortress/40 1 -for 1 -fortuitous/16 1 -fortuity/2 1 -fortunate/8 1 -fortune/18 1 -fortuneteller/1 1 -fortunetelling/2 1 -forty/15 1 -forum/1 582 -forward/52 1 -forwarder/1 1 -forwarding 1 -forwent 583 -Fosse/3 -fossil/1 1 -fossiliferous -fossilization/2 1 -fossilize/6 1 -Foster -foster/11 1 -fostering 1 -foster 1 -Fotomat/3 -Foucault -fought 584 -foul/52 1 -foulard/2 1 -fouler 1 -fouling 1 -foulmouthed -found/5 1 -foundation/1 1 -foundational 1 -founder/23 1 -founding 1 -foundling/1 1 -foundry/15 1 -found 585 -fount/1 1 -fountain/18 1 -fountainhead/1 1 -four/1 1 -fourfold 1 -Fourier -Fourneyron/3 -fourpence 1 -fourpenny 1 -fourposter/1 1 -fourscore/2 1 -foursome/1 1 -foursquare 1 -fourteen/1 1 -fourteenth/1 1 -fourteen 1 -fourth/30 1 -Fourth 1 -four 1 -fowl/23 1 -Fowler -fowling 1 -fox/4 1 -Fox/4 1 -fox/7 1 -foxfire/2 1 -foxglove/1 1 -foxhole/1 1 -foxhound/1 1 -foxhunt/141 1 -foxhunting 1 -foxing 1 -foxtrot/109 1 -foxy/50 1 -foyer/1 1 -FPO -fps -fr -Fr/2 1 -fracas/4 1 -fractal/1 1 -fraction/18 1 -fractional/8 1 -fractionate/251 1 -fractionation 1 -fractious/16 1 -fracture/28 1 -frag/58 1 -fragile/150 1 -fragility/2 1 -fragment/23 1 -fragmentary/2 1 -fragmentation/2 1 -Fragonard -fragrance/1 1 -fragrant/8 1 -frail/21 1 -frailty/15 1 -frame/28 1 -framer/1 1 -framework/1 1 -framing 1 -Fran/3 -franc/1 1 -France/1 1 -Francesca -Frances 586 -franchise/28 1 -franchisee/1 1 -franchiser/1 1 -franchisor/1 1 -Francine/3 -Francisca/3 -Franciscan/1 1 -Francisco/3 -Francis 587 -francium/2 1 -Franck -Franco -Francois/3 -Francoise/3 -francophone 1 -frangibility/2 1 -frangible 1 -Franglais -frank/38 1 -Frank/1 1 -frank/11 1 -Frankel/3 -Frankenstein 1 -franker 1 -Frankfort/2 1 -Frankfurt/2 1 -Frankfurter -frankfurter/1 1 -Frankie/3 -frankincense/2 1 -Frankish -Franklin -frantic/39 1 -Franz/3 -Franny/3 -frappe/18 1 -Fraser -frat/1 1 -fraternal/8 1 -fraternity/15 1 -fraternization/2 1 -fraternize/6 1 -fraternizer/1 1 -fratricidal -fratricide/1 1 -Frau/2 1 -fraud/1 1 -fraudster/10 1 -fraudulence/2 1 -fraudulent/8 1 -Frauen -fraught 1 -Fraulein 1 -fray/23 1 -fraying 1 -Frazier/3 -frazzle/28 1 -freak/23 1 -freakish/16 1 -freakout/1 1 -freaky/34 1 -freckle/28 1 -freckling 1 -freckly/34 1 -Fred/3 -Freda/3 -Freddie/3 -Freddy/3 -Frederic/3 -Frederick -Fredericton/2 1 -Fredric/3 -Fredrick/3 -free/304 1 -freebase/28 1 -freebee/1 1 -freebie/1 1 -freebooter/1 1 -freeborn 1 -freedman/2 588 -freedmen 589 -freedom/1 1 -freehand 1 -freehold/1 1 -freeholder/1 1 -freelance/139 1 -freelancer/1 1 -freeload/11 1 -freeloader/1 1 -freeloading 1 -Freeman/3 -freeman/2 590 -Freemason/1 1 -Freemasonry/15 1 -freemasonry 1 -freemen 591 -freephone -freer 1 -freesia/10 1 -freestanding -freestone/1 1 -freestyle/1 1 -freethinker/1 1 -freethinking/2 1 -Freetown/2 1 -freeware/1 1 -freeway/1 1 -freewheel/5 1 -freewill 1 -freezable 1 -freeze/73 592 -freezer/1 1 -freezing/2 1 -Freida/3 -freight/23 1 -freighter/1 1 -Fremont -French/40 1 -Frenchman/2 593 -Frenchmen 594 -French 1 -french 1 -Frenchwoman/2 595 -Frenchwomen 596 -frenetic/39 1 -frenzied/8 1 -frenzy/148 1 -freon -freons -Freon 1 -freq -frequency/15 1 -frequent/305 1 -frequenter/1 1 -fresco/40 1 -fresh/21 1 -freshen/11 1 -freshener/1 1 -fresher/10 1 -freshet/1 1 -freshman/2 597 -freshmen 598 -fresh 1 -freshwater/2 1 -Fresnel/3 -Fresno/2 1 -fret/109 1 -fretboard -fretful/16 1 -fretsaw/1 1 -fretwork/2 1 -Freud/2 1 -Freudian 1 -Frey/2 1 -Freya/2 1 -Fri/2 1 -friable 1 -friar/1 1 -friary/15 1 -fricassee/63 1 -fricative/1 1 -friction/1 1 -frictional 1 -frictionless 1 -Friday/1 1 -fridge/1 1 -Frieda/3 -Friedan -friedcake/1 1 -Friedman -friend/1 1 -Friend/1 1 -friend/58 1 -friendless/153 1 -friendlies -friendlily -friendly/49 1 -friendly's -friendship/1 1 -frier/1 1 -frieze/18 1 -frig/117 1 -frigate/1 1 -Frigga/2 1 -frigging 1 -fright/23 1 -frighten/11 1 -frightened 1 -frighteners -frightening/8 1 -frightful/16 1 -frigid/16 1 -Frigidaire 1 -frigidity/2 1 -frill/62 1 -frilly/34 1 -fringe/28 1 -frippery/15 1 -Frisbee 1 -Frisco -Frisian/1 1 -frisk/5 1 -frisking 1 -frisky/50 1 -frisson/10 1 -Frito/3 -fritter/23 1 -Fritz/3 -fritz/2 1 -frivolity/15 1 -frivolous/16 1 -friz/306 1 -frizz/22 1 -frizzle/28 1 -frizzling 1 -frizzly/34 1 -frizzy/34 1 -Frobisher -frock/18 1 -frog/307 1 -frogging/11 1 -frogman/2 599 -frogmarch/7 1 -frogmen 600 -frogspawn -Froissart -frolic/64 1 -frolicker/1 1 -frolic 1 -frolicsome 1 -from -Fromm -frond/1 1 -Fronde -front/23 1 -frontage/1 1 -frontal/8 1 -frontbench/89 1 -frontbencher/10 1 -Frontenac/3 -frontier/1 1 -frontiersman/2 601 -frontiersmen 602 -frontierswoman 603 -frontierswomen 604 -frontier 1 -frontispiece/1 1 -frontrunner/1 1 -front 1 -frontward/10 1 -frosh/2 1 -frost/1 1 -Frost/2 1 -frost/11 1 -Frostbelt -frostbite/134 1 -frostbiting 1 -frosted 1 -frosting/2 1 -frosty/50 1 -froth/23 1 -frothy/49 1 -fro 1 -froufrou/2 1 -froward/33 1 -frown/23 1 -frowning/8 1 -frowsty 1 -frowsy/34 1 -frowzy/50 1 -frozen 605 -froze 605 -fructify/31 1 -fructose/2 1 -frugal/8 1 -frugality/2 1 -fruit/23 1 -fruitcake/1 1 -fruiterer/10 1 -fruitful/85 1 -fruiting 1 -fruition/2 1 -fruitless/16 1 -fruity/49 1 -frump/1 1 -frumpish 1 -frumpy/34 1 -Frunze/2 1 -frustrate/6 1 -frustratedly -frustrate 1 -frustratingly -frustration/1 1 -frustum/1 1 -Fry -fry/56 1 -Frye/3 -fryer/1 1 -frying 1 -FSLIC -FTC -ftp/141 1 -ftper/10 1 -ft 1 -Fuchs/3 -fuchsia/1 1 -fuck/308 1 -fucker/80 1 -fuckhead/189 1 -fucking/309 1 -FUD/10 1 -fuddle/28 1 -fudge/28 1 -fuehrer/1 1 -fuel/23 1 -Fuentes -fugal 1 -Fugger -fugitive/1 1 -fug 1 -fugue/18 1 -fuggy 1 -fuhrer/1 1 -Fuji/2 1 -Fujitsu/3 -Fujiwara/3 -Fujiyama/2 1 -Fukuoka/2 1 -Fulani/2 1 -Fulbright 1 -fulcrum/18 1 -fulfill/11 1 -fulfilling 1 -fulfillment/2 1 -full/165 1 -fullback/18 1 -Fuller -fuller/18 1 -Fullerton -fullish -fullstops -fulminate/43 1 -fulmination/1 1 -fulness/3 -fulsome/16 1 -Fulton/2 1 -fully 1 -fum/58 1 -fumarole/10 1 -fumble/28 1 -fumbler/1 1 -fumbling/8 1 -fume/28 1 -fumigant/1 1 -fumigate/6 1 -fumigation/2 1 -fumigator/1 1 -fumingly -fumy/34 1 -fun/310 1 -Funafuti -function/23 1 -functional/8 1 -functionalism 1 -functionalist/10 1 -functionality 1 -functional 1 -functionary/15 1 -functionless 1 -fund/23 1 -fundamental/30 1 -fundamentalism/2 1 -fundamentalist/1 1 -fundholders -fundholding -funding/2 1 -fundraiser/1 1 -Fundy -funeral/1 1 -funerary -funereal/8 1 -funfair/10 1 -fungal 1 -fungible/1 1 -fungicidal 1 -fungicide/1 1 -fungi 606 -fungoid 1 -fungous 1 -fungus/2 607 -funicular/1 1 -funk/23 1 -funkiness/3 -funky/34 1 -funnel/23 1 -fun 1 -funny/221 1 -funnyman/2 608 -funnymen 609 -fur/103 1 -furbelow/2 1 -furbish/7 1 -Furies/2 1 -furious/8 1 -furl/23 1 -furling 1 -furlong/1 1 -furlough/23 1 -furn -furnace/18 1 -furnish/7 1 -furnishing/32 1 -furniture/2 1 -furor/1 1 -furore/1 1 -furrier/1 1 -furring/2 1 -furrow/23 1 -furry/49 1 -further/11 1 -furtherance/2 1 -furthermore -furthermost -further 610 -furthest 610 -furtive/16 1 -fur 1 -Furtwangler/3 -fury/15 1 -furze/2 1 -fuse/28 1 -fusee/1 1 -fuselage/1 1 -Fushun -fusibility/2 1 -fusible 1 -fusileer/1 1 -fusilier/1 1 -fusillade/18 1 -fusion/1 1 -fuss/22 1 -fussbudget/1 1 -fusspot/1 1 -fussy/50 1 -fustian/2 1 -fusty/49 1 -fut -futile/8 1 -futility/2 1 -futon/1 1 -future/1 1 -futurism/2 1 -futurist/1 1 -futuristic 1 -futurity/15 1 -futurologist/1 1 -futurology/2 1 -futz/7 1 -fuze/28 1 -Fuzhou/3 -fuzz/22 1 -fuzzball/10 1 -Fuzzbuster -fuzzy/50 1 -fwd -FWD -fwy -FY -FYI -G/2 1 -g/10 1 -GA -Ga/2 1 -gab/136 1 -gabardine/1 1 -gabbiness/3 -gabble/28 1 -gabbling 1 -gabby/34 1 -gaberdine/1 1 -gabfest/1 1 -Gable -gable/77 1 -Gabon/2 1 -Gabonese/2 1 -Gaborone/2 1 -Gabriel -Gabriela/3 -Gabrielle/3 -Gacrux/3 -gad/311 1 -gadabout/1 1 -Gaddafi -gadder/1 1 -gadflies -gadfly/3 -gadget/1 1 -gadgetry/2 1 -gadolinium/2 1 -Gadsden/3 -Gaea/2 1 -Gael/1 1 -Gaelic/2 1 -gaff/23 1 -gaffe/28 1 -gaffer/1 1 -gaffing 1 -gag/92 1 -Gagarin -gaga 1 -Gage -gaggle/18 1 -gaiety/2 1 -Gail/3 -Gaiman/3 -gain/23 1 -gainer/1 1 -Gaines/3 -gainful/8 1 -gaining 1 -gainsay/312 1 -gainsayer/1 1 -gainsaying 1 -Gainsborough/2 1 -gait/18 1 -gaiter/1 1 -gal/213 1 -gala/1 1 -galactic -Galahad/1 1 -Galapagos/2 1 -Galatea -Galatia -Galatians -gala 1 -Galaxy -galaxy/15 1 -Galbraith -Gale/3 -gale/1 1 -Galen -galena/2 1 -Galibi 1 -Galilean/1 1 -Galilee -Galileo/2 1 -Gall/3 -gall/23 1 -Gallagher/3 -gallant/164 1 -gallantry/15 1 -gallbladder/1 1 -Gallegos/3 -galleon/1 1 -galleria/1 1 -gallery/148 1 -galley/1 1 -Gallicism/1 1 -Gallic 1 -gallimaufry/15 1 -galling 1 -gallium/2 1 -gallivant/11 1 -Gallo/3 -gallon/1 1 -gallop/23 1 -Galloway/2 1 -gallows/2 1 -gallstone/1 1 -Gallup -Galois/3 -galoot/1 1 -galore 1 -galosh/40 1 -galoshe/18 1 -Galsworthy -galumph/11 1 -Galvani -galvanic 1 -galvanism/2 1 -galvanization/2 1 -galvanize/6 1 -galvanometer/1 1 -galvanometric -Galveston/3 -Gama -Gamay 1 -Gambia/2 1 -Gambian/1 1 -gambit/1 1 -Gamble/3 -gamble/28 1 -gambler/1 1 -gambling/2 1 -gambol/23 1 -gamboling 1 -game/107 1 -gamecock/1 1 -gamekeeper/1 1 -gamer/10 1 -gamesmanship/2 1 -gamesmen 611 -gamester/1 1 -gamete/1 1 -gametic 1 -gamey 612 -gamier 613 -gamiest 613 -gamin/1 1 -gamine/1 1 -gamines 1 -gaming/2 1 -gamma/1 1 -gamma's 614 -gamma 615 -gammon/2 616 -gammy 1 -Gamow/3 -gamut/1 1 -gamy/49 1 -gander/18 1 -Gandhi/2 1 -Gandhian 1 -Ganesha/2 1 -gang/23 1 -gangbusters -gangbusters's -Ganges/2 1 -ganging 1 -gangland/2 1 -ganglia 617 -gangling 1 -ganglion/2 618 -ganglionic -gangly/34 1 -gangplank/1 1 -gangrene/28 1 -gangrenous -gangsta/10 1 -gangster/1 1 -gangsterism 1 -Gangtok/3 -gangway/1 1 -ganja 1 -gannet/1 1 -gantlet/18 1 -Gantry/3 -gantry/15 1 -Ganymede/2 1 -GAO -gaolbird/10 1 -gaolbreak/10 1 -Gap/3 -gap/18 1 -gape/28 1 -gaping/8 1 -gar/18 1 -garage/28 1 -garaging 1 -garb/23 1 -garbage/2 1 -garbageman 1 -garbanzo/1 1 -garble/43 1 -garbling 1 -Garbo -Garcia/3 -garcon/1 1 -garden/23 1 -gardener/1 1 -gardenia/1 1 -gardening/2 1 -Gardner/3 -Gareth/3 -Garfield/2 1 -garfish/4 1 -Garfunkel/3 -Gargantua -gargantuan -gargle/28 1 -gargoyle/1 1 -Garibaldi/2 1 -garish/16 1 -Garland -garland/23 1 -garlic/2 1 -garlicky 1 -garlic 1 -garment/18 1 -Garner -garner/5 1 -garnet/1 1 -garnish/22 1 -garnishee/63 1 -garnishing 1 -garnishment/1 1 -garote/28 1 -garotte/28 1 -garotting 1 -garret/1 1 -Garrett/3 -Garrick -Garrison -garrison/23 1 -garrote/28 1 -garroter/1 1 -garrotte/28 1 -garrotting 1 -garrulity/2 1 -garrulous/16 1 -Garry/3 -garter/18 1 -Garth/3 -Garvey -Gary -Garza/3 -gas/252 1 -gasbag/1 1 -Gascony/2 1 -gaseous 1 -gash/22 1 -gasholder/10 1 -gash 1 -gasket/1 1 -gaslight/1 1 -gasman 619 -gasmen 620 -gasohol/2 1 -gasolene/2 1 -gasoline/2 1 -gasometer/10 1 -gasp/23 1 -gasping 1 -Gasser -gassing 1 -gassy/34 1 -gastric 1 -gastritis/2 1 -gastroenteritis/2 1 -gastrointestinal -gastronome/10 1 -gastronomic -gastronomical/8 1 -gastronomy/2 1 -gastropod/1 1 -gasworks/2 1 -gate/28 1 -gateau/313 1 -gatecrash/7 1 -gatecrasher/1 1 -gatehouse/1 1 -gatekeeper/1 1 -gatepost/1 1 -Gates -gateway/1 1 -gather/23 1 -gatherer/1 1 -gathering/1 1 -gating 1 -Gatling/3 -gator/1 1 -Gatorade/3 -Gatsby/3 -GATT/2 1 -Gatun/3 -gauche/27 1 -gaucherie/2 1 -gaucho/1 1 -gaudy/50 1 -gauge/28 1 -gauging 1 -Gauguin/2 1 -Gaul/1 1 -Gaulish -gaunt/21 1 -gauntlet/18 1 -gaunt 1 -Gauss/2 1 -Gaussian 1 -Gautama/2 1 -Gautier -gauze/2 1 -gauzy/49 1 -gavel/18 1 -gave 621 -Gavin/3 -gavotte/18 1 -Gawain/2 1 -gawd -gawk/5 1 -gawky/50 1 -gawp/11 1 -Gay -gay/314 1 -gayety/2 1 -Gayle/3 -Gaza -gaze/28 1 -gazebo/1 1 -gazelle/1 1 -gazer/1 1 -gazette/28 1 -gazetteer/18 1 -Gaziantep -gazillion/10 1 -gazpacho/2 1 -gazump/11 1 -GB/2 1 -Gd/2 1 -Gdansk/2 1 -GDP/2 1 -GE/3 -Ge/2 1 -gear/23 1 -gearbox/4 1 -gearing/2 1 -gearshift/1 1 -gearstick 1 -gearwheel/1 1 -gecko/1 1 -GED -geddit -gee/315 1 -geegaw/1 1 -geek/1 1 -geeky/34 1 -Geer/3 -geese 622 -geez -geezer/1 1 -Geffen/3 -Gehenna/2 1 -Gehrig -Geiger/2 1 -geisha/2 1 -gel/213 1 -gelatin/2 1 -gelatine/2 1 -gelatinous 1 -Gelbvieh/3 -gelcap/2 1 -geld/5 1 -gelding/1 1 -gelid 1 -gelignite/2 1 -Geller/3 -gelling 1 -gem/18 1 -Gemini/1 1 -gemmology/2 1 -gemological -gemologist/1 1 -gemology/2 1 -gemstone/1 1 -Gen -gen/10 1 -Gena/3 -Genaro/3 -gendarme/1 1 -gender/62 1 -genderless 1 -Gene/3 -gene/1 1 -genealogical/8 1 -genealogist/1 1 -genealogy/15 1 -general/164 1 -generalissimo/1 1 -generalist/1 1 -generality/15 1 -generalizable -generalization/1 1 -generalize/6 1 -generalship/2 1 -genera 623 -generate/6 1 -generation/1 1 -generational -generative 1 -generator/1 1 -generic/51 1 -generosity/15 1 -generous/16 1 -genes/89 1 -geneses 624 -Genesis/2 1 -genesis/2 625 -Genet/3 -genetic/32 1 -genetically -geneticist/1 1 -Geneva/2 1 -Genevieve/3 -Genghis/3 -genial/8 1 -geniality/2 1 -genie/1 1 -genii 626 -genital/32 1 -genitalia/2 1 -genitally -genitive/1 1 -genitourinary -genius/4 627 -genned -genning -Genoa/1 1 -genocidal -genocide/1 1 -genome/1 1 -genomic 1 -genotype/10 1 -genre/1 1 -gent/1 1 -genteel/21 1 -gentian/1 1 -gentile/1 1 -Gentile/1 1 -gentiles 1 -gentile 1 -gentility/2 1 -gentle/316 1 -gentlefolk/130 1 -gentleman/2 628 -gentlemanly 1 -gentlemen 629 -gentlewoman/2 630 -gentlewomen 631 -gentling 1 -Gentoo 1 -gentrification/2 1 -gentrify/31 1 -Gentry/3 -gentry/15 1 -genuflect/11 1 -genuflection/1 1 -genuine/16 1 -genus/2 632 -Geo/3 -geocentric/39 1 -geochemical -geochemistry/2 1 -geode/1 1 -geodesic/1 1 -geodesy/2 1 -geodetic 1 -Geoffrey/3 -geog -geographer/1 1 -geographical/8 1 -geographic 1 -geography/15 1 -geologic -geological/8 1 -geologist/1 1 -geology/15 1 -geom -geomagnetic -geomagnetically -geomagnetism/2 1 -geometer/10 1 -geometrical/8 1 -geometric 1 -geometry/15 1 -geomorphology 1 -geophysical 1 -geophysicist/1 1 -geophysics/2 1 -geopolitical 1 -geopolitics/2 1 -George/1 1 -Georgetown/2 1 -Georgette -Georgia/2 1 -Georgian/1 1 -Georgina/3 -geoscientific -geostationary -geosynchronous -geosyncline/1 1 -geothermal -geothermic -Ger -Gerald/3 -Geraldine/3 -geranium/1 1 -Gerard/3 -Gerardo/3 -Gerber/3 -gerbil/1 1 -geriatric/32 1 -geriatrician/10 1 -Geritol/3 -germ/1 1 -German/1 1 -germane 1 -Germanic/2 1 -germanium/2 1 -German 1 -Germany/2 1 -germicidal -germicide/1 1 -germinal/2 1 -germinate/6 1 -germination/2 1 -Geronimo -gerontocracy 1 -gerontological -gerontologist/1 1 -gerontology/2 1 -Gerry/3 -gerrymander/23 1 -gerrymandering's -Gershwin -Gertrude/3 -gerund/1 1 -gerundive 1 -gestalt/10 1 -gestapo/1 1 -Gestapo/1 1 -gestate/6 1 -gestation/2 1 -gestational -gesticulate/6 1 -gesticulation/1 1 -gestural -gesture/28 1 -gesundheit -get/128 633 -getaway/1 1 -Gethsemane 1 -gettable 1 -getter 1 -getting 1 -getup/2 1 -Getty -Gettysburg/2 1 -gewgaw/1 1 -Gewurztraminer 1 -geyser/18 1 -Ghana/2 1 -Ghanaian 1 -Ghanian/1 1 -ghastlier -ghastliest -ghastly/140 1 -ghat/1 1 -Ghats -Ghazvanid/3 -ghee 1 -Ghent -gherkin/1 1 -ghetto/18 1 -ghettoize/6 1 -Ghibelline 1 -ghost/23 1 -ghosting 1 -ghostlike 1 -ghostly/49 1 -ghostwrite/317 634 -ghostwriter/1 1 -ghostwrote 635 -ghoul/1 1 -ghoulish/16 1 -GHQ/2 1 -GHz 1 -GI -Giacometti -Giannini/3 -giant/1 1 -giantess/4 1 -giantkiller -giant 1 -Giauque/3 -gibber/5 1 -gibberish/2 1 -gibbet/23 1 -Gibbon -gibbon/1 1 -gibbous 1 -Gibbs -gibe/28 1 -giblet/1 1 -Gibraltar/1 1 -Gibson 1 -giddy/50 1 -Gide -Gideon 1 -Gielgud -Gienah/3 -gift/23 1 -gifted 1 -gig/92 1 -gigabyte/1 1 -gigahertz/2 1 -gigantic/39 1 -gigavolt -giggle/28 1 -giggler/1 1 -giggling 1 -giggly/34 1 -GIGO -gigolo/1 1 -Gil/4 1 -Gila/2 1 -Gilbert/2 1 -Gilberto/3 -Gilchrist/3 -gild/318 1 -Gilda/3 -gilder/1 1 -gilding/2 1 -Gilead -Gilgamesh -gill/18 1 -Gillespie -Gillette/3 -Gilliam/3 -Gillian/3 -gillie/70 1 -Gilligan/3 -gillion/10 1 -Gill 1 -Gilmore/3 -gilt/1 1 -gimbals -gimbals's -gimcrack/1 1 -gimcrackery/2 1 -gimcrack 1 -gimlet/23 1 -gimme/1 1 -gimmick/18 1 -gimmickry/2 1 -gimmicky 1 -gimp/23 1 -gimpy/34 1 -gin/133 1 -Gina/3 -Ginger/3 -ginger/210 1 -gingerbread/2 1 -gingerly 1 -gingersnap/1 1 -gingery 1 -gingham/2 1 -gingivitis/2 1 -gingko/2 1 -Gingrich/3 -ginkgo/4 1 -ginning 1 -Gino/3 -ginormous -Ginsberg -Ginsburg/3 -ginseng/2 1 -Ginsu/3 -Ginny/3 -Giorgione -Giotto -Giovanni/3 -gipsy/15 1 -Gipsy/15 1 -gipsy/258 1 -giraffe/1 1 -Giraudoux -gird/319 1 -girder/1 1 -girding 1 -girdle/28 1 -girdling 1 -girl/1 1 -girlfriend/1 1 -girlhood/1 1 -girlie/10 1 -girlish/16 1 -girly 1 -giro/10 1 -girt/11 1 -girth/18 1 -girt's -Giselle/3 -Gish -gismo/1 1 -gist/2 1 -git/10 1 -gite/10 1 -Giuliani/3 -Giuseppe/3 -give/263 636 -giveaway/1 1 -giveback/1 1 -given/1 1 -giver/1 1 -giving/10 1 -Giza/2 1 -gizmo/1 1 -gizzard/1 1 -Gk -glace/11 1 -glaces 637 -glace 1 -glacial/8 1 -glaciate/6 1 -glaciation/1 1 -glacier/1 1 -glaciological -glaciologist/10 1 -glaciology 1 -glad/320 1 -gladden/11 1 -glade/1 1 -gladiator/1 1 -gladiatorial -gladiola/1 1 -gladioli 638 -gladiolus/2 639 -gladsome/150 1 -Gladstone/1 1 -Gladys -glamor/1 1 -glamored -glamoring -glamorization/2 1 -glamorize/6 1 -glamorous/8 1 -glamor 1 -glamourize/6 1 -glam 1 -glance/28 1 -glancing 1 -gland/71 1 -glandular 1 -glans/321 1 -glare/28 1 -glaring/8 1 -Glaser -Glasgow/2 1 -glasnost/2 1 -Glass/3 -glass/22 1 -glassblower/1 1 -glassblowing/2 1 -glassful/1 1 -glasshouse/10 1 -glassless 1 -glass 1 -glassware/2 1 -glassy/50 1 -Glastonbury/3 -Glaswegian/1 1 -glaucoma/2 1 -Glaxo/3 -glaze/28 1 -glazier/1 1 -glazing/2 1 -gleam/23 1 -gleaming/10 1 -glean/11 1 -gleaner/1 1 -gleaning/32 1 -Gleason/3 -glee/2 1 -gleeful/16 1 -glee 1 -Glen/3 -glen/1 1 -Glenda/3 -Glendale -Glenlivet/3 -Glenn/2 1 -Glenna/3 -glib/322 1 -glide/28 1 -glider/1 1 -gliding/2 1 -glimmer/23 1 -glimmering/1 1 -glimpse/28 1 -glint/23 1 -glissando/323 1 -glisten/23 1 -glistening 1 -glister/5 1 -glistering 1 -glitch/22 1 -glitter/23 1 -glitterati -glittering 1 -glittery 1 -glitz/2 1 -glitzy/34 1 -GLSA/1 1 -gloaming/1 1 -gloat/23 1 -gloatingly 1 -glob/18 1 -global/8 1 -globalism/2 1 -globalist/1 1 -globalization/2 1 -globalize/6 1 -globe/28 1 -globetrotter/1 1 -globetrotting -globular 1 -globule/1 1 -globulin/2 1 -glockenspiel/1 1 -gloom/2 1 -gloomy/50 1 -glop/2 1 -gloppy/34 1 -glop 1 -Gloria 1 -glorification/2 1 -glorify/31 1 -glorious/8 1 -glory/56 1 -gloss/22 1 -glossary/15 1 -glossolalia/2 1 -glossy/221 1 -glottal 1 -glottis/4 1 -Gloucester -glove/28 1 -Glover/3 -glow/23 1 -glower/23 1 -glowering 1 -glowing/8 1 -glowworm/1 1 -glucose/2 1 -glue/28 1 -gluey 640 -gluier 641 -gluiest 641 -glum/324 1 -gluon 1 -glut/109 1 -glutamate 1 -gluten/2 1 -glutenous -glutinous/8 1 -glutton/1 1 -gluttonous/8 1 -gluttony/2 1 -glycerin/2 1 -glycerine's -glycerol/2 1 -glycine 1 -glycogen/2 1 -glycol 1 -glyph/10 1 -GM -GMAT -GMT/2 1 -gm 1 -gnarl/23 1 -gnarling 1 -gnarly/34 1 -gnash/22 1 -gnat/1 1 -gnaw/11 1 -gnawing 1 -gneiss/2 1 -gnocchi 1 -gnome/1 1 -gnomic 1 -gnomish 1 -Gnosticism/2 1 -gnosticism 1 -gnostic 1 -Gnostic 1 -gnostic 1 -Gnostic 1 -GNP/2 1 -gnu/1 1 -go/325 642 -Goa -goad/23 1 -goal/18 1 -goalie/1 1 -goalkeeper/1 1 -goalkeeping/2 1 -goalless 1 -goalmouth/10 1 -goalpost/1 1 -goalscorer/10 1 -goalscoring -goaltender/1 1 -goat/1 1 -goatee/1 1 -goatherd/1 1 -goatskin/1 1 -gob/136 1 -gobbet/1 1 -gobble/28 1 -gobbledegook/2 1 -gobbledygook/2 1 -gobbler/1 1 -Gobi/2 1 -goblet/1 1 -goblin/1 1 -gobsmacked -gobstopper/10 1 -god/1 1 -God/2 1 -god/58 1 -Godard -godawful -godchild/155 1 -goddammit -goddamn/195 1 -goddam 1 -Goddard -goddaughter/1 1 -goddess/4 1 -Godel/3 -godfather/18 1 -godforsaken -godhead/2 1 -Godhead/2 1 -godhood/2 1 -Godiva/2 1 -godless/16 1 -godlike 1 -godly/49 1 -godmother/1 1 -Godot/3 -godparent/1 1 -godsend/1 1 -godson/1 1 -Godspeed/1 1 -godspeed 1 -Godthaab -Godunov -Godzilla/3 -Goebbels -goer/1 1 -Goering -Goethals/3 -Goethe/2 1 -gofer/1 1 -Goff/3 -Gog -goggle/232 1 -Gogol -Goiania/3 -going/1 1 -goiter/1 1 -Golan/3 -Golconda 1 -gold/188 1 -Golda/3 -Goldberg/3 -goldbrick/23 1 -goldbricker/1 1 -Golden/3 -golden/166 1 -goldenrod/2 1 -goldfield/10 1 -goldfinch/4 1 -goldfish/4 1 -Goldie/3 -Goldilocks/3 -Golding -Goldman/3 -goldmine/1 1 -Goldsmith -goldsmith/1 1 -Goldwater/3 -Goldwyn -golf/23 1 -golfer/1 1 -golfing 1 -Golgi -Golgotha/2 1 -Goliath 1 -gollies -golliwog/10 1 -golly/3 -Gomez/3 -Gomorrah/2 1 -Gompers -Gomulka -gonad/1 1 -gonadal -gondola/1 1 -gondolier/1 1 -Gondwanaland/2 1 -goner/1 1 -gone 1 -gong/23 1 -gonk/11 1 -gonna -gonorrhea/2 1 -gonorrheal -Gonzales -Gonzalez/3 -Gonzalo/3 -gonzo -goo/2 1 -goober/1 1 -Good/3 -good/326 643 -Goodall/3 -goodby/1 1 -goodbye/1 1 -goodhearted -goodie/1 1 -goodish 1 -goodly 1 -Goodman -goodnight -Goodrich/3 -Goodwill/3 -goodwill/2 1 -Goodwin/3 -goody/15 1 -Goodyear -gooey 644 -goof/23 1 -goofball/1 1 -goofy/49 1 -Google/3 -googlies -googly -gooier 645 -gooiest 645 -gook/1 1 -Goolagong/3 -goon/1 1 -goop/2 1 -goose/28 646 -gooseberry/15 1 -goosebumps -goosebumps's -gooseflesh/2 1 -goosestep/10 1 -goosestepped -goosestepping -GOP/2 1 -Gopher -gopher/18 1 -Gorbachev -Gordian/3 -Gordimer -Gordon -Gore -gore/28 1 -Goren/3 -Gorey/3 -Gorgas -gorge/28 1 -gorged 1 -gorgeous/16 1 -gorgon/1 1 -Gorgon/2 1 -Gorgonzola 1 -gorilla/1 1 -goring 1 -Gorky/2 1 -gormandize/43 1 -gormandizer/1 1 -gormless 1 -gorp/1 1 -gorse/2 1 -gory/50 1 -goshawk/1 1 -gosh 1 -gosling/1 1 -gospel/1 1 -Gospel/1 1 -gospel/58 1 -gossamer/2 1 -gossip/23 1 -gossiper/1 1 -gossiping 1 -gossipy 1 -gotcha/10 1 -Goteborg/2 1 -Goth/1 1 -goth/10 1 -Gotham -Gothic/1 1 -got 647 -gotta -gotten 647 -gouache/10 1 -Gouda/1 1 -gouge/28 1 -gouger/1 1 -goulash/4 1 -Gould -Gounod -gourd/1 1 -gourde/1 1 -gourmand/1 1 -gourmet/1 1 -gout/2 1 -gouty/34 1 -govern/11 1 -governable 1 -governance/2 1 -governess/205 1 -governess's -government/1 1 -governmental 1 -Governor -governor/1 1 -governorship/1 1 -govt -gov 1 -gown/23 1 -Goya -GP/2 1 -GPA -GPO -gr -Gr -grab/327 1 -grabber/1 1 -grabby/34 1 -Grable/3 -Gracchus -Grace -grace/28 1 -graceful/85 1 -Graceland/3 -graceless/16 1 -Gracie/3 -Graciela/3 -gracious/16 1 -grackle/1 1 -grad/18 1 -gradable 1 -gradate/6 1 -gradation/1 1 -grade/139 1 -grader/1 1 -gradient/1 1 -gradings -gradual/16 1 -gradualism/2 1 -gradualist 1 -gradual 1 -graduand/10 1 -graduate/28 1 -graduation/1 1 -Grady/3 -Graffias/3 -graffito/323 1 -graft/23 1 -grafter/1 1 -grafting 1 -Grafton/3 -Graham -graham/10 1 -Grahame -graham 1 -grail/10 1 -Grail 1 -grain/62 1 -grained 1 -grainy/49 1 -gram/1 1 -grammar/1 1 -grammarian/1 1 -grammatical/8 1 -gramme/1 1 -Grammy 1 -gramophone/1 1 -Grampians -grampus/4 1 -gran/10 1 -Granada/2 1 -granary/15 1 -grand/38 1 -grandad/10 1 -grandaddy/60 1 -grandam/1 1 -grandaunt/1 1 -grandchild/155 1 -granddad/1 1 -granddaddy/15 1 -granddaughter/1 1 -grandee/1 1 -grandeur/2 1 -grandfather/23 1 -grandfatherly -grandiloquence/2 1 -grandiloquent 1 -grandiose/8 1 -grandiosity/2 1 -grandma/1 1 -grandmaster/10 1 -grandmother/1 1 -grandmotherly 1 -grandnephew/1 1 -grandniece/1 1 -grandpa/1 1 -grandparent/1 1 -grandson/1 1 -grandstand/23 1 -granduncle/1 1 -grange/1 1 -granite/1 1 -granitic -grannie/1 1 -granola/2 1 -grant/1 1 -Grant/2 1 -grant/11 1 -granted 1 -grantee/1 1 -granter/1 1 -grantor/1 1 -grantsmanship/2 1 -granularity/2 1 -granular 1 -granulate/6 1 -granulation/2 1 -granule/1 1 -granny/15 1 -grape/18 1 -grapefruit/1 1 -grapeshot/2 1 -grapevine/1 1 -graph/23 1 -graphic/1 1 -graphical/8 1 -graphic 1 -graphite/2 1 -graphologist/1 1 -graphology/2 1 -grapnel/1 1 -grapple/28 1 -grappling 1 -grasp/23 1 -graspable 1 -grasper 1 -grasping 1 -Grass -grass/22 1 -grasshopper/1 1 -grassing 1 -grassland/1 1 -grassroots -grassy/34 1 -grate/28 1 -grateful/85 1 -grater/1 1 -grates 648 -graticule 1 -gratification/1 1 -gratified 1 -gratify/31 1 -gratifying/8 1 -gratin/10 1 -grating/30 1 -gratis 649 -gratitude/2 1 -gratuitous/16 1 -gratuity/15 1 -gravamen/1 1 -grave/328 1 -gravedigger/1 1 -gravel/210 1 -graveling 1 -graver 1 -Graves -graveside/1 1 -gravestone/1 1 -graveyard/1 1 -gravid 1 -gravimeter/1 1 -graving 1 -gravitas 1 -gravitate/6 1 -gravitation/2 1 -gravitational/8 1 -graviton/10 1 -gravity/15 1 -gravy/15 1 -gray/165 1 -graybeard/1 1 -grayish 1 -Gray 1 -graze/28 1 -grazer/1 1 -grazing 1 -grease/28 1 -greasepaint/2 1 -greaseproof 1 -greaser/10 1 -greasy/50 1 -great/38 1 -greatcoat/1 1 -greathearted 1 -grebe/1 1 -Grecian 1 -Greece/2 1 -greed/2 1 -greedy/50 1 -Greek/1 1 -Greeley -green/38 1 -Green/1 1 -green/11 1 -greenback/1 1 -greenbelt/1 1 -Greene -greenery/2 1 -greenfield -greenflies -greenfly -greengage/1 1 -greengrocer/1 1 -greengrocery 1 -greenhorn/1 1 -greenhouse/1 1 -greening 1 -greenish 1 -Greenland/2 1 -Greenlandic -greenmail/2 1 -Greenpeace/3 -greenroom/1 1 -Greensboro/2 1 -Greensleeves/3 -Greenspan/3 -greensward/2 1 -Greenwich/2 1 -greenwood/2 1 -Greer/3 -greet/11 1 -greeter/1 1 -greeting/1 1 -Greg/3 -gregarious/16 1 -Gregg/3 -Gregorian -Gregorio/3 -Gregory/2 1 -gremlin/1 1 -Grenada/2 1 -grenade/1 1 -Grenadian/1 1 -grenadier/1 1 -grenadine/2 1 -Grenadines -Grendel -Grenoble -grep -grepped -grepping -greps -Gresham -Greta/3 -Gretchen/3 -Gretel/3 -Gretzky/3 -grew 650 -Grey -greybeard 1 -greyhound/1 1 -greyish 1 -greyness -gribble/10 1 -grid/329 1 -griddle/18 1 -griddlecake/1 1 -gridiron/18 1 -gridlock/62 1 -grief/123 1 -Grieg -grievance/1 1 -grieve/6 1 -griever/1 1 -grieving 1 -grievous/16 1 -Griffin/3 -griffin/1 1 -Griffith 1 -griffon/1 1 -grill/23 1 -grille/28 1 -grilling/10 1 -grim/324 1 -grimace/28 1 -grime/28 1 -Grimes 1 -Grimm/2 1 -grimy/49 1 -grin/133 1 -Grinch/3 -grind/86 651 -grinder/1 1 -grinding/10 1 -grindstone/1 1 -gringo/1 1 -grinner 1 -grip/47 1 -gripe/28 1 -griper/1 1 -grippe/330 1 -gripper/1 1 -gripping 1 -Gris -grisly/49 1 -grist/2 1 -gristle/2 1 -gristly/34 1 -gristmill/1 1 -grit/331 1 -gritter/1 1 -gritty/49 1 -grizzle/43 1 -grizzlies -grizzly/34 1 -grizzly's -groan/23 1 -groaner/10 1 -groaning 1 -groat/1 1 -grocer/1 1 -grocery/15 1 -grog/2 1 -groggy/50 1 -groin/18 1 -grok/332 1 -grommet/18 1 -Gromyko -groom/23 1 -groomer/1 1 -grooming/2 1 -groomsman/2 652 -groomsmen 653 -groove/28 1 -groovy/34 1 -grope/28 1 -groper/1 1 -groping/8 1 -gropings -Gropius/2 1 -grosbeak/1 1 -grosgrain/2 1 -Gross -gross/74 1 -grosser 1 -Grosz -grotesque/36 1 -Grotius -grotto/4 1 -grotty/34 1 -grouch/22 1 -grouchy/50 1 -ground/23 1 -groundbreaking/1 1 -groundcloth -groundcloths -grounder/1 1 -groundhog/1 1 -grounding/1 1 -groundless/8 1 -groundnut/1 1 -groundsheet/10 1 -groundskeeper/10 1 -groundsman 654 -groundsmen 655 -ground 656 -groundswell/1 1 -groundwater/2 1 -groundwork/2 1 -group/78 1 -grouper/1 1 -groupie/1 1 -grouping/1 1 -groupware/2 1 -grouse/139 1 -grouser/1 1 -grout/23 1 -grouting 1 -grove/1 1 -grovel/333 1 -groveler/1 1 -groveling 1 -grovelling 1 -Grover/3 -grow/301 657 -grower/1 1 -growing 1 -growl/23 1 -growler/1 1 -growling 1 -grownup/1 1 -growth/1 1 -groyne/10 1 -Grozny -grub/136 1 -grubber/1 1 -grubby/50 1 -grubstake/2 1 -grudge/28 1 -grudging/8 1 -grue/58 1 -gruel/334 1 -grueling/10 1 -gruelingly -gruesome/27 1 -gruff/21 1 -grumble/28 1 -grumbler/1 1 -grumbling/10 1 -Grumman/3 -grump/18 1 -grumpy/50 1 -Grundy 1 -Grunewald/3 -grunge/1 1 -grungy/34 1 -grunion/1 1 -grunt/23 1 -grunting 1 -Grus/2 1 -Gruyere/1 1 -gryphon/1 1 -GSA -gt -GTE/3 -GU -guacamole/2 1 -Guadalajara/2 1 -Guadalcanal/2 1 -Guadalquivir -Guadalupe/3 -Guadeloupe/2 1 -Guallatiri/2 1 -Guam/2 1 -Guamanian 1 -Guangzhou/2 1 -guanine/2 1 -guano/2 1 -Guantanamo/3 -guarani/1 1 -Guarani/2 1 -guarantee/63 1 -guarantor/1 1 -guaranty/56 1 -guard/23 1 -guarded/83 1 -guarder/1 1 -guardhouse/1 1 -guardian/1 1 -guardianship/2 1 -guardian 1 -guardrail/1 1 -guardroom/1 1 -guardsman/2 658 -guardsmen 659 -Guarnieri/2 1 -Guatemala/2 1 -Guatemalan/1 1 -guava/1 1 -Guayaquil/2 1 -gubernatorial -Gucci/3 -gudgeon 1 -Guelph 1 -guerillas -guerilla's -Guernsey/1 1 -Guerra/3 -Guerrero -guerrilla/1 1 -guess/22 1 -guessable -guesser/1 1 -guessing 1 -guesstimate/28 1 -guesswork/2 1 -guest/23 1 -guesthouse/10 1 -guestroom/10 1 -guest 1 -Guevara -guff/2 1 -guffaw/23 1 -Guggenheim -GUI/2 1 -Guiana/2 1 -guidance/2 1 -guide/28 1 -guidebook/1 1 -guideline/1 1 -guidepost/1 1 -guider/1 1 -guiding 1 -Guido -guild/1 1 -guilder/1 1 -guildhall/1 1 -guile/2 1 -guileful 1 -guileless/16 1 -guile 1 -guillemot/10 1 -Guillermo/3 -guillotine/28 1 -guilt/2 1 -guiltless 1 -guilty/50 1 -guinea/1 1 -Guinea/2 1 -Guinean/1 1 -Guinevere/2 1 -Guinness/3 -guise/18 1 -guitar/1 1 -guitarist/1 1 -Guiyang -Guizot -Gujarat/2 1 -Gujarati/2 1 -Gujranwala -gulag/1 1 -gulch/4 1 -gulden/1 1 -gulf/18 1 -gull/23 1 -Gullah 1 -gullet/18 1 -gulley/18 1 -gullibility/2 1 -gullible 1 -gulling 1 -Gulliver/2 1 -gulp/23 1 -gulper/1 1 -gully/258 1 -gully's -gum/160 1 -gumball/10 1 -Gumbel/3 -gumbo/1 1 -gumboil/1 1 -gumboot/10 1 -gumdrop/1 1 -gummy/34 1 -gumption/2 1 -gumshoe/63 1 -gumtree/10 1 -gun/133 1 -gunboat/1 1 -gunfight/18 1 -gunfighter/1 1 -gunfire/2 1 -gunge 1 -gungy -gunk/2 1 -gunky/34 1 -gunman/2 660 -gunmen 661 -gunmetal/2 1 -gunnel/1 1 -gunner/1 1 -gunnery/2 1 -gunning 1 -gunpoint/2 1 -gunpowder/2 1 -gunrunner/1 1 -gunrunning/2 1 -gunship/1 1 -gunshot/1 1 -gunslinger/1 1 -gunsmith/1 1 -Gunther -gunwale/1 1 -gunny/2 1 -gunnysack/1 1 -Guofeng/3 -guppy/15 1 -Gupta/3 -gurgle/28 1 -gurgling 1 -Gurkha/2 1 -gurney/1 1 -guru/1 1 -Gus/3 -gush/22 1 -gusher/1 1 -gushing/8 1 -gushy/34 1 -gusset/23 1 -gussy/31 1 -gussying 662 -gust/23 1 -gustatory -Gustav/3 -Gustavo/3 -Gustavus/3 -gusto/2 1 -gusty/59 1 -gut/109 1 -Gutenberg -Guthrie -Gutierrez/3 -gutless/33 1 -guts 1 -gutsy/34 1 -gutter/23 1 -guttering 1 -guttersnipe/1 1 -guttural/30 1 -gutty/34 1 -guv/10 1 -guvnor/10 1 -guy/1 1 -Guy/2 1 -guy/11 1 -Guyana/2 1 -Guyanese/2 1 -Guzman/3 -guzzle/6 1 -guzzler/1 1 -Gwalior -Gwen/3 -Gwendoline/3 -Gwendolyn/3 -Gwyn/2 1 -gym/1 1 -gymkhana/1 1 -gymnasium/1 1 -gymnast/1 1 -gymnastic/35 1 -gymnosperm/1 1 -gymslip/10 1 -gynecologic -gynecological -gynecologist/1 1 -gynecology/2 1 -gyp/47 1 -gypper/1 1 -gypster/1 1 -gypsum/2 1 -gypsy/15 1 -Gypsy/15 1 -gypsy/258 1 -Gypsy 1 -gyrate/6 1 -gyration/1 1 -gyrator/1 1 -gyrfalcon/1 1 -gyro/1 1 -gyromagnetic -gyroscope/1 1 -gyroscopic 1 -gyve/28 1 -h -H/2 1 -Ha -Haas/3 -Habakkuk -Haber/3 -haberdasher/1 1 -haberdashery/15 1 -habiliment/1 1 -habit/18 1 -habitability/2 1 -habitable 1 -habitat/1 1 -habitation/1 1 -habitual/16 1 -habituate/6 1 -habituation/2 1 -habitue/1 1 -hacienda/1 1 -hack/78 1 -hackable -hacker/1 1 -hacking/2 1 -hackish -hackishes -hackishness -hackishnesses -hackitude -hackitudes -hackle/18 1 -hackney/23 1 -hacksaw/18 1 -hackwork/2 1 -Hadar/3 -haddock/1 1 -Hades/2 1 -hadj/4 1 -hadjes 663 -hadji/1 1 -hadjis 664 -hadn't -Hadrian -hadron/10 1 -had 665 -hadst 665 -had 1 -haemoglobin's -haemophilia/2 1 -haemorrhage/28 1 -haemorrhoid/32 1 -Hafiz/3 -hafnium/2 1 -haft/18 1 -hag/18 1 -Hagar -Haggai -haggard/16 1 -haggis/4 1 -haggish 1 -haggle/28 1 -haggler/1 1 -Hagiographa/2 1 -hagiographer/1 1 -hagiography/15 1 -Hague -Hahn -hahnium/2 1 -hah 1 -Haida/1 1 -Haifa/2 1 -haiku/2 1 -hail/23 1 -hailstone/1 1 -hailstorm/1 1 -Haiphong -hair/1 1 -hairball/1 1 -hairband/10 1 -hairbreadth/1 1 -hairbrush/4 1 -haircare -haircloth/2 1 -haircut/18 1 -hairdo/1 1 -hairdresser/1 1 -hairdressing/2 1 -hairdrier/10 1 -hairdryer/1 1 -haired 1 -hairgrip/10 1 -hairless 1 -hairlike 1 -hairline/1 1 -hairnet/1 1 -hairpiece/1 1 -hairpin/1 1 -hairsbreadth/1 1 -hairsplitter/1 1 -hairsplitting/2 1 -hairspray/10 1 -hairspring/1 1 -hairstyle/1 1 -hairstyling 1 -hairstylist/1 1 -hairy/49 1 -Haiti/2 1 -Haitian/1 1 -hajj/4 1 -hajjes 666 -hajji/1 1 -hajjis 667 -haj 1 -hake/1 1 -Hakka/2 1 -Hakluyt -Hal/1 1 -halal/2 1 -halberd/1 1 -halcyon 1 -Haldane -Hale -hale/257 1 -Haleakala -haler 1 -Haley/3 -half/120 1 -halfback/1 1 -halfbreed -halfhearted/16 1 -halfpence 668 -halfpennies -halfpenny/2 669 -halfpennyworth 1 -halftime/1 1 -halftone/1 1 -half 1 -halfway 1 -halfwit/1 1 -halibut/1 1 -halide/10 1 -Halifax/2 1 -haling 1 -halite/2 1 -halitosis/2 1 -hall/1 1 -halleluiah/1 1 -hallelujah/1 1 -Halley -halliard/1 1 -Halliburton/3 -Hallie/3 -Hallmark/3 -hallmark/23 1 -hallo/2 1 -halloo/23 1 -hallo 1 -hallow/11 1 -hallowed 1 -Hallowe'en -Halloween/1 1 -Hallstatt -Hall 1 -hallucinate/6 1 -hallucination/1 1 -hallucinatory -hallucinogen/1 1 -hallucinogenic/1 1 -hallway/1 1 -halo/23 1 -halogen/1 1 -halogenated -Halon/3 -halon/10 1 -Halsey -halt/78 1 -halter/23 1 -halterneck -halternecks -halting/8 1 -halve/6 1 -halyard/1 1 -Ham/3 -ham/335 1 -Haman/2 1 -hamburg/1 1 -Hamburg/1 1 -hamburger/1 1 -Hamhung -Hamilcar/3 -Hamill/3 -Hamilton/2 1 -Hamiltonian 1 -Hamitic/2 1 -Hamlet -hamlet/1 1 -Hamlin/3 -Hammarskjold -hammer/23 1 -hammerer/1 1 -hammerhead/1 1 -hammering/10 1 -hammerlock/1 1 -Hammerstein -hammertoe/1 1 -Hammett/3 -hammock/1 1 -Hammond -Hammurabi -hammy/34 1 -hamper/23 1 -Hampshire/2 1 -Hampton -hamster/1 1 -hamstring/86 670 -hamstrung 671 -Hamsun -Han/10 1 -Hancock -hand/23 1 -handbag/18 1 -handball/1 1 -handbarrow/1 1 -handbasin 1 -handbill/1 1 -handbook/1 1 -handbrake/10 1 -handcar/1 1 -handcart/1 1 -handclasp/1 1 -handcraft/23 1 -handcuff/23 1 -handed/153 1 -Handel/2 1 -handful/1 1 -handgun/1 1 -handhold/18 1 -handicap/47 1 -handicapper/1 1 -handicraft/1 1 -handiwork/2 1 -handkerchief/1 1 -handle/28 1 -handlebar/1 1 -handler/1 1 -handling 1 -handmade 1 -handmaid/1 1 -handmaiden/1 1 -handout/1 1 -handover/10 1 -handpick/11 1 -handrail/1 1 -handsaw/1 1 -handset/18 1 -handshake/1 1 -handshaking/10 1 -handsome/27 1 -handspring/1 1 -handstand/1 1 -handwork/2 1 -handwoven -handwriting/2 1 -handwritten -Handy -handy/50 1 -handyman/2 672 -handymen 673 -Haney/3 -hang/23 674 -hangar/18 1 -hangdog 1 -hanger/1 1 -hanging/1 1 -hangman/2 675 -hangmen 676 -hangnail/1 1 -hangout/1 1 -hangover/1 1 -Hangul/3 -hangup/1 1 -Hangzhou/2 1 -Hank/3 -hank/18 1 -hanker/11 1 -hankering/1 1 -hankie/1 1 -hanky/15 1 -Hanna/3 -Hannah -Hannibal/2 1 -Hanoi/2 1 -Hanover/2 1 -Hanoverian/2 1 -Hansel/3 -Hansen/3 -hansom/1 1 -Hanson/3 -Hans 1 -Hanukah/2 1 -Hanuka 1 -Hanukkah/1 1 -hap/2 1 -haphazard/16 1 -hapless/16 1 -haploid/1 1 -haply 1 -happen/11 1 -happening/1 1 -happenstance/1 1 -happy/50 1 -Hapsburg/2 1 -hap 1 -harangue/28 1 -Harare/2 1 -harass/7 1 -harassed 1 -harasser/1 1 -harassing 1 -harassment/2 1 -Harbin -harbinger/18 1 -harbor/23 1 -harbormaster/10 1 -hard/21 1 -hardback/1 1 -hardball/2 1 -hardboard/2 1 -hardbound 1 -hardcore 1 -hardcover/1 1 -harden/11 1 -hardener/1 1 -hardening 1 -hardhat/1 1 -hardheaded/16 1 -hardhearted/16 1 -hardihood/2 1 -Hardin/3 -Harding/2 1 -hardline/336 1 -hardliner/1 1 -hardscrabble 1 -hardship/1 1 -hardstand/1 1 -hardtack/2 1 -hardtop/1 1 -hard 1 -hardware/2 1 -hardwired -hardwood/1 1 -hardworking -Hardy -hardy/50 1 -hare/28 1 -harebell/1 1 -harebrained 1 -harelip/1 1 -harelipped -harem/1 1 -Hargreaves -haricot/10 1 -hark/11 1 -harken/11 1 -Harlan/3 -Harlem/2 1 -harlequin/18 1 -Harlequin 1 -Harley -harlot/1 1 -harlotry/2 1 -Harlow -harm/23 1 -harmer 1 -harmful/16 1 -harmless/16 1 -Harmon/3 -harmonic/1 1 -harmonica/1 1 -harmonically -harmonica's 677 -harmonica 678 -harmonious/16 1 -harmonium/1 1 -harmonization/2 1 -harmonize/6 1 -harmonizer/1 1 -harmony/15 1 -harness/7 1 -harness's -Harold/3 -harp/23 1 -Harper/3 -harping 1 -harpist/1 1 -harpoon/23 1 -harpooner/1 1 -harpsichord/1 1 -harpsichordist/1 1 -harpy/15 1 -Harpy/15 1 -Harrell/3 -harridan/1 1 -harrier/1 1 -Harriet/3 -Harriett/3 -Harrington/3 -Harris -Harrisburg/2 1 -Harrison/2 1 -Harrods -harrow/23 1 -harrowing 1 -harrumph/11 1 -Harry/3 -harry/31 1 -harsh/21 1 -Hart -hart/1 1 -Harte -Hartford/2 1 -Hartline/3 -Hartman/3 -Harvard/2 1 -harvest/23 1 -harvester/1 1 -Harvey -Hasbro/3 -hash/22 1 -hasheesh/2 1 -hashish/2 1 -Hasidim -hasn't -hasp/18 1 -hassle/28 1 -hassock/1 1 -has 665 -haste/28 1 -hasten/11 1 -ha 679 -Hastings/2 1 -hasting 1 -hast 665 -hasty/50 1 -hat/109 1 -hatband/10 1 -hatbox/4 1 -hatch/22 1 -hatchback/1 1 -hatcheck/1 1 -hatchery/15 1 -hatchet/18 1 -hatching/2 1 -hatchway/1 1 -hate/28 1 -hateful/16 1 -hatemonger/1 1 -hater/1 1 -Hatfield -Hathaway -hath 665 -hatpin/10 1 -hatred/1 1 -Hatsheput/3 -hatstand/10 1 -hatter/1 1 -Hatteras -Hattie/3 -hatting 1 -hauberk/1 1 -haughty/50 1 -haul/23 1 -haulage/2 1 -hauler/1 1 -haulier/10 1 -haunch/40 1 -haunt/23 1 -haunter/1 1 -haunting/8 1 -Hauptmann -Hausa/2 1 -Hausdorff/3 -hauteur/2 1 -Havana/1 1 -Havarti 1 -have/337 680 -Havel -haven/18 1 -haven't -havering 1 -haversack/1 1 -having 1 -havoc/2 1 -Havoline/3 -Haw -haw/23 1 -Hawaii/2 1 -Hawaiian/1 1 -hawk/23 1 -hawker/1 1 -Hawking -hawking 1 -Hawkins -hawkish/33 1 -Hawks -hawser/1 1 -haws 1 -hawthorn/1 1 -Hawthorne -Hay/3 -hay/23 1 -haycock/1 1 -Hayden/3 -Haydn/2 1 -Hayes/2 1 -hayfield 1 -haying 1 -hayloft/1 1 -haymaking 1 -haymow/1 1 -Haynes -hayrick/1 1 -hayride/1 1 -Hays -hayseed/1 1 -haystack/1 1 -haywain -Hayward -haywire 1 -Haywood/3 -Hayworth/3 -hazard/23 1 -hazardous/8 1 -haze/28 1 -Hazel/3 -hazel/1 1 -hazelnut/1 1 -hazel 1 -hazer/1 1 -hazing/1 1 -Hazlitt -hazy/50 1 -HBO -hdqrs -HDTV -he/1 1 -He/2 1 -Head/3 -head/78 1 -headache/1 1 -headband/1 1 -headbanger/10 1 -headbanging -headboard/1 1 -headbutt/10 1 -headbutted -headbutting -headcase/10 1 -headcheese 1 -headcount/10 1 -headdress/4 1 -header/1 1 -headfirst 1 -headgear/2 1 -headhunt/11 1 -headhunter/1 1 -headhunting/2 1 -headily 1 -headiness/3 -heading/1 1 -headlamp/1 1 -headland/1 1 -headless 1 -headlight/1 1 -headline/28 1 -headliner/1 1 -headlock/1 1 -headlong 1 -headman/2 681 -headmaster/1 1 -headmastership 1 -headmen 682 -headmistress/4 1 -headnote 1 -headphone/1 1 -headpiece/1 1 -headpin/1 1 -headquarter/11 1 -headquarters's -headrest/1 1 -headroom/2 1 -headscarf/338 1 -headset/1 1 -headship/1 1 -headshrinker/1 1 -headsman/2 683 -headsmen 684 -headstall/1 1 -headstand/1 1 -headstock 1 -headstone/1 1 -headstrong 1 -headteacher -headteachers -headwaiter/1 1 -headwaters -headwaters's -headway/2 1 -headwind/1 1 -headword/1 1 -heady/34 1 -heal/11 1 -healer/1 1 -healing 1 -health/1 1 -healthcare/2 1 -healthful/16 1 -healthy/50 1 -heap/23 1 -hear/46 1 -hearer/1 1 -hearing/1 1 -hearken/11 1 -hears/205 1 -hearsay/2 1 -hearse/18 1 -Hearst -heart/18 1 -heartache/1 1 -heartbeat/1 1 -heartbreak/86 685 -heartbreaking 1 -heartbroken 686 -heartburn/2 1 -hearten/11 1 -heartening 1 -heartfelt 1 -hearth/1 1 -hearthrug/10 1 -hearthstone/1 1 -heartland/1 1 -heartless/16 1 -heartrending/8 1 -heartsick/33 1 -heartstrings -heartstrings's -heartthrob/1 1 -heartwarming -heartwood/2 1 -hearty/221 1 -heat/23 1 -heated/8 1 -heater/1 1 -Heath -heath/1 1 -heathen/1 1 -heathendom/2 1 -heathenish 1 -heathenism/2 1 -heathen 1 -Heather/3 -heather/1 1 -heathery 1 -heathland 1 -heating/2 1 -heatproof 1 -heatstroke/2 1 -heatwave -heatwaves -heave/28 687 -heaven/130 1 -Heaven/1 1 -heavenly/34 1 -heavenward/10 1 -heaver/1 1 -heaving 1 -Heaviside -heavy/221 1 -heavyhearted 1 -heavyset 1 -heavyweight/1 1 -Heb -Hebert/3 -Hebe 1 -Hebraic 1 -Hebraism/1 1 -Hebrew/1 1 -Hebrides/2 1 -Hecate -heck/2 1 -heckle/28 1 -heckler/1 1 -heckling/2 1 -hectare/1 1 -hectic/39 1 -hectogram/1 1 -hectoliters -hectometer/1 1 -hector/1 1 -Hector/2 1 -hector/11 1 -Hecuba -he'd -hedge/28 1 -hedgehog/1 1 -hedgehop/105 1 -hedger/1 1 -hedgerow/1 1 -hedging 1 -hedonism/2 1 -hedonist/1 1 -hedonistic 1 -heed/23 1 -heedful/8 1 -heedless/16 1 -heehaw/23 1 -heel/23 1 -heeling 1 -heelless 1 -Heep/3 -Hefner/3 -heft/23 1 -hefty/50 1 -Hegel/2 1 -Hegelian 1 -hegemonic -hegemony/2 1 -Hegira -hegira/1 1 -Heidegger -Heidelberg -Heidi/3 -heifer/1 1 -Heifetz -height/1 1 -heighten/11 1 -Heimlich/3 -Heine -Heineken/3 -Heinlein/3 -heinous/16 1 -Heinrich/3 -Heinz -heir/18 1 -heiress/4 1 -heirloom/1 1 -Heisenberg -Heisman/3 -heist/23 1 -Hejira -held 688 -Helen/2 1 -Helena/2 1 -Helene/3 -Helga/3 -helical 1 -Helicon -helicopter/23 1 -heliocentric 1 -heliography 1 -Heliopolis -Helios/2 1 -heliosphere 1 -heliotrope/1 1 -helipad/10 1 -heliport/1 1 -helium/2 1 -helix/184 1 -he'll -hell/1 1 -Hell/1 1 -hell/58 1 -hellbent 1 -hellcat/1 1 -hellebore/2 1 -Hellene/1 1 -Hellenic/2 1 -Hellenism/1 1 -Hellenistic 1 -Hellenist 1 -Hellenization 1 -Hellenize 1 -Heller -Hellespont/2 1 -hellfire 1 -hellhole/1 1 -hellion/1 1 -hellish/16 1 -Hellman -hello/18 1 -helluva -helm/18 1 -helmet/62 1 -Helmholtz/2 1 -helmsman/2 689 -helmsmen 690 -Heloise/3 -helot/1 1 -help/23 1 -helper/1 1 -helpful/16 1 -helping/1 1 -helpless/16 1 -helpline/10 1 -helpmate/1 1 -helpmeet/1 1 -Helsinki/2 1 -helve/18 1 -Helvetian 1 -Helvetius/3 -hem/160 1 -hematite/2 1 -hematologic -hematological -hematologist/1 1 -hematology/2 1 -heme/2 1 -Hemingway/2 1 -hemisphere/1 1 -hemispheric -hemispherical 1 -hemline/1 1 -hemlock/1 1 -hemmer/1 1 -hemoglobin/2 1 -hemophilia/2 1 -hemophiliac/1 1 -hemorrhage/28 1 -hemorrhagic -hemorrhoid/1 1 -hemostat/1 1 -hemp/2 1 -hempen 1 -hemstitch/22 1 -hen/1 1 -henceforth -henceforward -hence 1 -Hench/3 -henchman/2 691 -henchmen 692 -Henderson/3 -Hendricks -Hendrix -henge 1 -Henley -henna/23 1 -Hennessy/3 -henpeck/11 1 -Henri/3 -Henrietta/3 -Henry/2 1 -Hensley/3 -Henson/3 -hep/339 1 -heparin/2 1 -hepatic 1 -hepatitis/2 1 -Hepburn -Hephaestus/2 1 -Hepplewhite -heptagon/1 1 -heptagonal -heptane 1 -heptathlon/1 1 -hep 1 -her/1 1 -Hera/2 1 -Heracles/2 1 -Heraclitus -Herakles/2 1 -herald/23 1 -heraldic 1 -heraldry/2 1 -herb/1 1 -herbaceous 1 -herbage/2 1 -herbal/10 1 -herbalism -herbalist/1 1 -herbal 1 -Herbart -Herbert -herbicidal -herbicide/1 1 -herbivore/1 1 -herbivorous -Herculaneum/2 1 -herculean -Herculean -Hercules/2 1 -herd/23 1 -Herder -herder/1 1 -herdsman/2 693 -herdsmen 694 -here/2 1 -hereabout/10 1 -hereafter/1 1 -hereby 1 -hereditary 1 -heredity/2 1 -Hereford/1 1 -hereinafter -herein 1 -hereof 1 -hereon 1 -Herero 1 -heresy/15 1 -heretic/1 1 -heretical 1 -hereto -heretofore -here 1 -hereunder -hereunto -hereupon -herewith -Heriberto/3 -heritability 1 -heritable 1 -heritage/1 1 -Herman/3 -hermaphrodite/1 1 -hermaphroditic 1 -Hermaphroditus -hermeneutic/10 1 -Hermes/2 1 -hermetic/39 1 -hermetical -hermetic 1 -Herminia/3 -hermit/1 1 -hermitage/1 1 -Hermitage 1 -Hermite/3 -Hermosillo/3 -Hernandez/3 -hernia/1 1 -hernial 1 -herniate/6 1 -herniation/2 1 -hero/4 1 -Herod/2 1 -Herodotus/2 1 -heroic/32 1 -heroically -heroic 1 -heroin/1 1 -heroine/1 1 -heroism/2 1 -heron/1 1 -herpes/2 1 -herpetologist/1 1 -herpetology/2 1 -Herr/2 1 -Herrera/3 -Herrick -Herring/3 -herring/1 1 -herringbone/2 1 -Herschel -herself 1 -Hersey/3 -Hershel/3 -Hershey/3 -her 1 -hertz/2 1 -Hertz/2 1 -Hertzsprung/3 -Herzegovina -Herzl -Heshvan/2 1 -Hesiod -hesitance/2 1 -hesitancy/2 1 -hesitant/8 1 -hesitate/6 1 -hesitating/8 1 -hesitation/1 1 -Hesperus -Hess -Hesse -hessian 1 -Hessian 1 -hes 695 -Hester/3 -Heston/3 -hetero/1 1 -heterodox 1 -heterodoxy/2 1 -heterogeneity/2 1 -heterogeneous/8 1 -heterosexual/1 1 -heterosexuality/2 1 -heterosexually -heteros 1 -heterozygous -Hettie/3 -heuristic/69 1 -hew/11 1 -hewer/1 1 -hewing 1 -Hewitt/3 -Hewlett/3 -hex/22 1 -hexadecimal/10 1 -hexagon/1 1 -hexagonal 1 -hexagram/1 1 -hexameter/1 1 -hexane 1 -hexing 1 -hex 1 -hey -heyday/1 1 -Heyerdahl -Heywood -Hezbollah/3 -Hezekiah -hf -Hf/2 1 -HF/2 1 -Hg/2 1 -hgt -hgwy -HHS -HI -hi/10 1 -Hialeah -hiatus/4 1 -Hiawatha/2 1 -hibachi/18 1 -hibernate/6 1 -hibernation/2 1 -hibernator/1 1 -Hibernia/2 1 -Hibernian 1 -hibiscus/4 1 -hiccup/23 1 -hick/1 1 -hickey/1 1 -Hickman/3 -Hickok -hickory/15 1 -Hicks/3 -hick 1 -hidden 1 -hide/340 1 -hideaway/1 1 -hidebound 1 -hided -hideous/16 1 -hideout/1 1 -hider/1 1 -hiding/1 1 -hid 1 -hie/46 696 -hierarchic -hierarchical/8 1 -hierarchy/15 1 -hieratic 1 -hieroglyph/1 1 -hieroglyphic/1 1 -Hieronymus -Higashiosaka -Higgins/3 -high/38 1 -highball/18 1 -highborn 1 -highboy/1 1 -highbrow/1 1 -highchair/1 1 -highers -highfalutin -highfaluting -highhanded/16 1 -highish -highjack/23 1 -highland/129 1 -highlander/1 1 -Highlander/1 1 -Highlands -highlight/23 1 -highlighter/1 1 -Highness/3 -highpoint -highrise/1 1 -highroad/1 1 -hightail/11 1 -highway/1 1 -highwayman/2 697 -highwaymen 698 -hijack/23 1 -hijacker/1 1 -hijacking/1 1 -hijinks 1 -hike/28 1 -hiker/1 1 -hiking's -Hilario/3 -hilarious/16 1 -hilarity/2 1 -Hilary/3 -Hilbert -Hilda/3 -Hildebrand -Hilfiger/3 -Hill -hill/18 1 -Hillary -hillbillies -hillbilly's -hillbilly 1 -Hillel -hillock/1 1 -hillside/1 1 -hilltop/18 1 -hillwalking -hilt/18 1 -Hilton -hilly/49 1 -him/1 1 -Himalaya/1 1 -Himalayan 1 -Himmler -himself 1 -Hinayana/2 1 -hind/129 1 -Hindemith -Hindenburg -hinder/11 1 -hindering 1 -Hindi 699 -hindmost 1 -hindquarter/1 1 -hindrance/1 1 -hindsight/2 1 -Hindu/1 1 -Hinduism/1 1 -Hindustan/2 1 -Hindustani/1 1 -Hindus 700 -Hindu 1 -Hines -hing/11 1 -hinge/28 1 -hint/23 1 -hinter/1 1 -hinterland/1 1 -Hinton/3 -hip/295 1 -hipbath -hipbaths -hipbone/1 1 -hiphuggers -hipness/3 -Hipparchus -hippie/1 1 -hipping 1 -hippo/1 1 -Hippocrates/2 1 -Hippocratic -hippodrome/1 1 -hippopotamus/4 1 -hipster/1 1 -Hiram -hire/28 1 -hireling/1 1 -hirer 1 -hiring 1 -Hirobumi/3 -Hirohito -Hiroshima/2 1 -hirsute/33 1 -his/341 701 -Hispanic/1 1 -Hispaniola/2 1 -Hiss/3 -hiss/22 1 -hissing/10 1 -histamine/1 1 -histogram/1 1 -histological 1 -histologist/1 1 -histology/2 1 -historian/1 1 -historic -historical/8 1 -historicist 1 -historicity/2 1 -historiographer/1 1 -historiographical 1 -historiography/2 1 -history/15 1 -histrionic/35 1 -hist 1 -hit/128 1 -Hitachi/3 -hitch/22 1 -Hitchcock -hitcher/1 1 -hitchhike/6 1 -hitchhiker/1 1 -hitchhike's -hitherto -hither 1 -Hitler/1 1 -hi 1 -hittable -hitter/1 1 -Hittite/1 1 -HIV/2 1 -hive/28 1 -hiya 1 -h'm -HM -hmm -HMO/2 1 -Hmong 1 -HMS -hm 1 -ho/1 1 -Ho/2 1 -hoagie/1 1 -hoagy/15 1 -hoard/23 1 -hoarder/1 1 -hoarding/1 1 -hoarfrost/2 1 -hoarse/27 1 -hoar 1 -hoary/49 1 -hoax/22 1 -hoaxer/1 1 -hob/18 1 -Hobart/2 1 -Hobbes -hobbit/10 1 -hobble/28 1 -hobbler/1 1 -Hobbs -hobby/15 1 -hobbyhorse/1 1 -hobbyist/1 1 -hobgoblin/1 1 -hobnail/23 1 -hobnob/145 1 -hobnobbing 1 -hobo/18 1 -hock/23 1 -hockey/2 1 -Hockney/3 -hockshop/1 1 -hod/1 1 -Hodge/1 1 -hodgepodge/1 1 -Hodgkin -hoe/63 1 -hoecake/1 1 -hoedown/1 1 -hoer/1 1 -Hoff/3 -Hoffa/3 -Hoffman/3 -Hofstadter/3 -hog/92 1 -Hogan/3 -hogan/1 1 -Hogarth -hogback/1 1 -hogger 1 -hogging 1 -hoggish/8 1 -hogshead/1 1 -hogtie/122 702 -hogtying 703 -Hogwarts/3 -hogwash/2 1 -Hohenlohe -Hohenstaufen 1 -Hohenzollern/2 1 -Hohhot/3 -Hohokam -hoick/11 1 -hoicks 1 -hoist/23 1 -hoke/6 1 -hokey 704 -hokier 705 -hokiest 705 -Hokkaido/2 1 -hokum/2 1 -Hokusai -Holbein -Holcomb/3 -hold/86 706 -holdable -holdall/10 1 -Holden/3 -Holder/3 -holder/1 1 -holding/1 1 -holdout/1 1 -holdover/1 1 -holdup/1 1 -hole/28 1 -holey 707 -Holiday -holiday/23 1 -holidaymaker/10 1 -holier 708 -holiest 708 -Holiness -holing 1 -holism 1 -holistic/39 1 -Holland/1 1 -Hollander/1 1 -holler/23 1 -Hollerith/3 -Holley/3 -Hollie/3 -hollies -Hollis -hollow/52 1 -Holloway/3 -Holman/3 -Holmes/2 1 -holmium/2 1 -Holocaust -holocaust/1 1 -Holocene/2 1 -hologram/1 1 -holograph/18 1 -holographic -holography/2 1 -hols -Holst -Holstein/1 1 -holster/23 1 -Holt -holy/49 1 -Holly -holly/3 -hollyhock/1 1 -Hollywood/2 1 -homage/18 1 -hombre/1 1 -homburg/1 1 -home/342 1 -homebody/15 1 -homeboy/1 1 -homecoming/1 1 -homegrown -homeland/1 1 -homeless/343 1 -homelike 1 -homely/140 1 -homemade -homemaker/1 1 -homemaking/2 1 -homeomorphism/10 1 -homeopath/1 1 -homeopathic 1 -homeopathy/2 1 -homeostasis/2 1 -homeostatic 1 -homeowner/1 1 -homepage/1 1 -homer/1 1 -Homer/2 1 -homer/11 1 -Homeric 1 -homeroom/1 1 -homeschooling/2 1 -homesick/33 1 -homespun/2 1 -homestead/23 1 -homesteader/1 1 -homesteading 1 -homestretch/4 1 -hometown/1 1 -homeward/10 1 -homework/2 1 -homeworker -homeworkers -homeworking -homey/20 709 -homicidal 1 -homicide/1 1 -homier 710 -homiest 710 -homiletic 1 -homilies -homily's -homing 1 -hominid/1 1 -hominy/2 1 -homo/1 1 -homoerotic -homogenates -homogeneity/2 1 -homogeneous/8 1 -homogenization/2 1 -homogenize/6 1 -homogenous -homograph/1 1 -homological 1 -homologous -homologue 1 -homology/60 1 -homomorphism/10 1 -homonym/1 1 -homophobes -homophobia/2 1 -homophobic -homophone/1 1 -homophony 1 -homosexual/1 1 -homosexuality/2 1 -homosexually -homotopy -homozygous -homunculus 1 -homy/50 1 -Hon -hon/18 711 -honcho/18 1 -Honda/3 -Honduran/1 1 -Honduras/2 1 -hone/254 1 -Honecker/3 -honer/1 1 -honest/75 1 -honesty/2 1 -honey/23 1 -honeybee/1 1 -honeycomb/23 1 -honeydew/1 1 -honeyed 1 -honeylocust/2 1 -honeymoon/23 1 -honeymooner/1 1 -honeypot/10 1 -honeysuckle/1 1 -honey 1 -Honeywell/3 -Honiara -honk/23 1 -honker/1 1 -honkie/1 1 -honky/15 1 -Honolulu/2 1 -honor/23 1 -Honorable -honorable/29 1 -honorarily -honorarium/1 1 -honorary 1 -honoree/1 1 -honorer/1 1 -honorific/1 1 -Honshu/2 1 -hon 1 -hooch/2 1 -Hood -hood/23 1 -hooded 1 -hoodlum/1 1 -hoodoo/23 1 -hoodwink/11 1 -hooey/2 1 -hoof/115 1 -hoofer/10 1 -hook/23 1 -hooka/1 1 -hookah/1 1 -Hooke -hooked 1 -Hooker -hooker/1 1 -hookey/2 1 -hookup/1 1 -hookworm/1 1 -hooky/2 1 -hooligan/1 1 -hooliganism/2 1 -hoop/23 1 -Hooper/3 -hoopla/2 1 -hooray/23 1 -hoosegow/1 1 -Hoosier/1 1 -hoot/23 1 -hootch/2 1 -hootenanny/15 1 -hooter/1 1 -Hooters/3 -Hoover/1 1 -hoover/11 1 -hop/47 1 -Hope -hope/28 1 -hopeful/36 1 -hopeless/16 1 -Hopewell/3 -Hopi/1 1 -Hopkins -Hopper -hopper/1 1 -hopping 1 -hopscotch/22 1 -hora/1 1 -Horace -Horacio/3 -Horatio/3 -horde/28 1 -horehound/1 1 -horizon/1 1 -horizontal/30 1 -Hormel/3 -hormonal -hormonally -hormone/1 1 -Hormuz -Horn -horn/62 1 -hornbeam 1 -hornblende/2 1 -Hornblower/3 -Horne/3 -horned 1 -hornet/1 1 -hornless 1 -hornlike 1 -hornpipe/1 1 -horn 1 -horny/34 1 -horological -horologic 1 -horologist/1 1 -horology/2 1 -horoscope/1 1 -Horowitz -horrendous/8 1 -horrible/29 1 -horrid/8 1 -horrific/39 1 -horrified 1 -horrify/31 1 -horrifying/8 1 -horror/1 1 -horse/28 1 -horseback/2 1 -horsebox/89 1 -horseflesh/2 1 -horseflies -horsefly/3 -horsehair/2 1 -horsehide/2 1 -horselaugh/18 1 -horseless 1 -horseman/2 712 -horsemanship/2 1 -horsemen 713 -horseplay/2 1 -horsepower/2 1 -horseradish/4 1 -horseshit/309 1 -horseshoe/63 1 -horsetail/1 1 -horsetrading -horsewhip/47 1 -horsewoman/2 714 -horsewomen 715 -horsey 716 -horsier 717 -horsiest 717 -horsing 1 -horsy/34 1 -hortatory 1 -Horthy -horticulturalist -horticulturalists -horticultural 1 -horticulture/2 1 -horticulturist/1 1 -Horton/3 -Horus/2 1 -hos/205 1 -hosanna/18 1 -hose/28 1 -Hosea/2 1 -hosepipe/10 1 -hosier/1 1 -hosiery/2 1 -hosp -hospice/1 1 -hospitable/19 1 -hospital/1 1 -hospitality/2 1 -hospitalization/1 1 -hospitalize/6 1 -host/1 1 -Host/1 1 -host/11 1 -hostage/18 1 -hostel/23 1 -hosteler/1 1 -hostelry/15 1 -hostess/22 1 -hostile/30 1 -hostility/344 1 -hostler/1 1 -hot/345 1 -hotbed/1 1 -hotblooded -hotbox/4 1 -hotcake/1 1 -hotchpotch 1 -hotdog/92 1 -hotel/1 1 -hotelier/1 1 -hotfoot/23 1 -hothead/1 1 -hotheaded/16 1 -hothouse/18 1 -hotline/1 1 -hotlink/58 1 -hotplate/1 1 -Hotpoint/3 -hotpot/10 1 -hotshot/1 1 -hotspot/1 1 -hots's -Hottentot/1 1 -hotter 1 -Houdini -houmous -houmus 1 -hound/23 1 -hour/1 1 -hourglass/4 1 -houri/1 1 -hourly 1 -House -house/28 1 -houseboat/1 1 -housebound -houseboy/1 1 -housebreak/121 718 -housebreaker/1 1 -housebreaking/2 1 -housebroken 719 -housebroke 719 -housebuilding -houseclean/11 1 -housecleaning/2 1 -housecoat/1 1 -houseflies -housefly/3 -houseful/1 1 -household/1 1 -householder/1 1 -househusband/1 1 -housekeeper/1 1 -housekeeping/2 1 -houselights/2 1 -housemaid/1 1 -houseman/2 720 -housemaster/10 1 -housemate/10 1 -housemen 721 -housemistress/89 1 -housemother/1 1 -housemoving -houseparent/1 1 -houseplant/1 1 -houseproud -houseroom 1 -housetop/1 1 -housewares/2 1 -housewarming/1 1 -housewife/2 722 -housewifely 1 -housewives 723 -housework/2 1 -housing/1 1 -Housman -Houston/2 1 -Houyhnhnm/2 1 -HOV -hovel/18 1 -hover/5 1 -hovercraft/2 1 -hovercrafts -hoverer 1 -hove 724 -Hovhaness/3 -how/1 1 -Howard -howbeit 1 -howdah/1 1 -howdy 1 -Howe -Howell/3 -Howells -however -howitzer/1 1 -howl/23 1 -howler/1 1 -howling 1 -Howrah -howsoever -how 1 -hoyden/18 1 -hoydenish 1 -hoyden 1 -Hoyle 1 -HP/2 1 -hp 1 -HQ/2 1 -HR -hr/10 1 -HRH -Hrothgar/3 -HS -HSBC/3 -HST -ht -HT -HTML/2 1 -Hts -HTTP 1 -Huang -huarache/1 1 -hub/18 1 -Hubbard 1 -Hubble/3 -hubbub/1 1 -hubby/15 1 -hubcap/1 1 -Huber/3 -Hubert/3 -hubris/2 1 -Huck/3 -huckleberry/15 1 -huckster/23 1 -hucksterism/2 1 -HUD/2 1 -Huddersfield -huddle/28 1 -Hudson/2 1 -hue/77 1 -Huerta/3 -Huey/3 -Huff/3 -huff/23 1 -Huffman/3 -huffy/50 1 -hug/92 1 -huge/27 1 -Huggins -Hugh/3 -Hughes -Hugo/2 1 -hug 1 -Huguenot/1 1 -huh 1 -Hui -Huitzilopotchli/3 -hula/18 1 -hulk/86 1 -hull/1 1 -Hull/2 1 -hull/11 1 -hullabaloo/1 1 -huller/1 1 -hullo/2 1 -hum/160 711 -human/38 1 -humane/27 1 -humanism/2 1 -humanist/1 1 -humanistic 1 -humanitarian/1 1 -humanitarianism/2 1 -humanity/344 1 -humanization/2 1 -humanize/6 1 -humanizer/1 1 -humankind/2 1 -humanoid/1 1 -Humberto/3 -humble/346 1 -humbler/1 1 -humbles 1 -humbling/10 1 -Humboldt -humbug/92 1 -humdinger/1 1 -humdrum/2 1 -Hume -humeral 1 -humeri 725 -humerus/2 726 -humid/8 1 -humidification/2 1 -humidifier/1 1 -humidify/31 1 -humidity/2 1 -humidor/1 1 -humiliate/6 1 -humiliating/8 1 -humiliation/1 1 -humility/2 1 -hummable -Hummer/3 -hummer/1 1 -hummingbird/1 1 -humming 1 -hummock/18 1 -hummocky 1 -hummus/2 1 -humongous -humor/23 1 -humorist/1 1 -humorless/16 1 -humorous/16 1 -hump/23 1 -humpback/1 1 -humpbacked -humph/11 1 -Humphrey -humungous -humus/2 1 -Humvee 1 -Hun/1 1 -hunch/22 1 -hunchback/1 1 -hunchbacked -hunchback 1 -hundred/1 1 -hundredfold 1 -hundredth/1 1 -hundred 1 -hundredweight/1 1 -Hung -Hungarian/1 1 -Hungary/2 1 -hunger/23 1 -hungover -hungry/50 1 -hung 727 -hunk/1 1 -hunker/11 1 -hunkier 728 -hunkiest 728 -hunks 1 -hunky/34 1 -Hunspell/3 -Hunt -hunt/23 1 -hunted 1 -Hunter/3 -hunter/1 1 -hunting/2 1 -Huntington/2 1 -Huntley/3 -huntress/4 1 -huntsman/2 729 -huntsmen 730 -Huntsville -hurdle/28 1 -hurdler/1 1 -hurdling/2 1 -hurl/23 1 -hurler/1 1 -Hurley/3 -hurling/2 1 -Huron 1 -hurrah's -hurray/23 1 -hurricane/1 1 -hurried/8 1 -hurry/56 1 -hurrying 1 -Hurst/3 -hurt/86 1 -hurtful/16 1 -hurtle/6 1 -hurtling 1 -Hus -husband/23 1 -husbandman/2 731 -husbandmen 732 -husbandry/2 1 -hush/22 1 -hushed 1 -husk/23 1 -husker/1 1 -husking 1 -husky/221 1 -hussar/1 1 -Hussein -Husserl -Hussite 1 -hussy/15 1 -hustings/2 1 -hustle/28 1 -hustler/1 1 -hustling 1 -Huston -hut/18 1 -hutch/40 1 -Hutchinson -Hutton/3 -Hutu 1 -hutzpa/2 1 -hutzpah/2 1 -Huxley/2 1 -Huygens -huzza/23 1 -huzzah/23 1 -huzzaing 1 -hwy -hyacinth/1 1 -Hyades/2 1 -hyaena/1 1 -hybrid/1 1 -hybridism/2 1 -hybridization/2 1 -hybridize/6 1 -hybrid 1 -Hyde -Hyderabad -hydra/1 1 -Hydra/2 1 -hydrangea/1 1 -hydrant/1 1 -hydras 1 -hydrate/28 1 -hydration/2 1 -hydraulic/347 1 -hydraulics's -hydrazine 1 -hydride 1 -hydro/2 1 -hydrocarbon/1 1 -hydrocephalus/2 1 -hydrocephaly/3 -hydrochloric -hydrochloride 1 -hydrodynamic/32 1 -hydrodynamical -hydrodynamic 1 -hydroelectric -hydroelectrically -hydroelectricity/2 1 -hydrofluoric -hydrofoil/1 1 -hydrogen/2 1 -hydrogenate/6 1 -hydrogenation/2 1 -hydrogenous -hydrological 1 -hydrologist/1 1 -hydrology/2 1 -hydrolysis/2 1 -hydrolyze/6 1 -hydromagnetic 1 -hydromechanics -hydrometer/1 1 -hydrometry/2 1 -hydrophobia/2 1 -hydrophobic -hydrophone/1 1 -hydroplane/28 1 -hydroponic/35 1 -hydrosphere/2 1 -hydrostatic/10 1 -hydrotherapy/2 1 -hydrothermal 1 -hydrous 1 -hydroxide/1 1 -hyena/1 1 -hygiene/2 1 -hygienically -hygienic 1 -hygienist/1 1 -hygrometer/1 1 -hygroscopic 1 -hying 733 -hymen/1 1 -Hymen/2 1 -hymeneal 1 -hymn/23 1 -hymnal/1 1 -hymnbook/1 1 -hype/28 1 -hyperactive 1 -hyperactivity/2 1 -hyperbola/1 1 -hyperbole/2 1 -hyperbolic 1 -hyperboloid/10 1 -hypercritical/8 1 -hypercube/10 1 -hyperfine 1 -hyperglycemia/2 1 -hyperinflation 1 -Hyperion/2 1 -hyperlink/58 1 -hyperlink's -hypermarket/10 1 -hypermedia/2 1 -hyperplane/10 1 -hypersensitive/33 1 -hypersensitivity/15 1 -hypersonic 1 -hyperspace/10 1 -hypersphere -hypertension/2 1 -hypertensive/1 1 -hypertext/2 1 -hyperthyroidism/2 1 -hyperthyroid's -hyperthyroid 1 -hypertrophy/56 1 -hyper 1 -hyperventilate/6 1 -hyperventilation/2 1 -hyphen/23 1 -hyphenate/6 1 -hyphenate's -hyphenation/1 1 -hypnoses 734 -hypnosis/2 735 -hypnotherapist/10 1 -hypnotherapy/2 1 -hypnotic/51 1 -hypnotism/2 1 -hypnotist/1 1 -hypnotize/6 1 -hypo/18 1 -hypoallergenic -hypocaust 1 -hypochondria/2 1 -hypochondriac/1 1 -hypochondria's 736 -hypochondria 737 -hypocrisy/15 1 -hypocrite/1 1 -hypocritical/8 1 -hypodermic/1 1 -hypoglycemia/2 1 -hypoglycemic/1 1 -hypotenuse/1 1 -hypothalami 738 -hypothalamus/2 739 -hypothermia/2 1 -hypotheses 740 -hypothesis/2 741 -hypothesize/6 1 -hypothesizer 1 -hypothetical/8 1 -hypothyroidism/2 1 -hypothyroid's -hypothyroid 1 -hypoxia 1 -hyssop/2 1 -hysterectomy/15 1 -hysteresis 1 -hysteria/2 1 -hysteric/130 1 -hysterical/8 1 -hysteric 1 -Hyundai/3 -Hz/2 1 -I/2 1 -Ia -IA -Iaccoca/3 -Iago/3 -iamb/1 1 -iambic/1 1 -iambi 742 -iambus/4 743 -Ian/3 -Iapetus/2 1 -iatrogenic -Ibadan -Iberia/2 1 -Iberian 1 -ibex/4 1 -ibid -ibidem -ibis/4 1 -Ibiza -Iblis/3 -IBM/3 -Ibo 1 -Ibsen/2 1 -ibuprofen/2 1 -Icahn/3 -Icarus/2 1 -ICBM/1 1 -ICC -Ice -ice/28 1 -iceberg/1 1 -iceboat/1 1 -icebound -icebox/4 1 -icebreaker/1 1 -icecap/1 1 -Iceland/2 1 -Icelander/1 1 -Icelandic/2 1 -iceman/2 744 -icemen 745 -icepack 1 -icepick/10 1 -ices 746 -ichneumon 1 -ichthyologist/1 1 -ichthyology/2 1 -icicle/1 1 -icing/1 1 -icky/34 1 -icon/1 1 -iconic 1 -iconoclasm/2 1 -iconoclast/1 1 -iconoclastic 1 -iconographic -iconography/2 1 -icosahedral -icosahedra 747 -icosahedron 748 -ictus/2 1 -ICU -icy/50 1 -I'd -id/1 1 -ID/1 1 -Ida -Idaho/71 1 -Idahoan/1 1 -idea/1 1 -ideal/30 1 -idealism/2 1 -idealist/1 1 -idealistic/39 1 -idealization/1 1 -idealize/6 1 -idempotent 1 -idem 1 -identical/8 1 -identifiable/19 1 -identification/1 1 -identifier/10 1 -identify/31 1 -identikit/10 1 -identity/15 1 -ideogram/1 1 -ideograph/1 1 -ideographic -ideological/8 1 -ideologist/1 1 -ideologue/1 1 -ideology/15 1 -ides -ides's -idiocy/15 1 -idiolect 1 -idiom/1 1 -idiomatic -idiomatically -idiopathic 1 -idiosyncrasy/15 1 -idiosyncratic/39 1 -idiot/1 1 -idiotic/39 1 -idle/346 1 -idler/1 1 -idle's -idles 1 -idling 1 -idol/1 1 -idolater/1 1 -idolatress/4 1 -idolatrous 1 -idolatry/2 1 -idolization/2 1 -idolize/6 1 -idyl/1 1 -idyll/1 1 -idyllic/39 1 -IE -Ieyasu -if/1 1 -iffiness/3 -iffy/34 1 -igloo/1 1 -Ignacio/3 -Ignatius -igneous 1 -ignitable -ignite/6 1 -ignitible -ignition/1 1 -ignoble/19 1 -ignominious/8 1 -ignominy/15 1 -ignorable -ignoramus/4 1 -ignorance/2 1 -ignorant/8 1 -ignore/6 1 -Igor/3 -iguana/1 1 -Iguassu/2 1 -iii 1 -ii 1 -Ijssel -Ijsselmeer/3 -Ike/2 1 -Ikea/3 -Ikhnaton -ikon/1 1 -IL -Ila -ilea 749 -ileitis/2 1 -Ilene/3 -ileum/2 750 -Iliad/1 1 -ilia 751 -ilium/2 752 -ilk/1 1 -Ill -I'll -ill/348 100 -illegal/30 1 -illegality/15 1 -illegibility/2 1 -illegible/19 1 -illegitimacy/2 1 -illegitimate/8 1 -illiberal/8 1 -illiberality/2 1 -illicit/16 1 -illimitable 1 -Illinois/2 1 -Illinoisan/1 1 -illiquid 1 -illiteracy/2 1 -illiterate/30 1 -illogical/8 1 -illogicality/2 1 -illuminable -illuminant 1 -illuminate/43 1 -Illuminati -illuminating/8 1 -illumination/1 1 -illumine/6 1 -illus -illusion/1 1 -illusionist/1 1 -illusive 1 -illusory 1 -illustrate/6 1 -illustrated 1 -illustration/1 1 -illustrative/8 1 -illustrator/1 1 -illustrious/16 1 -ilmenite 1 -Ilyushin/3 -I'm -image/28 1 -imagery/2 1 -imaginable/19 1 -imaginary 1 -imagination/1 1 -imaginative/8 1 -imagine/6 1 -imaging 1 -imagining/10 1 -imago/349 1 -imam/1 1 -Imam 1 -imbalance/1 1 -imbalanced -imbecile/1 1 -imbecilic -imbecility/15 1 -imbed/274 1 -imbibe/6 1 -imbiber/1 1 -imbrication/2 1 -imbroglio/1 1 -imbue/6 1 -Imelda/3 -IMF/2 1 -IMHO -Imhotep/3 -imitable 1 -imitate/6 1 -imitation/1 1 -imitative/16 1 -imitator/1 1 -immaculate/16 1 -immanence/2 1 -immanency/2 1 -immanent/8 1 -immaterial/16 1 -immateriality/2 1 -immature/8 1 -immaturity/2 1 -immeasurable/19 1 -immediacy/344 1 -immediate/16 1 -immemorial/8 1 -immense/250 1 -immensity/15 1 -immerse/6 1 -immersible -immersion/1 1 -immigrant/1 1 -immigrate/6 1 -immigration/1 1 -imminence/2 1 -imminent/8 1 -immiscible 1 -immobile -immobilisers -immobility/2 1 -immobilization/2 1 -immobilize/6 1 -immobilizer/10 1 -immoderate/8 1 -immodest/8 1 -immodesty/2 1 -immolate/6 1 -immolation/2 1 -immoral/8 1 -immorality/15 1 -immortal/30 1 -immortality/2 1 -immortalize/6 1 -immovability/2 1 -immovable/19 1 -immoveable 1 -immune 1 -immunity/15 1 -immunization/1 1 -immunize/6 1 -immunoassay 1 -immunodeficiency/2 1 -immunodeficient -immunologic -immunological/8 1 -immunologist/1 1 -immunology/2 1 -immure/6 1 -immutability/2 1 -immutable/19 1 -IMNSHO -Imodium/3 -Imogene/3 -IMO 1 -imp/18 1 -impact/23 1 -impaction 1 -impair/11 1 -impairment/1 1 -impala/1 1 -impale/6 1 -impalement/2 1 -impaler 1 -impalpable/19 1 -impanel/11 1 -impart/11 1 -impartial/8 1 -impartiality/2 1 -impassable/19 1 -impasse/1 1 -impassibility/2 1 -impassible/19 1 -impassioned 1 -impassive/16 1 -impassivity/2 1 -impasto/2 1 -impatience/1 1 -impatiens/2 1 -impatient/8 1 -impeach/7 1 -impeachable -impeacher/1 1 -impeachment/1 1 -impeccability/2 1 -impeccable/19 1 -impecunious/16 1 -impedance/2 1 -impede/6 1 -impediment/1 1 -impedimenta/2 1 -impeding 1 -impel/61 1 -impeller/1 1 -impelling 1 -impend/11 1 -impenetrability/2 1 -impenetrable/19 1 -impenitence/2 1 -impenitent/8 1 -imper -imperative/30 1 -imperceptibility/2 1 -imperceptible/19 1 -imperceptive 1 -imperf -imperfect/36 1 -imperfection/1 1 -imperial/30 1 -imperialism/2 1 -imperialist/1 1 -imperialistic/39 1 -imperil/11 1 -imperilment/2 1 -imperious/16 1 -imperishable/19 1 -impermanence/2 1 -impermanent/8 1 -impermeability/2 1 -impermeable/19 1 -impermissible 1 -impersonal/8 1 -impersonality 1 -impersonate/6 1 -impersonation/1 1 -impersonator/1 1 -impertinence/1 1 -impertinent/8 1 -imperturbability/2 1 -imperturbable/19 1 -impervious/8 1 -impetigo/2 1 -impetuosity/2 1 -impetuous/16 1 -impetus/4 1 -impiety/15 1 -impinge/6 1 -impingement/2 1 -impious/16 1 -impish/16 1 -implacability/2 1 -implacable/19 1 -implant/23 1 -implantable -implantation/2 1 -implausibility/15 1 -implausible/19 1 -implement/23 1 -implementable -implementation/1 1 -implementer/10 1 -implicate/6 1 -implication/1 1 -implicit/16 1 -implied/8 1 -implode/6 1 -implore/6 1 -imploring/8 1 -implosion/1 1 -implosive 1 -imply/31 1 -impolite/151 1 -impolitic 1 -imponderable/1 1 -import/23 1 -importable -importance/2 1 -important/8 1 -importation/1 1 -importer/1 1 -importunate/8 1 -importune/6 1 -importunity/2 1 -imposable -impose/6 1 -imposer/1 1 -imposing/8 1 -imposition/1 1 -impossibility/15 1 -impossible/268 1 -impost/18 1 -imposter/1 1 -impostor/1 1 -imposture/1 1 -impotence/2 1 -impotency/2 1 -impotent/8 1 -impound/11 1 -impoverish/7 1 -impoverishment/2 1 -impracticability 1 -impracticable/19 1 -impracticality/15 1 -impractical 1 -impractically -imprecate/6 1 -imprecation/1 1 -imprecise/16 1 -imprecision/2 1 -impregnability/2 1 -impregnable/19 1 -impregnate/6 1 -impregnation/2 1 -impresario/1 1 -impress/22 1 -impressibility/2 1 -impressible 1 -impression/1 1 -impressionability/2 1 -impressionable 1 -impressionism/2 1 -impressionist/1 1 -impressionistic 1 -impressive/16 1 -imprimatur/1 1 -imprint/23 1 -imprinter/1 1 -imprinting 1 -imprison/11 1 -imprisonment/1 1 -improbability/15 1 -improbable/19 1 -impromptu/1 1 -improper/8 1 -impropriety/15 1 -improvable 1 -improve/6 1 -improvement/1 1 -improver 1 -improvidence/2 1 -improvident/8 1 -improving 1 -improvisation/1 1 -improvisational -improvisatory -improvise/6 1 -improvised 1 -improviser/1 1 -improvisor/1 1 -imprudence/2 1 -imprudent/8 1 -impudence/2 1 -impudent/8 1 -impugn/11 1 -impugnable -impugner/1 1 -impulse/28 1 -impulsion/2 1 -impulsive/16 1 -impunity/2 1 -impure/45 1 -impurity/15 1 -imputable 1 -imputation/1 1 -impute/6 1 -Imus/3 -IN -in/350 1 -In/2 1 -Ina/3 -inability/15 1 -inaccessibility/2 1 -inaccessible/19 1 -inaccuracy/15 1 -inaccurate/8 1 -inaction/2 1 -inactivate/6 1 -inactivation/2 1 -inactive/8 1 -inactivity/2 1 -inadequacy/15 1 -inadequate/8 1 -inadmissibility/2 1 -inadmissible 1 -inadvertence/2 1 -inadvertent/8 1 -inadvisability/2 1 -inadvisable 1 -inadvisedly -inalienability/2 1 -inalienable/19 1 -inamorata/1 1 -inane/45 1 -inanimate/16 1 -inanity/15 1 -inapplicability 1 -inapplicable 1 -inappreciable/19 1 -inapproachable 1 -inappropriate/16 1 -inapt/16 1 -inarguable 1 -inarticulacy 1 -inarticulate/16 1 -inartistic 1 -inasmuch -inattention/2 1 -inattentive/16 1 -inaudibility/2 1 -inaudible/19 1 -inaugural/1 1 -inaugurate/6 1 -inauguration/1 1 -inauspicious/8 1 -inauthentic -inboard/1 1 -inborn 1 -inbound 1 -inbred 753 -inbreed/121 754 -inbreeding/2 1 -inbuilt 1 -Inc -inc/11 1 -Inca/1 1 -incalculable/19 1 -incandescence/2 1 -incandescent/8 1 -incantation/1 1 -incantatory -incant 1 -incapability/2 1 -incapable/19 1 -incapacitate/6 1 -incapacitation 1 -incapacity/2 1 -incarcerate/6 1 -incarceration/1 1 -incarnadine/6 1 -incarnate/6 1 -incarnation/1 1 -incautious/8 1 -inced 1 -incendiary/15 1 -incense/28 1 -incentive/1 1 -inception/1 1 -incertitude/2 1 -incessant/8 1 -incest/1 1 -incestuous/16 1 -inch/22 1 -inchoate 1 -Inchon/2 1 -inchworm/1 1 -incidence/1 1 -incident/1 1 -incidental/30 1 -incinerate/6 1 -incineration/2 1 -incinerator/1 1 -incipience/2 1 -incipient/8 1 -incise/6 1 -incision/1 1 -incisive/16 1 -incisor/1 1 -incite/6 1 -incitement/1 1 -inciter/1 1 -incivility/15 1 -incl -inclemency/2 1 -inclement 1 -inclination/1 1 -incline/28 1 -inclining 1 -inclose/6 1 -inclosure/1 1 -include/6 1 -included 1 -inclusion/1 1 -inclusive/16 1 -incognito/1 1 -incoherence/2 1 -incoherency 1 -incoherent/8 1 -incombustible 1 -income/73 1 -incomer/10 1 -incoming 1 -incommensurable 1 -incommensurate/8 1 -incommode/6 1 -incommodious 1 -incommunicable 1 -incommunicado -incomparable/19 1 -incompatibility/15 1 -incompatible/82 1 -incompetence/2 1 -incompetency/2 1 -incompetent/30 1 -incomplete/16 1 -incomprehensibility/2 1 -incomprehensible/19 1 -incomprehension/2 1 -incompressible 1 -inconceivability/2 1 -inconceivable/19 1 -inconclusive/16 1 -incongruity/15 1 -incongruous/16 1 -inconsequential/8 1 -inconsiderable 1 -inconsiderate/16 1 -inconsideration/2 1 -inconsistency/15 1 -inconsistent/8 1 -inconsolable/19 1 -inconspicuous/16 1 -inconstancy/2 1 -inconstant/8 1 -incontestability/2 1 -incontestable/19 1 -incontinence/2 1 -incontinent/8 1 -incontrovertible/19 1 -inconvenience/28 1 -inconvenient/8 1 -incorporable -incorporate/6 1 -Incorporated -incorporated 1 -incorporation/2 1 -incorporeal 1 -incorrect/16 1 -incorrigibility/2 1 -incorrigible/19 1 -incorruptibility/2 1 -incorruptible/19 1 -increase/28 1 -increased 1 -increasing/8 1 -incredibility/2 1 -incredible/19 1 -incredulity/2 1 -incredulous/8 1 -increment/23 1 -incremental -incrementally -incrementation -incriminate/6 1 -incriminating 1 -incrimination/2 1 -incriminatory -incrust/11 1 -incrustation/1 1 -incubate/6 1 -incubation/2 1 -incubator/1 1 -incubus/4 1 -inculcate/6 1 -inculcation/2 1 -inculpable 1 -inculpate/6 1 -incumbency/15 1 -incumbent/1 1 -incumber/11 1 -incunabula 755 -incunabulum/2 756 -incur/13 1 -incurable/82 1 -incurious 1 -incursion/1 1 -ind -Ind -indebted/33 1 -indecency/15 1 -indecent/75 1 -indecipherable 1 -indecision/2 1 -indecisive/16 1 -indeclinable 1 -indecorous/8 1 -indeed 1 -indefatigable/19 1 -indefeasible/19 1 -indefensible/19 1 -indefinable/19 1 -indefinite/16 1 -indelible/19 1 -indelicacy/15 1 -indelicate/8 1 -indemnification/1 1 -indemnify/31 1 -indemnity/15 1 -indemonstrable 1 -indent/23 1 -indentation/1 1 -indention/2 1 -indenture/28 1 -independence/2 1 -Independence/2 1 -independent/30 1 -indescribable/19 1 -indestructibility/2 1 -indestructible/19 1 -indeterminable/19 1 -indeterminacy/2 1 -indeterminate/8 1 -index/22 1 -indexation/1 1 -indexer/1 1 -indexing 1 -India/2 1 -Indian/1 1 -Indiana/2 1 -Indianan/1 1 -Indianapolis/2 1 -Indianian 1 -Indian 1 -indicant/10 1 -indicate/6 1 -indication/1 1 -indicative/30 1 -indicator/1 1 -indict/11 1 -indictable 1 -indictment/1 1 -indie/10 1 -Indies -indifference/2 1 -indifferent/8 1 -indigence/2 1 -indigenous 1 -indigent/30 1 -indigestible 1 -indigestion/2 1 -indignant/8 1 -indignation/2 1 -indignity/15 1 -indigo/2 1 -Indira/3 -indirect/16 1 -indirection/1 1 -indirect 1 -indiscernible 1 -indiscipline 1 -indiscreet/8 1 -indiscretion/1 1 -indiscriminate/8 1 -indispensability/2 1 -indispensable/82 1 -indispose/214 1 -indisposed 1 -indisposition/1 1 -indisputable/19 1 -indissolubility 1 -indissoluble/19 1 -indistinct/16 1 -indistinguishable/19 1 -indite/6 1 -indium/2 1 -individual/30 1 -individualism/2 1 -individualist/1 1 -individualistic/39 1 -individuality/2 1 -individualization/2 1 -individualize/6 1 -individuate/6 1 -individuation/2 1 -indivisibility/2 1 -indivisible/19 1 -Indochina/2 1 -Indochinese -indoctrinate/6 1 -indoctrination/1 1 -indoctrinator/10 1 -indolence/2 1 -indolent/8 1 -indomitable/19 1 -Indonesia/2 1 -Indonesian/1 1 -indoor/10 1 -Indore -indorse/6 1 -Indra/2 1 -indrawn 1 -indubitable/19 1 -induce/6 1 -inducement/1 1 -inducer/1 1 -inducible -induct/11 1 -inductance/2 1 -inductee/1 1 -induction/1 1 -inductive/8 1 -inductor/10 1 -indue/6 1 -indulge/6 1 -indulgence/18 1 -indulgent/8 1 -indulger 1 -Indus/2 1 -industrial/8 1 -industrialism/2 1 -industrialist/1 1 -industrialization/2 1 -industrialize/6 1 -industrial 1 -industrious/16 1 -industry/15 1 -indwell/351 1 -Indy/3 -inebriate/28 1 -inebriation/2 1 -inedible -ineducable -ineffability/2 1 -ineffable/19 1 -ineffective/16 1 -ineffectual/83 1 -inefficacy/2 1 -inefficiency/15 1 -inefficient/8 1 -inelastic -inelegance/2 1 -inelegant/8 1 -ineligibility/2 1 -ineligible/82 1 -ineluctable/19 1 -inept/16 1 -ineptitude/2 1 -inequality/15 1 -inequitable/19 1 -inequity/15 1 -ineradicable/19 1 -inerrant 1 -inert/16 1 -inertia/2 1 -inertial -inert 1 -Ines -inescapable/19 1 -inessential/1 1 -inestimable/19 1 -inevitability/2 1 -inevitable/352 1 -inexact/16 1 -inexactitude/10 1 -inexcusable/19 1 -inexhaustible/19 1 -inexorability 1 -inexorable/19 1 -inexpedience/2 1 -inexpediency/2 1 -inexpedient 1 -inexpensive/16 1 -inexperience/2 1 -inexperienced -inexpert/8 1 -inexpiable 1 -inexplicable/19 1 -inexpressibility 1 -inexpressible/19 1 -inexpressive 1 -inextensible -inextinguishable 1 -inextricable/19 1 -Inez/3 -inf -infallibility/2 1 -infallible/19 1 -infamous/8 1 -infamy/15 1 -infancy/2 1 -infant/1 1 -infanticide/1 1 -infantile -infantry/15 1 -infantryman/2 757 -infantrymen 758 -infant 1 -infarct/1 1 -infarction/2 1 -infatuate/43 1 -infatuated 1 -infatuation/1 1 -infeasibility 1 -infeasible 1 -infect/11 1 -infected 1 -infection/1 1 -infectious/16 1 -infective 1 -infect 1 -infelicitous 1 -infelicity/15 1 -infer/13 1 -inference/1 1 -inferential/8 1 -inferior/1 1 -inferiority/2 1 -inferior 1 -infernal/8 1 -inferno/1 1 -infertile 1 -infertility/2 1 -infest/11 1 -infestation/1 1 -infidel/1 1 -infidelity/15 1 -infield/1 1 -infielder/1 1 -infighter/1 1 -infighting/2 1 -infill/11 1 -infilling 1 -infiltrate/43 1 -infiltration/1 1 -infiltrator/1 1 -infinite/37 1 -infinitesimal/30 1 -infinitival 1 -infinitive/1 1 -infinitude/2 1 -infinity/15 1 -infirmary/15 1 -infirmity/15 1 -infirm 1 -infix 1 -inflame/6 1 -inflamed 1 -inflammability/2 1 -inflammable 1 -inflammation/1 1 -inflammatory 1 -inflatable/1 1 -inflate/6 1 -inflated 1 -inflation/2 1 -inflationary -inflect/11 1 -inflected 1 -inflection/1 1 -inflectional 1 -inflexibility/2 1 -inflexible/19 1 -inflexion/1 1 -inflict/11 1 -inflicter 1 -infliction/1 1 -inflictive -inflight 1 -inflorescence/2 1 -inflorescent -inflow/1 1 -inflowing -influence/28 1 -influential/8 1 -influenza/2 1 -influx/4 1 -info/2 1 -infold/11 1 -infomercial/1 1 -inform/11 1 -informal/8 1 -informality/2 1 -informant/1 1 -informatics -information/2 1 -informational -informative/16 1 -informatory -informed 1 -informer/1 1 -infotainment/2 1 -infraction/1 1 -infrared/2 1 -infrasonic -infrastructural -infrastructure/1 1 -infra 1 -infrequence/2 1 -infrequency/2 1 -infrequent/8 1 -infringe/6 1 -infringement/1 1 -infuriate/6 1 -infuriating/8 1 -infuse/6 1 -infuser/1 1 -infusion/1 1 -ING/3 -ingathered -Inge -ingenious/16 1 -ingenue/1 1 -ingenuity/2 1 -ingenuous/16 1 -ingest/11 1 -ingestion/2 1 -inglenook/1 1 -Inglewood -inglorious/8 1 -ingoing 1 -ingot/18 1 -ingrain/23 1 -ingrained 1 -ingrain 1 -Ingram/3 -ingrate/1 1 -ingratiate/6 1 -ingratiating/8 1 -ingratiation/2 1 -ingratitude/2 1 -ingredient/1 1 -Ingres -ingress/4 1 -ingression 1 -Ingrid/3 -ingrowing -ingrown 1 -inguinal -inhabit/11 1 -inhabitable -inhabitant/1 1 -inhabited 1 -inhalant/1 1 -inhalation/1 1 -inhalator/1 1 -inhale/6 1 -inhaler/1 1 -inharmonious 1 -inhere/6 1 -inherent/8 1 -inherit/11 1 -inheritable 1 -inheritance/1 1 -inheritor/1 1 -inhibit/11 1 -inhibition/1 1 -inhibitor/1 1 -inhibitory -inhomogeneity/60 1 -inhomogeneous 1 -inhospitable/19 1 -inhuman/8 1 -inhumane/8 1 -inhumanity/15 1 -inimical/8 1 -inimitable/19 1 -iniquitous/8 1 -iniquity/15 1 -initial/210 1 -initialization/10 1 -initialize/6 1 -initiate/28 1 -initiation/1 1 -initiative/1 1 -initiator/1 1 -initiatory 1 -inject/11 1 -injection/1 1 -injector/1 1 -injudicious/16 1 -injunction/1 1 -injure/6 1 -injured 1 -injurer/1 1 -injurious/8 1 -injury/15 1 -injustice/1 1 -ink/23 1 -inkblot/1 1 -inkling/1 1 -inkstand/1 1 -inkwell/1 1 -inky/49 1 -inland/2 1 -inlay/353 1 -inlaying 1 -inlet/18 1 -inline -inmate/1 1 -inmost 1 -inn/86 1 -innards/2 1 -innate/16 1 -innermost 1 -innersole/1 1 -innerspring -inner 1 -innervate/6 1 -innervation/2 1 -inning/1 1 -innit -innkeeper/1 1 -innocence/2 1 -Innocent/3 -innocent/183 1 -innocuous/16 1 -innovate/6 1 -innovation/1 1 -innovative 1 -innovator/1 1 -innovatory -Innsbruck -innuendo/18 1 -innumerable/19 1 -innumeracy/2 1 -innumerate 1 -inoculate/6 1 -inoculation/1 1 -inoffensive/16 1 -Inonu/3 -inoperable -inoperative 1 -inopportune/8 1 -inordinate/8 1 -inorganic/39 1 -inpatient/1 1 -input/109 1 -inquest/1 1 -inquietude/2 1 -inquire/6 1 -inquirer/1 1 -inquiring/8 1 -inquiry/15 1 -inquisition/1 1 -inquisitional -Inquisition 1 -inquisitive/16 1 -inquisitor/1 1 -inquisitorial/8 1 -inquorate -INRI -inroad/1 1 -inrush/4 1 -INS -insalubrious 1 -insane/45 1 -insanitary 1 -insanity/15 1 -insatiability/2 1 -insatiable/19 1 -inscribe/6 1 -inscriber/1 1 -inscription/1 1 -inscrutability/2 1 -inscrutable/29 1 -inseam/1 1 -insect/1 1 -insecticidal -insecticide/1 1 -insectivore/1 1 -insectivorous -insecure/8 1 -insecurity/15 1 -inseminate/6 1 -insemination/2 1 -insensate 1 -insensibility/2 1 -insensible/19 1 -insensitive/8 1 -insensitivity/2 1 -insentience/2 1 -insentient -inseparability/2 1 -inseparable/82 1 -insert/23 1 -insertion/1 1 -inset/128 1 -inshore 1 -inside/48 1 -insider/1 1 -insidious/16 1 -insight/1 1 -insightful 1 -insigne/354 1 -insignia/1 1 -insignificance/2 1 -insignificant/8 1 -insincere/8 1 -insincerity/2 1 -insinuate/6 1 -insinuating/8 1 -insinuation/1 1 -insinuative 1 -insinuator/1 1 -insipid/83 1 -insipidity/2 1 -insist/11 1 -insistence/2 1 -insistent/8 1 -insistingly -insobriety/2 1 -insofar -insole/1 1 -insolence/2 1 -insolent/8 1 -insolubility/2 1 -insoluble/19 1 -insolvable 1 -insolvency/15 1 -insolvent/1 1 -insomnia/2 1 -insomniac/1 1 -insomuch -insouciance/2 1 -insouciant 1 -inspect/11 1 -inspection/1 1 -inspector/1 1 -inspectorate/1 1 -inspiration/1 1 -inspirational 1 -inspire/6 1 -inspired 1 -inspiring 1 -inspirit/11 1 -inspiriting 1 -Inst -instability/15 1 -instal/61 1 -install/11 1 -installable -installation/1 1 -installer/1 1 -installing 1 -installment/1 1 -Instamatic/3 -instance/28 1 -instant/355 1 -instantaneous/8 1 -instantiate/6 1 -instantiation/10 1 -instate/6 1 -instead 1 -instep/1 1 -instigate/6 1 -instigation/2 1 -instigator/1 1 -instil/61 1 -instill/11 1 -instillation/2 1 -instilling 1 -instinct/1 1 -instinctive/8 1 -instinct 1 -instinctual 1 -institute/28 1 -instituter/1 1 -institution/1 1 -institutional/8 1 -institutionalism 1 -institutionalization/2 1 -institutionalize/6 1 -institutor/1 1 -instr -instruct/11 1 -instructed 1 -instruction/1 1 -instructional -instructive/8 1 -instructor/1 1 -instrument/23 1 -instrumental/30 1 -instrumentalist/1 1 -instrumentality/2 1 -instrumentation/2 1 -inst 1 -insubordinate 1 -insubordination/2 1 -insubstantial/8 1 -insufferable/19 1 -insufficiency/2 1 -insufficient/8 1 -insularity/2 1 -insular 1 -insulate/6 1 -insulation/2 1 -insulator/1 1 -insulin/2 1 -insult/23 1 -insulter 1 -insulting/8 1 -insuperable/19 1 -insupportable 1 -insurable -insurance/1 1 -insure/6 1 -insured/1 1 -insurer/1 1 -insurgence/1 1 -insurgency/15 1 -insurgent/1 1 -insurmountable/19 1 -insurrection/1 1 -insurrectionist/1 1 -insusceptible 1 -int -intact 1 -intaglio/18 1 -intake/1 1 -intangibility/2 1 -intangible/82 1 -integer/1 1 -integrability 1 -integrable -integral/30 1 -integrand/10 1 -integrate/6 1 -integration/1 1 -integrative -integrator/10 1 -integrity/2 1 -integument/1 1 -Intel/3 -intellect/1 1 -intellectual/30 1 -intellectualism/2 1 -intellectuality 1 -intellectualize/6 1 -intelligence/1 1 -intelligent/8 1 -intelligentsia/2 1 -intelligibility/2 1 -intelligible/19 1 -Intelsat -intemperance/2 1 -intemperate/8 1 -intend/11 1 -intended/1 1 -intense/45 1 -intensification/2 1 -intensifier/1 1 -intensify/31 1 -intensity/15 1 -intensive/36 1 -intent/36 1 -intention/1 1 -intentional/8 1 -intentionality 1 -intentioned -inter/356 1 -interact/11 1 -interaction/1 1 -interactive -interactively -interactiveness -interactivity -interbank -interbred 759 -interbreed/121 760 -interbreeding 1 -intercede/6 1 -intercept/23 1 -interception/1 1 -interceptor/1 1 -intercession/1 1 -intercessor/1 1 -intercessory -interchange/28 1 -interchangeability 1 -interchangeable/19 1 -intercity -intercollegiate -intercom/1 1 -intercommunicate/6 1 -intercommunication/2 1 -interconnect/11 1 -interconnected/153 1 -interconnection/1 1 -intercontinental -interconversion 1 -intercourse/2 1 -intercultural -interdenominational -interdepartmental 1 -interdependence/2 1 -interdependency 1 -interdependent/8 1 -interdict/23 1 -interdiction/2 1 -interdisciplinary -interest/23 1 -interested/8 1 -interesting/8 1 -interface/28 1 -interfacing 1 -interfaith -interfere/6 1 -interference/1 1 -interferer 1 -interfering 1 -interferometer/10 1 -interferometric 1 -interferometry 1 -interferon/2 1 -interfile/6 1 -intergalactic -interglacial 1 -intergovernmental -interim/2 1 -interior/1 1 -interj -interject/11 1 -interjection/1 1 -interjectional 1 -interlace/6 1 -interlaced 1 -interlard/11 1 -interleave/6 1 -interleukin/2 1 -interline/6 1 -interlinear 1 -interlingual -interlining/1 1 -interlink/5 1 -interlock/23 1 -interlocutor/1 1 -interlocutory 1 -interlope/6 1 -interloper/1 1 -interlude/28 1 -intermarriage/1 1 -intermarry/31 1 -intermediary/15 1 -intermediate/164 1 -interment/1 1 -intermezzo/65 1 -interminable/19 1 -intermingle/6 1 -intermission/1 1 -intermittent/8 1 -intermix/7 1 -intermolecular -intern/23 1 -internal/191 1 -internalization/2 1 -internalize/6 1 -international/30 1 -Internationale/2 1 -internationalism/2 1 -internationalist/1 1 -internationalization 1 -internationalize/6 1 -interne/28 1 -internecine -internee/1 1 -Internet/10 1 -internet 1 -internist/1 1 -internment/1 1 -internship/1 1 -intern 1 -internuclear -interocular -interoffice -interoperability 1 -interoperable -interpenetrate/6 1 -interpenetration 1 -interpersonal -interplanetary -interplay/18 1 -Interpol -interpolatable -interpolate/6 1 -interpolation/1 1 -interpose/6 1 -interposition/2 1 -interpret/11 1 -interpretable 1 -interpretation/1 1 -interpretative 1 -interpreter/1 1 -interpretive/8 1 -interracial 1 -interregnum/1 1 -interrelate/6 1 -interrelated/153 1 -interrelation/1 1 -interrelationship/1 1 -interrogate/6 1 -interrogation/1 1 -interrogative/30 1 -interrogator/1 1 -interrogatory/15 1 -interrupt/23 1 -interrupted 1 -interrupter/1 1 -interruptibility -interruption/1 1 -interscholastic -intersect/11 1 -intersection/1 1 -intersession/1 1 -intersperse/6 1 -interspersion/2 1 -interstate/1 1 -interstellar -interstice/1 1 -interstitial/8 1 -intertidal -intertwine/6 1 -intertwining 1 -interurban 1 -interval/1 1 -intervene/6 1 -intervention/1 1 -interventionism/2 1 -interventionist/1 1 -interview/23 1 -interviewee/1 1 -interviewer/1 1 -intervocalic 1 -interwar -interweave/357 761 -interwoven 762 -interwove 762 -intestacy/2 1 -intestate 1 -intestinal 1 -intestine/1 1 -intifada 1 -intimacy/15 1 -intimate/54 1 -intimation/1 1 -intimidate/6 1 -intimidatingly -intimidation/2 1 -intimidatory -intolerable/19 1 -intolerance/2 1 -intolerant/8 1 -intonation/1 1 -intonational -intone/6 1 -intoner/1 1 -intoning 1 -into 1 -intoxicant/1 1 -intoxicate/6 1 -intoxicated 1 -intoxicating 1 -intoxication/2 1 -intracellular 1 -intractability/2 1 -intractable/19 1 -intramural -intramuscular 1 -intranet/10 1 -intrans -intransigence/2 1 -intransigent/30 1 -intransitive/30 1 -intrastate -intrauterine -intravenous/358 1 -intrench/7 1 -intrepid/8 1 -intrepidity/2 1 -intricacy/15 1 -intricate/8 1 -intrigue/28 1 -intriguer/1 1 -intriguing/8 1 -intrinsic -intrinsically -intro/1 1 -introduce/6 1 -introduction/1 1 -introductory 1 -introit/1 1 -introspect/11 1 -introspection/2 1 -introspective/8 1 -introversion/2 1 -introvert/62 1 -intrude/6 1 -intruder/1 1 -intruding 1 -intrusion/1 1 -intrusive/16 1 -intrust/11 1 -intuit/11 1 -intuition/1 1 -intuitionist 1 -intuitive/16 1 -Inuit/1 1 -Inuktitut/3 -inundate/6 1 -inundation/1 1 -inure/6 1 -inured 1 -invade/6 1 -invader/1 1 -invalid/210 1 -invalidate/6 1 -invalidation/2 1 -invaliding 1 -invalidism/2 1 -invalidity/2 1 -invaluable/19 1 -Invar/2 1 -invariability/2 1 -invariable/82 1 -invariance 1 -invariant/10 1 -invasion/1 1 -invasive -invective/1 1 -inveigh/11 1 -inveigle/6 1 -inveigler/1 1 -invent/11 1 -invention/1 1 -inventive/16 1 -inventor/1 1 -inventory/56 1 -inverse/164 1 -inversion/1 1 -invert/23 1 -invertebrate/1 1 -inverter/10 1 -invertible -invest/11 1 -investigate/6 1 -investigation/1 1 -investigative -investigator/1 1 -investigatory -investiture/1 1 -investment/1 1 -investor/1 1 -inveteracy/2 1 -inveterate 1 -invidious/16 1 -invigilate/6 1 -invigilation 1 -invigilator/10 1 -invigorate/6 1 -invigorating/8 1 -invigoration/2 1 -invincibility/2 1 -invincible/19 1 -inviolability/2 1 -inviolable/19 1 -inviolate 1 -inviscid -invisibility/15 1 -invisible/19 1 -invitation/1 1 -invitational/1 1 -invite/28 1 -invitee/1 1 -inviting/8 1 -invocation/1 1 -invoice/28 1 -invokable -invoke/6 1 -invoker/10 1 -involuntary/72 1 -involute 1 -involution/1 1 -involve/6 1 -involved 1 -involvement/1 1 -invulnerability/2 1 -invulnerable/19 1 -inward/191 1 -Io/2 1 -ioctl -iodide/1 1 -iodine/2 1 -iodize/6 1 -ion/1 1 -Ionesco -Ionian/1 1 -Ionic/1 1 -ionic 1 -ionization/2 1 -ionize/6 1 -ionizer/1 1 -ionosphere/1 1 -ionospheric -iota/1 1 -IOU/2 1 -Iowa/1 1 -Iowan/1 1 -IPA -ipecac/1 1 -Iphigenia -iPod/3 -Ipswich -IQ/2 1 -Iqaluit/3 -Iqbal -Iquitos -Ir/2 1 -Ira/3 -IRA/1 1 -Iran/2 1 -Iranian/1 1 -Iraq/2 1 -Iraqi/1 1 -irascibility/2 1 -irascible/19 1 -irate/45 1 -irateness/3 -ire/2 1 -ireful 1 -Ireland/2 1 -Irene -irenic 1 -ire 1 -iridescence/2 1 -iridescent/8 1 -iridium/2 1 -Iris -iris/359 1 -Irish/161 1 -Irisher 1 -Irishman/2 763 -Irishmen 764 -Irishwoman/2 765 -Irishwomen 766 -irk/11 1 -irksome/16 1 -Irkutsk -Irma/3 -iron/23 1 -ironclad/1 1 -ironic -ironical/8 1 -ironing/2 1 -ironmonger/10 1 -ironmongery 1 -ironstone/2 1 -iron 1 -ironware/2 1 -ironwood/1 1 -ironwork/1 1 -irony/15 1 -Iroquoian/1 1 -Iroquois/2 1 -irradiate/6 1 -irradiation/2 1 -irrational/30 1 -irrationality/15 1 -Irrawaddy -irreclaimable 1 -irreconcilability/2 1 -irreconcilable/19 1 -irrecoverable/19 1 -irredeemable/19 1 -irreducibility 1 -irreducible/19 1 -irrefutable/19 1 -irregardless -irregular/30 1 -irregularity/15 1 -irrelevance/1 1 -irrelevancy/15 1 -irrelevant/8 1 -irreligious 1 -irremediable/19 1 -irremovable 1 -irreparable/19 1 -irreplaceable 1 -irrepressible/19 1 -irreproachable/19 1 -irresistible/19 1 -irresolute/16 1 -irresolution/2 1 -irresolvable 1 -irrespective/8 1 -irresponsibility/2 1 -irresponsible/19 1 -irretrievable/19 1 -irreverence/2 1 -irreverent/8 1 -irreversibility 1 -irreversible/19 1 -irrevocable/19 1 -irrigable 1 -irrigate/6 1 -irrigation/2 1 -irritability/2 1 -irritable/19 1 -irritant/1 1 -irritate/6 1 -irritated/8 1 -irritating/8 1 -irritation/1 1 -irrupt/11 1 -irruption/1 1 -irruptive 1 -IRS/2 1 -Irtish/2 1 -Irvin/3 -Irvine -Irving -Irwin/3 -Isaac/2 1 -Isabel/3 -Isabella -Isabelle/3 -Isaiah -ISBN -Iscariot -Isfahan -Isherwood -Ishim/3 -Ishmael 1 -Ishtar/2 1 -Isiah/3 -Isidro/3 -isinglass/2 1 -Isis/2 1 -isl -Islam/1 1 -Islamabad/2 1 -Islamic 1 -Islamism/2 1 -Islamist 1 -island/18 1 -islander/1 1 -isle/18 1 -islet/1 1 -ism/1 1 -Ismael/3 -Ismail/3 -isn't -ISO -isobar/1 1 -isobaric -isolate/6 1 -isolated 1 -isolate's -isolation/2 1 -isolationism/2 1 -isolationist/1 1 -isolator/10 1 -Isolde -isomer/1 1 -isomeric 1 -isomerism/2 1 -isometric/32 1 -isometrically -isomorphic -isomorphism/10 1 -isoperimetrical -isosceles -isostatic 1 -isotherm/1 1 -isothermal/8 1 -isotonic -isotope/1 1 -isotopic -isotropic -isotropically -isotropy 1 -Ispahan -Ispell/3 -Israel/1 1 -Israeli/1 1 -Israelite 1 -Issac/3 -Issachar -is 46 -issuable 1 -issuance/2 1 -issue/28 1 -issuer/1 1 -Istanbul/2 1 -isthmian 1 -isthmus/4 1 -i 767 -Isuzu/3 -It -IT -it/1 1 -Itaipu/3 -ital -Ital -Italian/1 1 -Italianate 1 -italic/130 1 -italicization/2 1 -italicize/6 1 -Italy/2 1 -Itasca/3 -itch/22 1 -itching 1 -itchy/49 1 -it'd -item/18 1 -itemization/2 1 -itemize/6 1 -item 1 -iterate/6 1 -iteration/1 1 -iterative/8 1 -iterator -iterators -Ithaca -Ithacan 1 -itinerant/1 1 -itinerary/15 1 -it'll -Ito -i 1 -itself 1 -iTunes/3 -IUD -IV/1 1 -Iva/3 -Ivan -Ivanhoe/3 -I've -Ives -ivied 1 -Ivorian 1 -Ivory/3 -ivory/15 1 -iv 1 -ivy/15 1 -Ivy 1 -ix 1 -Iyar/2 1 -Izaak/3 -Izanagi/2 1 -Izanami/2 1 -Izhevsk -Izmir -Izod/3 -Izvestia/3 -j -J/2 1 -jab/136 1 -jabber/23 1 -jabberer/1 1 -jabbering 1 -jabot/1 1 -jacaranda/1 1 -jack/23 1 -jackal/1 1 -jackass/4 1 -jackboot/1 1 -jackbooted -jackdaw/1 1 -jacket/62 1 -jackhammer/18 1 -Jackie/2 1 -jackknife/360 768 -jackknives 769 -Jacklyn/3 -jackpot/1 1 -jackrabbit/18 1 -Jackson/2 1 -Jacksonian 1 -Jacksonville/2 1 -jackstraw/1 1 -jack 1 -Jack 1 -Jacky/2 1 -Jaclyn/3 -Jacob/1 1 -Jacobean/2 1 -Jacobin/2 1 -Jacobi 770 -Jacobite/2 1 -Jacobson/3 -jacquard/2 1 -Jacquard 1 -Jacqueline/3 -Jacquelyn/3 -Jacques -jacuzzi 1 -Jacuzzi 1 -jade/28 1 -jaded/16 1 -jadeite/2 1 -jade 1 -jag/361 1 -jagged/21 1 -Jagger/3 -jaggies/89 1 -Jagiellon/3 -Jaguar/3 -jaguar/1 1 -Jahangir/3 -jail/23 1 -jailbird/1 1 -jailbreak/1 1 -jailer/1 1 -jailhouse/10 1 -jailor/1 1 -Jaime/3 -Jainism/2 1 -Jain 1 -Jaipur -Jakarta/2 1 -Jake/3 -jalapeno/1 1 -jalopy/15 1 -jalousie/1 1 -jam/160 1 -Jamaal/3 -Jamaica/2 1 -Jamaican/1 1 -Jamal/3 -Jamar/3 -jamb/18 1 -jambalaya/2 1 -jamboree/1 1 -Jame/3 -Jamel/3 -James/2 1 -Jamestown -Jami/3 -Jamie/3 -jammy/34 1 -Jan/2 1 -Jana/3 -Janacek/3 -Jane -Janell/3 -Janelle/3 -Janet -Janette/3 -jangle/28 1 -jangler/1 1 -jangling 1 -jangly 1 -Janice/3 -Janie/3 -Janine/3 -Janis/3 -Janissary/2 1 -janitor/1 1 -janitorial -Janjaweed/3 -Janna/3 -Jannie/3 -Jansen/2 1 -Jansenist/2 1 -January/15 1 -Janus/2 1 -japan/1 1 -Japan/2 1 -japan/192 1 -Japanese/1 1 -japan 1 -jape/28 1 -Japura/3 -jar/103 1 -jardiniere/1 1 -Jared/3 -jarful/1 1 -jargon/2 1 -Jarlsberg 1 -Jarred/3 -Jarrett/3 -jarring/8 1 -Jarrod/3 -Jarvis/3 -Jasmine/3 -jasmine/1 1 -Jason/2 1 -Jasper/3 -jasper/2 1 -Jataka -jato/1 1 -jaundice/28 1 -jaunt/23 1 -jaunty/50 1 -Java/1 1 -java/2 1 -Javanese/2 1 -JavaScript/3 -javelin/18 1 -Javier/3 -jaw/23 1 -jawbone/28 1 -jawboning 1 -jawbreaker/1 1 -jawing 1 -jawline/10 1 -Jaxartes -Jay -jay/1 1 -Jayapura/3 -Jayawardene/3 -jaybird/1 1 -Jaycee/10 1 -Jayne/3 -Jayson/3 -jaywalk/11 1 -jaywalker/1 1 -jaywalking/2 1 -jazz/22 1 -jazzy/34 1 -jct -JCS -JD -jealous/8 1 -jealousy/15 1 -jean/130 1 -Jean/2 1 -Jeanette/3 -Jeanie/3 -Jeanine/3 -Jeanne/3 -Jeannette/3 -Jeannie/3 -Jeannine/3 -Jed/3 -Jedi/3 -jeep/18 1 -Jeep 1 -jeer/23 1 -jeering/37 1 -Jeeves/3 -jeez -Jeff/3 -Jefferey/3 -Jefferson/2 1 -Jeffersonian 1 -Jeffery/3 -Jeffrey -Jeffry/3 -jehad/1 1 -Jehoshaphat -Jehovah/2 1 -jejuna 771 -jejune 1 -jejunum/2 772 -Jekyll/3 -jell/11 1 -jellied 1 -jello/1 1 -jelly/31 1 -jellybean/1 1 -jellyfish/4 1 -jellylike 1 -jellyroll/1 1 -jelly's -jemmy/362 1 -Jenifer/3 -Jenkins -Jenna/3 -Jenner -jennet/1 1 -Jennie/3 -Jennifer/3 -Jennings/3 -Jensen/3 -Jenny/3 -jenny/15 1 -jeopardize/6 1 -jeopardy/2 1 -Jephthah -Jerald/3 -jeremiad/1 1 -Jeremiah/1 1 -Jeremy/3 -Jeri/3 -Jericho/2 1 -jerk/23 1 -jerkin/1 1 -jerking 1 -jerkwater 1 -jerky/363 1 -Jermaine/3 -jeroboam/10 1 -Jeroboam 1 -Jerold/3 -Jerome -Jerri/3 -Jerrod/3 -Jerrold/3 -Jerry/2 1 -jerrybuilt -jerrycan/10 1 -jersey/1 1 -Jersey/1 1 -Jerusalem/2 1 -Jess/3 -jessamine/1 1 -Jesse -Jessica/3 -Jessie/3 -jest/23 1 -jester/1 1 -jesting/8 1 -Jesuit/1 1 -Jesus -jet/109 1 -jetliner/1 1 -jetport/1 1 -jetsam/2 1 -jetting 1 -jettison/23 1 -jet 1 -Jetway -jetty/167 1 -Jew/1 1 -Jewel/3 -jewel/23 1 -jeweler/1 1 -jeweleries -jewelery -Jewell/3 -jewellery's -jewelry/15 1 -Jewess/4 1 -Jewish/153 1 -Jewry 1 -Jezebel/1 1 -JFK/3 -jg -jib/136 1 -jibbing 1 -jibe/28 1 -Jidda -jiff/1 1 -jiffy/15 1 -jig/92 1 -jigger/23 1 -jigging 1 -jiggle/28 1 -jiggly/34 1 -jigsaw/23 1 -jihad/1 1 -Jilin -Jillian/3 -Jill 1 -jilt/23 1 -Jim/3 -Jimenez/3 -Jimmie/3 -Jimmy/3 -jimmy/56 1 -jimmying 773 -jimsonweed/2 1 -Jinan -jingle/28 1 -jingling 1 -jingly/34 1 -jingoism/2 1 -jingoist/1 1 -jingoistic 1 -jingoist 1 -jingo 1 -jink/11 1 -jinn/1 1 -Jinnah -jinni/364 1 -jinricksha/1 1 -jinrikisha/1 1 -jinriksha/1 1 -jinx/22 1 -Jinny/3 -jitney/18 1 -jitter/58 1 -jitterbug/92 1 -jitterbugger/2 1 -jitters's -jittery/34 1 -jiujitsu/2 1 -Jivaro 1 -jive/28 1 -Jo/3 -Joan -Joann/3 -Joanna/3 -Joanne/3 -Joaquin/3 -job/1 1 -Job/1 1 -job/145 1 -jobber/1 1 -jobholder/1 1 -jobless/33 1 -jobshare -jobshares -jobsworth/10 1 -Jocasta -Jocelyn/3 -Jock -jock/18 1 -Jockey -jockey/23 1 -jockstrap/1 1 -jocose/16 1 -jocosity/2 1 -jocular/8 1 -jocularity/2 1 -jocund/8 1 -jocundity/2 1 -jodhpurs -jodhpurs's -Jodi/3 -Jodie/3 -Jody/3 -Joel -Joesph/3 -Joe 1 -Joey/3 -joey/10 1 -jog/92 1 -jogger/1 1 -jogging/2 1 -joggle/28 1 -Jogjakarta/3 -Johann/3 -Johanna/3 -Johannes -Johannesburg/2 1 -john/1 1 -John/1 1 -Johnathan/3 -Johnathon/3 -Johnie/3 -Johnnie 1 -Johnson/2 1 -Johnston/3 -johnny/15 1 -Johnny/2 1 -johnnycake/1 1 -join/23 1 -joiner/1 1 -joinery/2 1 -joining 1 -joint/210 1 -jointed 1 -jointing 1 -jointures 1 -joist/18 1 -jojoba 1 -joke/28 1 -joker/1 1 -jokey 774 -jokier 775 -jokiest 775 -jokily -joking/8 1 -joky/34 1 -Jolene/3 -Joliet -jollification/1 1 -jollily -jollity/2 1 -Jolson -jolt/23 1 -jolter/1 1 -jolting 1 -jolly/365 1 -jolly's -Jon/3 -Jonah/1 1 -Jonas -Jonathan/2 1 -Jonathon/3 -Jones 1 -Joni/3 -jonquil/1 1 -Jonson -Joplin -Jordan/2 1 -Jordanian/1 1 -Jorge/3 -Jose/3 -Josef/3 -Josefa/3 -Josefina/3 -Joseph/1 1 -Josephine -Josephson/3 -Josephus -Josh -josh/22 1 -josher/1 1 -Joshua/2 1 -Josiah -Josie/3 -jostle/28 1 -jostling 1 -Josue/2 1 -jot/109 1 -jotter/1 1 -jotting/1 1 -Joule -joule/1 1 -jounce/28 1 -jouncy/34 1 -journal/18 1 -journalese/2 1 -journalism/2 1 -journalist/1 1 -journalistic 1 -journey/23 1 -journeyer/1 1 -journeyman/2 776 -journeymen 777 -journo/10 1 -joust/23 1 -jouster/1 1 -jousting's -Jove/2 1 -jovial/8 1 -joviality/2 1 -Jovian 1 -jowl/1 1 -jowly/34 1 -Joy/3 -joy/23 1 -Joyce -Joycean -joyful/85 1 -joyless/16 1 -Joyner/3 -joyous/16 1 -joyride/366 778 -joyrider/1 1 -joyriding/2 1 -joyrode 779 -joystick/1 1 -JP -Jpn -Jr/2 1 -Juan/3 -Juana/3 -Juanita/3 -Juarez/2 1 -Jubal -jubilant/8 1 -jubilation/2 1 -jubilee/1 1 -Judah -Judaical -Judaic 1 -Judaism/1 1 -Judas/4 1 -Judd/3 -judder/11 1 -Jude -Judea -judge/28 1 -Judges -judgeship/2 1 -judgment/1 1 -judgmental -judgmentally -judicatory/15 1 -judicature/2 1 -judicial/8 1 -judiciary/15 1 -judicious/16 1 -Judith/2 1 -judo/2 1 -Judson/3 -Judy -jug/92 1 -jugful/1 1 -juggernaut/1 1 -Juggernaut/2 1 -juggle/28 1 -juggler/1 1 -jugglery/2 1 -juggling 1 -jugular/1 1 -juice/28 1 -juicer/1 1 -juicy/50 1 -jujitsu/2 1 -jujube/1 1 -jujutsu/2 1 -jukebox/4 1 -Jul -julep/1 1 -Jules -Julia/3 -Juliana -Julianne/3 -Julian 1 -Julie/1 1 -julienne 1 -Juliet -Juliette/3 -Julio/3 -Julius/3 -Julliard/3 -July/3 -jumble/28 1 -jumbo/1 1 -jump/23 1 -jumper/1 1 -jumping 1 -jumpsuit/1 1 -jumpy/50 1 -jun -Jun -junco/1 1 -junction/1 1 -juncture/1 1 -June/1 1 -Juneau/2 1 -Jung/2 1 -Jungfrau -Jungian 1 -jungle/1 1 -junior/1 1 -Junior/1 1 -juniority 1 -junior 1 -juniper/1 1 -junk/23 1 -junker/1 1 -Junker/1 1 -junket/23 1 -junketeer/18 1 -junketer/1 1 -junketing 1 -junkie/41 1 -junky/42 1 -junkyard/1 1 -Juno/2 1 -junta/1 1 -Jupiter/2 1 -Jurassic/2 1 -juridic -juridical/8 1 -jurisdiction/1 1 -jurisdictional 1 -jurisprudence/2 1 -jurisprudential 1 -jurist/1 1 -juristic 1 -juror/1 1 -Jurua/3 -jury/167 1 -juryman/2 780 -jurymen 781 -jury 1 -jurywoman/2 782 -jurywomen 783 -jussive 1 -just/21 1 -juster 1 -justice/1 1 -Justice/2 1 -justifiability 1 -justifiable/19 1 -justification/1 1 -justificatory -justified 1 -justify/31 1 -Justin/3 -Justine/3 -Justinian/3 -just 1 -jut/109 1 -jute/2 1 -Jutland/2 1 -jutting 1 -Juvenal -juvenile/1 1 -juxtapose/6 1 -juxtaposition/1 1 -JV -K/1 1 -k/10 1 -Kaaba -kabob/1 1 -kaboom -kabuki/2 1 -Kabul/2 1 -kaddish/4 1 -kaffeeklatch/4 1 -kaffeeklatsch/4 1 -Kafka/2 1 -Kafkaesque -kaftan/1 1 -Kagoshima -Kahlua/2 1 -kahuna/10 1 -Kaifeng -kaiser/1 1 -Kaiser/1 1 -Kaitlin/3 -Kalahari/2 1 -Kalamazoo -Kalashnikov -Kalb/3 -kale/2 1 -kaleidoscope/1 1 -kaleidoscopic -kaleidoscopically -Kalevala -Kalgoorlie -Kali/2 1 -Kalmyk 1 -Kama/2 1 -Kamchatka -Kamehameha/3 -kamikaze/1 1 -Kampala/2 1 -Kampuchea/2 1 -Kan -Kanchenjunga/2 1 -Kandahar -Kandinsky -Kane/3 -kangaroo/18 1 -Kannada/2 1 -Kano -Kanpur -Kans -Kansan/1 1 -Kansas -Kant/2 1 -Kantian 1 -Kaohsiung -kaolin/2 1 -kapok/2 1 -Kaposi/3 -kappa/1 1 -kaput 1 -Kara/3 -Karachi/2 1 -Karaganda -Karakorum -karakul/2 1 -Karamazov/3 -karaoke/1 1 -karat/1 1 -karate/2 1 -Kareem/3 -Karen/2 1 -Karenina/3 -Kari/3 -Karin/3 -Karina/3 -Karl/3 -Karla/3 -Karloff/3 -karma/2 1 -karmic 1 -Karo/3 -Karol/3 -Karroo/2 1 -kart/1 1 -Karyn/3 -Kasai/3 -Kasey/3 -Kashmir/1 1 -Kasparov/3 -Kate/3 -Katelyn/3 -Katharine/3 -Katherine/3 -Katheryn/3 -Kathiawar -Kathie/3 -Kathleen/3 -Kathmandu/2 1 -Kathrine/3 -Kathryn/3 -Kathy/3 -Katie/3 -Katina/3 -Katmai -Katmandu/2 1 -Katowice -Katrina/3 -Katy/3 -katydid/1 1 -Kauai/2 1 -Kaufman/3 -Kaunas/2 1 -Kaunda/3 -Kawabata/3 -Kawasaki -Kay -kayak/23 1 -kayaking/2 1 -Kaye/3 -Kayla/3 -kayo/23 1 -Kazakh/1 1 -Kazakhstan/2 1 -Kazan/2 1 -Kazantzakis -kazoo/1 1 -Kb/2 1 -KB/2 1 -KC -kc 1 -KDE -Keaton/3 -Keats -kebab/1 1 -kebob/1 1 -Keck/3 -kedgeree 1 -keel/23 1 -keelhaul/11 1 -keeling 1 -keen/52 1 -Keenan/3 -keener 1 -keep/86 784 -keeper/1 1 -keeping/2 1 -keepsake/1 1 -Keewatin -keg/18 1 -Keillor/3 -Keisha/3 -Keith/3 -Keller -Kelley/3 -Kelli/3 -Kellie/3 -Kellogg -kelp/2 1 -kelpers -kelp 1 -Kelsey/3 -Kelt/1 1 -Kelvin -kelvin/1 1 -Kelly -Kemerovo -Kemp/3 -Kempis -Ken -ken/133 1 -Kendall/3 -Kendra/3 -Kendrick/3 -Kenmore/3 -Kennan/3 -Kennedy/2 1 -kennel/23 1 -Kenneth/3 -kenning 1 -Kennith/3 -keno/2 1 -Kent/2 1 -Kenton/3 -Kentuckian/1 1 -Kentucky/2 1 -Kenya/2 1 -Kenyan/1 1 -Kenyatta -Kenny/3 -Kenyon/3 -Keogh/3 -Keokuk/3 -kepi/1 1 -Kepler/2 1 -kept 785 -keratin/2 1 -kerbside -kerchief/18 1 -Kerensky/3 -kerfuffle/58 1 -Keri/3 -Kermit/3 -Kern -kerned -kernel/18 1 -kerning 1 -kerosene/2 1 -kerosine/2 1 -Kerouac -Kerr -Kerri/3 -Kerry 1 -kestrel/1 1 -ketch/4 1 -ketchup/2 1 -Kettering -kettle/1 1 -kettledrum/1 1 -kettleful 1 -Keven/3 -Kevin/3 -Kevlar 1 -Kevorkian/3 -Kewpie 1 -Key -key/23 1 -keyboard/23 1 -keyboarder/1 1 -keyboardist/1 1 -keyhole/1 1 -Keynes/2 1 -Keynesian 1 -keynote/28 1 -keynoter/1 1 -keypad/1 1 -keypunch/22 1 -keypuncher/1 1 -keyring -keystone/1 1 -keystroke/18 1 -key 1 -keyword/1 1 -KFC/3 -KGB -kg 1 -Khabarovsk -Khachaturian -khaki/1 1 -Khalid/3 -khalif/10 1 -Khan/3 -khan/1 1 -Kharkov/2 1 -Khartoum/2 1 -Khayyam/3 -Khazar/3 -Khmer/2 1 -Khoikhoi/2 1 -Khoisan/2 1 -Khomeini/3 -Khorana/3 -Khrushchev -Khufu -Khulna/3 -Khwarizmi/3 -Khyber/3 -kHz 1 -KIA -kibble/28 1 -kibbutz/367 1 -kibbutzes -kibitz/7 1 -kibitzer/1 1 -kibosh/2 1 -kick/23 1 -Kickapoo 1 -kickback/1 1 -kickball/2 1 -kickboxing 1 -kicker/1 1 -kickoff/1 1 -kickstand/1 1 -kicky/34 1 -kid/113 1 -Kidd/2 1 -kidder/1 1 -kiddie/18 1 -kiddish 1 -kiddo/1 1 -kiddy/167 1 -kidnap/105 1 -kidnaper/1 1 -kidnapper/1 1 -kidnapping/1 1 -kidney/1 1 -kidskin/2 1 -Kiel -kielbasa/368 1 -Kierkegaard -Kieth/3 -Kiev/2 1 -Kigali/2 1 -kike/10 1 -Kikuyu 1 -Kilauea -Kilimanjaro/2 1 -kill/23 1 -killdeer/1 1 -killer/1 1 -killing/1 1 -killjoy/1 1 -kiln/23 1 -kilo/1 1 -kilobits -kilobyte/1 1 -kilocycle/1 1 -kilogram/1 1 -kilohertz/2 1 -kilojoules -kiloliter/1 1 -kilometer/1 1 -kiloton/1 1 -kilowatt/1 1 -Kilroy/3 -kilt/62 1 -kilter/2 1 -Kim/3 -Kimberley -Kimberly/3 -kimono/1 1 -kin/1 1 -kind/369 1 -kinda 1 -kindergarten/1 1 -kindergartener/1 1 -kindergartner/1 1 -kindhearted/16 1 -kindle/6 1 -kindling/2 1 -kindly/140 1 -kindred/2 1 -kine/10 1 -kinematic/32 1 -kine 786 -kines 1 -kinetic/35 1 -kinfolk/130 1 -king/1 1 -King/1 1 -king/58 1 -kingdom/1 1 -kingfisher/1 1 -kingly/34 1 -kingmaker/10 1 -kingpin/1 1 -kingship/2 1 -Kingston/2 1 -Kingstown/2 1 -king 1 -kink/23 1 -Kinko's -kinky/50 1 -Kinney/3 -Kinsey -kinsfolk/2 1 -Kinshasa/2 1 -kinship/2 1 -kinsman/2 787 -kinsmen 788 -kinswoman/2 789 -kinswomen 790 -kin 1 -kiosk/1 1 -Kiowa/1 1 -Kip/3 -kip/47 1 -Kipling/2 1 -kipper/23 1 -Kirby/3 -Kirchhoff -Kirchner/3 -Kirghistan/3 -Kirghiz/2 1 -Kirghizia/2 1 -Kiribati/2 1 -Kirinyaga/3 -Kirk -kirk/18 1 -Kirkland/3 -Kirkpatrick/3 -Kirov -kirsch/4 1 -Kirsten/3 -Kisangani -Kishinev/2 1 -Kislev/2 1 -kismet/2 1 -kiss/22 1 -kissable 1 -kissagram/10 1 -kisser/1 1 -Kissinger -kissoff/1 1 -kissogram/10 1 -Kit/3 -kit/109 1 -Kitakyushu/2 1 -kitbag/1 1 -kitchen/18 1 -Kitchener -kitchenette/1 1 -kitchenware/2 1 -kite/28 1 -kith/2 1 -kitsch/2 1 -kitschy 1 -kitten/18 1 -kittenish 1 -kittiwakes -Kitty/3 -kitty/15 1 -Kiwanis -kiwi/1 1 -kiwifruit/1 1 -KKK/2 1 -kl -Klan/2 1 -Klansman/2 1 -Klaus/3 -klaxon/10 1 -Klee -Kleenex/4 1 -Klein/3 -kleptomania/2 1 -kleptomaniac/1 1 -Klimt -Kline -Klingon/3 -Klondike/18 1 -kludge/6 1 -kluge/6 1 -klutz/4 1 -klutziness/3 -klutzy/34 1 -Kmart/3 -km 1 -kn -knack/18 1 -knacker/5 1 -knackwurst/1 1 -Knapp/3 -knapsack/1 1 -knave/1 1 -knavery/2 1 -knavish/8 1 -knead/11 1 -kneader/1 1 -knee/63 1 -kneecap/47 1 -kneecapping 1 -kneel/141 791 -kneeling 1 -knell/23 1 -knelt 792 -Knesset/2 1 -knew 793 -Kngwarreye/3 -knicker/32 1 -knickerbockers -knickerbockers's -Knickerbocker 1 -knickknack/1 1 -Knievel/3 -knife/360 794 -knight/23 1 -knighthood/1 1 -knightly/140 1 -Knight 1 -knish/4 1 -knit/109 1 -knitter/1 1 -knitting/2 1 -knitwear/2 1 -knives 795 -knob/1 1 -knobbly 1 -knobby/34 1 -knock/23 1 -knockabout 1 -knockdown/1 1 -knocker/1 1 -knocking/10 1 -knockoff/1 1 -knockout/1 1 -knockwurst/1 1 -knoll/18 1 -Knopf/3 -Knossos -knot/109 1 -knothole/1 1 -knotting 1 -knotty/34 1 -know/370 796 -knowable 1 -knowing/371 1 -knowledge/2 1 -knowledgeable/19 1 -Knowles -known 1 -Knox -Knoxville -knuckle/28 1 -knuckleduster/10 1 -knucklehead/1 1 -Knudsen/3 -knurl/23 1 -knurling 1 -Knuth/1 1 -KO/2 1 -koala/1 1 -koan/10 1 -Kobe -Koch -Kochab/3 -Kodachrome/3 -Kodak -Kodaly/3 -Kodiak/2 1 -Koestler -Kohinoor -Kohl -kohlrabi/4 1 -kohlrabies 1 -kohl 1 -Koizumi/3 -Kojak/3 -kola/1 1 -Koln/2 1 -Kolyma -Kommunizma/3 -Kong/3 -Kongo/2 1 -Konrad/3 -kook/18 1 -kookaburra/1 1 -kookie/150 1 -kookiness/3 -kooky/34 1 -Koontz/3 -kopeck/1 1 -kopek/1 1 -Koppel/3 -Koran/1 1 -Koranic -Korea/2 1 -Korean/1 1 -korma 1 -Kornberg/3 -Kory/3 -Korzybski -Kosciusko -kosher/5 1 -Kossuth -Kosygin -Koufax/3 -Kowloon -kowtow/23 1 -KP -kph 1 -Kr/2 1 -kraal/18 1 -Kraft/3 -Krakatau/2 1 -Krakatoa/2 1 -Krakow/2 1 -Kramer/3 -Krasnodar -Krasnoyarsk -kraut/80 1 -Krebs -Kremlin -Kremlinologist 1 -Kremlinology 1 -Kresge/3 -kriegspiel 1 -krill/2 1 -Kringle/3 -Kris/3 -Krishna/2 1 -Krishnamurti/3 -Krista/3 -Kristen/3 -Kristi/3 -Kristie/3 -Kristin/3 -Kristina/3 -Kristine/3 -Kristopher/3 -Kristy/3 -Kroc/3 -Kroger/3 -krona/372 1 -krone/373 1 -Kronecker/3 -Kropotkin -Kruger -Krugerrand 1 -Krupp -krypton/2 1 -Krystal/3 -KS -Kshatriya/2 1 -kt -k 1 -Kublai/3 -Kubrick -kuchen/1 1 -kudos -kudos's -kudzu/1 1 -Kuhn/3 -Kuibyshev -kulaks -Kulthumm/3 -kumquat/1 1 -Kunming -Kuomintang 1 -Kurdish/2 1 -Kurdistan 1 -Kurd 1 -Kurile -Kurosawa -Kurt/3 -Kurtis/3 -Kusch/3 -Kutuzov -Kuwait/2 1 -Kuwaiti/1 1 -Kuznets/3 -Kuznetsk/3 -kvetch/22 1 -kw -Kwakiutl/2 1 -Kwan/3 -Kwangchow/2 1 -Kwangju -Kwanza/1 1 -Kwanzaa/1 1 -kWh -kW 1 -Ky -KY -Kyle/3 -kyle/10 1 -Kyoto/2 1 -Kyrgyzstan -Kyushu/2 1 -l/374 1 -L/2 1 -l/10 1 -LA -la/2 1 -La/2 1 -lab/1 1 -Laban -label/23 1 -labellings -labial/1 1 -labia 797 -labile 1 -labium/2 798 -labor/23 1 -laboratory/15 1 -labored 1 -laborer/1 1 -laboring 1 -laborious/16 1 -laborsaving -Labrador/1 1 -Labradorean 1 -Labradorian 1 -Lab 1 -laburnum/1 1 -labyrinth/1 1 -labyrinthine -lac/375 1 -lace/28 1 -lacerate/6 1 -laceration/1 1 -lacewing/1 1 -lacework/2 1 -Lacey/3 -Lachesis/2 1 -lachrymal 1 -lachrymose 1 -lacier 799 -laciest 799 -lacing 1 -lack/23 1 -lackadaisical/8 1 -lackey/18 1 -lackluster 1 -laconic -laconically -lacquer/23 1 -lacquering 1 -lacrimal 1 -lacrosse/2 1 -lactate/43 1 -lactation/2 1 -lacteal 1 -lactic 1 -lactose/2 1 -lacuna/53 1 -Lacy/3 -lacy/34 1 -lad/18 1 -ladder/23 1 -laddie/1 1 -laddish -laddishness -lade/376 1 -laden 1 -lading/1 1 -ladle/28 1 -ladling 1 -Ladoga -Ladonna/3 -lady/15 1 -ladybird/1 1 -ladybug/1 1 -ladyfinger/1 1 -ladylike 1 -ladylove/1 1 -ladyship/1 1 -Ladyship/1 1 -Lady 1 -laetrile/2 1 -Lafayette -Lafitte/3 -lag/92 1 -lager/18 1 -laggard/30 1 -lagging/2 1 -lagnappe/1 1 -lagniappe/1 1 -lagoon/1 1 -Lagos/2 1 -Lagrange -Lagrangian 1 -Lahore -lain 800 -lair/18 1 -laird/1 1 -laity/2 1 -Laius -Lajos/3 -lake/18 1 -lakefront/10 1 -Lakeisha/3 -lakeside 1 -Lakewood -Lakisha/3 -Lakota 1 -Lakshmi/2 1 -lallygag/117 1 -lam/160 1 -lama/1 1 -Lamaism/1 1 -Lamar/3 -Lamarck/2 1 -lamasery/15 1 -Lamaze 1 -Lamb -lamb/23 1 -lambada/1 1 -lambast/11 1 -lambaste/6 1 -lambda/1 1 -lambency/2 1 -lambent/8 1 -Lambert -lambkin/1 1 -Lamborghini/3 -Lambrusco 1 -lambskin/1 1 -lambswool -lame/107 1 -lamebrain/1 1 -lamed 1 -lament/23 1 -lamentable/19 1 -lamentation/1 1 -Lamentations -lamented 1 -lamenting 1 -lamer/10 1 -lamina/53 1 -laminar -laminate/28 1 -lamination/2 1 -lamming 1 -Lamont/3 -L'Amour -lamp/18 1 -lampblack/2 1 -lamplight/2 1 -lamplighter/1 1 -lampoon/23 1 -lampoonery 1 -lamppost/1 1 -lamprey/1 1 -lampshade/1 1 -lam 1 -LAN/2 1 -Lana/3 -lanai/1 1 -Lanai/2 1 -Lancashire 1 -Lancaster/2 1 -Lance/3 -lance/28 1 -Lancelot/2 1 -lancer/1 1 -lancet/1 1 -Land -land/78 1 -landau/1 1 -lander 1 -landfall/1 1 -landfill/18 1 -landforms -landholder/1 1 -landholding/1 1 -landing/1 1 -landlady/15 1 -landless/2 1 -landlines -landlocked -landlord/1 1 -landlubber/1 1 -landmark/18 1 -landmass/4 1 -landmine/10 1 -Landon/3 -landowner/1 1 -landownership 1 -landowning/1 1 -Landry/3 -Landsat 1 -landscape/28 1 -landscaper/1 1 -landslide/377 1 -landslid 1 -landslip/10 1 -landsman/2 801 -landsmen 802 -Landsteiner/3 -landward/10 1 -Lane/3 -lane/1 1 -Lang -Langerhans/3 -Langland -Langley -Langmuir -language/1 1 -languid/16 1 -languish/7 1 -languishing 1 -languor/1 1 -languorous/8 1 -lank/21 1 -lanky/49 1 -lanolin/2 1 -Lansing/2 1 -lantern/18 1 -lanthanum/2 1 -Lanzhou/2 1 -lanyard/1 1 -Lanny/3 -Lao/1 1 -Laocoon/2 1 -Laotian/1 1 -Lao 1 -lap/47 1 -lapboard/1 1 -lapdog/1 1 -lapel/1 1 -lapidary/15 1 -lapin/1 1 -Laplace -Lapland/2 1 -Laplander 1 -Lapp/1 1 -lappet/1 1 -lapping 1 -laps/7 1 -lapse/28 1 -laptop/1 1 -lapwing/1 1 -Lara/3 -Laramie/3 -larboard/1 1 -larcenist/1 1 -larcenous 1 -larceny/15 1 -larch/4 1 -lard/23 1 -larder/1 1 -Lardner/3 -lardy/34 1 -Laredo -large/25 1 -largehearted -largess/2 1 -largesse/2 1 -larges 1 -largish 1 -largo/1 1 -lariat/18 1 -lark/23 1 -larkspur/1 1 -Larousse -Larry/3 -Lars -Larsen/3 -Larson/3 -larva/53 1 -larval 1 -laryngeal 1 -laryngitis/2 1 -larynx/201 1 -lasagna/1 1 -lasagne/1 1 -Lascaux/3 -lascivious/16 1 -lase/6 1 -laser/1 1 -lash/22 1 -lashing/1 1 -lass/4 1 -Lassa/2 1 -Lassen/3 -Lassie/3 -lassie/1 1 -lassitude/2 1 -lasso/23 1 -la's 803 -last/210 1 -lasting/8 1 -la 804 -Lat -lat/378 1 -Latasha/3 -latch/22 1 -latchkey/1 1 -late/27 1 -latecomer/1 1 -latency/15 1 -latent 1 -lateral/210 1 -lateralization 1 -Lateran/3 -latest/2 1 -latex/2 805 -lath/23 1 -lathe/28 1 -lather/23 1 -lathery 1 -lathes 806 -lathing 1 -latices 807 -Latin/129 1 -Latina 1 -Latino/1 1 -Latisha/3 -latish 1 -latitude/1 1 -latitudinal 1 -latitudinarian/1 1 -Latonya/3 -Latoya/3 -latrine/1 1 -Latrobe/3 -latte/1 1 -latter/8 1 -latter's -lattice/77 1 -latticework/1 1 -Latvia/2 1 -Latvian/1 1 -Laud -laud/23 1 -laudable/19 1 -laudanum/2 1 -laudatory 1 -Lauder -Laue -laugh/23 1 -laughable/19 1 -laughing/37 1 -laughingstock/1 1 -laughter/2 1 -launch/22 1 -launcher/1 1 -launchpad/1 1 -launder/5 1 -launderer/1 1 -launderette/1 1 -laundress/4 1 -laundrette/1 1 -laundromat/1 1 -Laundromat 1 -laundry/15 1 -laundryman/2 808 -laundrymen 809 -laundrywoman/2 810 -laundrywomen 811 -Laura/3 -Laurasia/2 1 -laureate/18 1 -laureateship/2 1 -laureate 1 -Laurel/3 -laurel/18 1 -Lauren/3 -Laurence/3 -Laurent/3 -Laurie/3 -Lauri's 812 -Lauri 813 -lav/70 1 -lava/1 1 -lavage/2 1 -Laval -lavalier/1 1 -lavaliere/1 1 -lavatorial -lavatory/15 1 -lave/6 1 -lavender/18 1 -Lavern/3 -Laverne/3 -lavish/379 1 -lavisher 1 -Lavoisier -Lavonne/3 -law/18 1 -Lawanda/3 -lawbreaker/1 1 -lawbreaking/2 1 -lawful/16 1 -lawgiver/1 1 -lawless/16 1 -lawmaker/1 1 -lawmaking/2 1 -lawman/2 814 -lawmen 815 -lawn/1 1 -lawnmower/1 1 -Lawrence -lawrencium/2 1 -Lawson 1 -lawsuit/1 1 -law 1 -lawyer/18 1 -lax/380 1 -laxative/1 1 -laxity/2 1 -lay/381 1 -layabout/10 1 -Layamon -layaway/2 1 -layer/23 1 -layering/2 1 -layette/1 1 -laying 1 -Layla/3 -layman/2 816 -laymen 817 -layoff/1 1 -layout/1 1 -layover/1 1 -laypeople 818 -layperson/1 819 -lay 800 -layup/1 1 -laywoman/2 820 -laywomen 821 -Lazaro/3 -Lazarus/2 1 -laze/28 1 -lazuli 1 -lazy/143 1 -lazybones/2 1 -lb/10 1 -LBJ/3 -lbw -LC -LCD/2 1 -LCM -LDC -Le/3 -Lea/3 -lea/1 1 -Leach/3 -leach/156 1 -leaching 1 -lead/23 822 -Leadbelly -leaded 1 -leaden 1 -leader/1 1 -leaderless 1 -leadership/1 1 -leading/2 1 -leaf/115 1 -leafage/2 1 -leafless 1 -leaflet/23 1 -leafstalk/1 1 -leafy/259 1 -league/28 1 -Leah -leak/23 1 -leakage/1 1 -Leakey/2 1 -leaky/49 1 -Lean/3 -lean/165 1 -Leander -leaner 1 -leaning/1 1 -Leann/3 -Leanna/3 -Leanne/3 -leap/23 1 -leaper/1 1 -leapfrog/92 1 -Lear/2 1 -Learjet/3 -learn/11 1 -learned/8 1 -learner/1 1 -learning/2 1 -Leary/3 -leas/7 1 -lease/28 1 -leaseback/1 1 -leasehold/1 1 -leaseholder/1 1 -leaser/1 1 -leash/22 1 -leasing 1 -least/2 823 -leastways 1 -leastwise 1 -leather/18 1 -leatherette/2 1 -leatherneck/1 1 -leather 1 -leathery 1 -leave/28 824 -leaved 1 -leaven/23 1 -leavening/2 1 -Leavenworth -leaver/1 1 -leaving/32 1 -Lebanese/2 1 -Lebanon/2 1 -lebensraum 1 -Lebesgue/3 -Leblanc/3 -lech/7 1 -lecher/18 1 -lecherous/16 1 -lechery/2 1 -lech's -lecithin/2 1 -lectern/1 1 -lecture/28 1 -lecturer/1 1 -lectureship/1 1 -LED/2 1 -Leda 825 -Lederberg/3 -ledge/18 1 -ledger/18 1 -led 826 -lee/48 1 -Lee/2 1 -leech/22 1 -Leeds/2 1 -leek/1 1 -leer/23 1 -leering/8 1 -leery/49 1 -lees 827 -Leeuwenhoek -Leeward/3 -leeward/1 1 -leeway/2 1 -left/188 1 -leftie/1 1 -leftism/2 1 -leftist/1 1 -leftmost 1 -leftover/1 1 -left 828 -Left 1 -leftward/10 1 -lefty/15 1 -leg/92 1 -legacy/15 1 -legal/30 1 -legalese/1 1 -legalism/1 1 -legalistic/39 1 -legality/15 1 -legalization/2 1 -legalize/6 1 -legate/18 1 -legatee/1 1 -legation/1 1 -legato/1 1 -legend/1 1 -legendary/211 1 -Legendre -Leger/3 -legerdemain/2 1 -leggin/1 1 -legging/1 1 -leghorn/1 1 -Leghorn 1 -legibility/2 1 -legible/19 1 -legion/1 1 -legionary/15 1 -legionnaire/1 1 -legion 1 -legislate/6 1 -legislation/2 1 -legislative/8 1 -legislator/1 1 -legislature/1 1 -legitimacy/2 1 -legitimate/68 1 -legitimation 1 -legitimatize/6 1 -legitimization/2 1 -legitimize/6 1 -legit 1 -legless 1 -legman/2 829 -legmen 830 -Lego/3 -Legree/3 -legroom/1 1 -legstraps -legume/1 1 -leguminous -legwarmer/10 1 -legwork/2 1 -leggy/49 1 -Lehman/3 -lei/1 1 -Leibniz/2 1 -Leicester/1 1 -Leiden/2 1 -Leif/3 -Leigh -Leila/3 -Leipzig/2 1 -leis 831 -leisure/37 1 -leisured -leisurely/140 1 -leisurewear/2 1 -leitmotif/1 1 -leitmotiv/1 1 -Lela/3 -Leland/3 -Lelia/3 -Lemaitre/3 -lemma/10 1 -lemme -lemming/1 1 -lemon/18 1 -lemonade/1 1 -lemongrass 1 -lemony 1 -Lemuel/3 -lemur/1 1 -Lemuria/3 -Len/3 -Lena/2 1 -Lenard/3 -lend/382 1 -lender/1 1 -lending 1 -L'Enfant -length/1 1 -lengthen/11 1 -lengthways 1 -lengthwise 1 -lengthy/50 1 -lenience/2 1 -leniency/2 1 -lenient/8 1 -Lenin/2 1 -Leningrad/2 1 -Leninism/2 1 -Leninist 1 -lenitive 1 -Lennon/3 -Leno/3 -Lenoir/3 -Lenora/3 -Lenore/3 -lens/182 1 -Lent/1 1 -Lenten -lenten 1 -lentil/1 1 -lento 1 -Lenny/3 -Leo/1 1 -Leola/3 -Leon -Leona/3 -Leonard/3 -Leonardo/2 1 -Leoncavallo -Leonel/3 -Leonidas/2 1 -Leonid 1 -leonine 1 -Leonor/3 -leopard/1 1 -leopardess/4 1 -leopardskin -Leopold/3 -Leopoldo/3 -leotard/1 1 -leper/1 1 -Lepidus -Lepke/3 -leprechaun/1 1 -leprosy/2 1 -leprous 1 -lepta 832 -lepton/1 833 -Lepus/2 1 -Lerner -Leroy/3 -Les -Lesa/3 -lesbian/1 1 -lesbianism/2 1 -lesbian 1 -lesion/18 1 -Lesley/3 -Leslie/3 -Lesotho/2 1 -less/161 834 -lessee/1 1 -lessen/11 1 -Lesseps -lesser 835 -Lessie/3 -lesson/18 1 -lessor/1 1 -less 835 -Lester/3 -Lestrade/3 -let/128 1 -Leta/3 -letch/205 1 -letdown/1 1 -Letha/3 -lethal/8 1 -lethality 1 -lethal 1 -lethargic/39 1 -lethargy/2 1 -Lethe/2 1 -Leticia/3 -Letitia/3 -letter/23 1 -letterbomb/10 1 -letterbox/205 1 -letterer/1 1 -letterhead/1 1 -lettering/2 1 -Letterman/3 -letterpress/2 1 -letting/10 1 -lettuce/1 1 -letup/1 1 -leucotomy/60 1 -leukemia/2 1 -leukemic/1 1 -leukocyte/1 1 -Levant/2 1 -levee/18 1 -level/383 1 -leveler/1 1 -levelest -levelheaded -levelheadedness/3 -leveling 1 -lever/23 1 -leverage/28 1 -Levesque/3 -Levi/1 1 -leviathan/1 1 -Leviathan 1 -levier/1 1 -Levine/3 -levitate/6 1 -levitation/2 1 -Leviticus/2 1 -Levitt/3 -levity/2 1 -Levy/3 -levy/56 1 -Lew/3 -lewd/21 1 -Lewinsky/3 -Lewis -lexeme/10 1 -lexer -lexers -lexical/8 1 -lexicographer/1 1 -lexicographic -lexicographical/8 1 -lexicography/2 1 -lexicon/1 1 -Lexington/2 1 -lexis 1 -Lexus/3 -lg -LG -Lhasa/1 1 -Lhotse/2 1 -Li/2 1 -liability/15 1 -liable 1 -liaise/6 1 -liaison/1 1 -liar/1 1 -lib/2 1 -libation/1 1 -libber/1 1 -Libby -libel/23 1 -libeler/1 1 -libelous 1 -Liberace/3 -liberal/36 1 -liberalism/2 1 -liberality/2 1 -liberalization/1 1 -liberalize/6 1 -liberate/6 1 -liberation/2 1 -liberationists -liberator/1 1 -Liberia/2 1 -Liberian/1 1 -libero 1 -libertarian/1 1 -libertarianism 1 -libertine/1 1 -liberty/15 1 -libidinal 1 -libidinous 1 -libido/1 1 -Libra/1 1 -librarian/1 1 -librarianship 1 -library/15 1 -librettist/1 1 -libretto/1 1 -Libreville/2 1 -Librium/2 1 -lib 1 -Libya/2 1 -Libyan/1 1 -license/28 1 -licensee/1 1 -licentiate/1 1 -licentious/16 1 -lice 836 -lichee/1 1 -lichen/62 1 -Lichtenstein -licit/8 1 -lick/23 1 -lickerish 1 -licking/1 1 -licorice/1 1 -lid/329 1 -Lidia/3 -lidless 1 -lido/1 1 -Lie -lie/77 837 -Lieberman/3 -Liebfraumilch 1 -Liechtenstein/2 1 -Liechtensteiner/1 1 -lied/384 1 -lief/166 1 -Liege/3 -liege/1 1 -lien/1 1 -lieu/2 1 -Lieut -lieutenancy/2 1 -lieutenant/1 1 -life/2 838 -lifebelt/10 1 -lifeblood/2 1 -lifeboat/1 1 -lifeboatmen 839 -lifebuoy/1 1 -lifeforms -lifeguard/18 1 -lifeless/16 1 -lifelike 1 -lifeline/1 1 -lifelong -lifer/1 1 -lifesaver/1 1 -lifesaving/2 1 -lifespan/10 1 -lifestyle/1 1 -lifetaking -lifetime/1 1 -lifework/1 1 -LIFO -lift/23 1 -lifter/1 1 -liftoff/1 1 -ligament/1 1 -ligand/10 1 -ligate/6 1 -ligation/2 1 -ligature/28 1 -light/52 840 -lighten/11 1 -lightener/1 1 -lightening 1 -lighter/18 1 -lightface/2 1 -lightfaced -lightface 1 -lightheaded -lighthearted/16 1 -lighthouse/1 1 -lighting/2 1 -lightning/62 1 -lightproof 1 -lightship/1 1 -lightweight/1 1 -ligneous 1 -lignite/2 1 -lii -likability/2 1 -likable/33 1 -like/385 1 -likeability -likeable 1 -likelihood/1 1 -likely/140 1 -liken/11 1 -liker 1 -likewise -liking/1 1 -Lila/3 -lilac/1 1 -Lilian/3 -Liliana/3 -Lilia's 841 -Lilia 842 -lilies -Lilith/2 1 -Liliuokalani -Lille -Lillian/3 -Lillie/3 -Lilliput/2 1 -Lilliputian/1 1 -lilliputian 1 -lilo -Lilongwe/2 1 -lilos -lilt/23 1 -lily/3 -Lily/3 -Lilly/3 -Lima/2 1 -limb/18 1 -Limbaugh/3 -limber/386 1 -limbless 1 -Limbo -limbo/18 1 -Limburger 1 -lime/28 1 -limeade/1 1 -limekiln 1 -limelight/2 1 -limerick/1 1 -limescale -limestone/2 1 -lime 1 -limey/10 843 -limier 844 -limiest 844 -liming 1 -limit/23 1 -limitation/1 1 -limited 1 -limiter/1 1 -limiting/10 1 -limitless/33 1 -limn/11 1 -limo/1 1 -Limoges -Limousin/2 1 -limousine/1 1 -limp/52 1 -limper 1 -limpet/1 1 -limpid/16 1 -limpidity/2 1 -limping 1 -Limpopo/2 1 -limy/34 1 -Lin/3 -Lina/3 -linage/2 1 -linchpin/1 1 -Lincoln/1 1 -linctus 1 -Lind -Linda/3 -Lindbergh -linden/1 1 -Lindsay -Lindsey -Lindy 1 -line/28 1 -lineage/1 1 -lineal/8 1 -lineament/1 1 -linear/8 1 -linearity/2 1 -linearized -linebacker/1 1 -linefeed 1 -lineman/2 845 -linemen 846 -linen/130 1 -liner/1 1 -linesman/2 847 -linesmen 848 -lineup/1 1 -ling/1 1 -linger/11 1 -lingerer/1 1 -lingerie/2 1 -lingering/191 1 -lingo/4 1 -lingual 1 -linguine/2 1 -linguini's -linguist/1 1 -linguistic/32 1 -linguistically -liniment/1 1 -lining/1 1 -link/23 1 -linkable -linkage/1 1 -linker/10 1 -linkman 849 -linkmen 850 -linkup/1 1 -Linnaeus/2 1 -linnet/1 1 -linoleum/2 1 -lino 1 -Linotype 1 -linseed/2 1 -lint/23 1 -lintel/1 1 -Linton/3 -linty/34 1 -Linus/3 -Linux/89 1 -Linwood/3 -lion/1 1 -Lionel/3 -lioness/3 -lionesses -lionhearted 1 -lionization/2 1 -lionize/6 1 -lip/387 1 -lipase 1 -lipid/1 1 -Lipizzaner 1 -liposuction/2 1 -Lippi -Lippmann -lippy/34 1 -lipread/121 1 -lipreader/2 1 -lipreading/2 1 -Lipscomb/3 -lipstick/23 1 -Lipton/3 -lip 1 -liq -liquefaction/2 1 -liquefy/31 1 -liqueur/18 1 -liquid/1 1 -liquidate/6 1 -liquidation/1 1 -liquidator/1 1 -liquidity/2 1 -liquidize/6 1 -liquidizer/1 1 -liquid 1 -liquify/31 1 -liquor/23 1 -liquorice/1 1 -liquorish -lira/388 1 -Lisa/3 -Lisbon/2 1 -lisle/2 1 -lisp/23 1 -lisper/1 1 -lisping 1 -Lissajous/3 -lissom/153 1 -lissome/153 1 -list/23 1 -listen/11 1 -listenable -listener/1 1 -listen's -Lister/2 1 -listeria 1 -Listerine/3 -listing/1 1 -listless/16 1 -Liston/3 -Liszt -lit/389 1 -litany/15 1 -litchi/1 1 -lite/336 1 -liter/1 1 -literacy/2 1 -literal/36 1 -literalism 1 -literalistic 1 -literary/140 1 -literate/30 1 -literati's 851 -literati 852 -literature/2 1 -lite 1 -lithe/27 1 -lithesome -lithium/2 1 -lithograph/23 1 -lithographer/1 1 -lithographic -lithographically -lithography/2 1 -lithological 1 -lithology 1 -lithosphere/1 1 -Lithuania/2 1 -Lithuanian/1 1 -litigant/1 1 -litigate/6 1 -litigation/2 1 -litigator/1 1 -litigious/33 1 -litmus/2 1 -litotes -litotes's -lit 853 -litter/23 1 -litterateur/1 1 -litterbug/1 1 -litterer/1 1 -Little/3 -little/162 854 -Litton/3 -littoral/1 1 -lit 1 -liturgical/8 1 -liturgist/1 1 -liturgy/15 1 -livability/2 1 -livable 1 -live/390 1 -liveable 1 -livelihood/1 1 -livelong/10 1 -lively/140 1 -liven/11 1 -liver/18 1 -liveried -liverish 1 -Liverpool/2 1 -Liverpudlian/1 1 -liverwort/1 1 -liverwurst/2 1 -livery/15 1 -liveryman/2 855 -liverymen 856 -livery 1 -lives 857 -livestock/2 1 -liveware/10 1 -Livia/3 -livid/8 1 -living/1 1 -Livingston -Livingstone -living 1 -Livonia/2 1 -Livy -lix -Liz/3 -Liza/3 -lizard/1 1 -Lizzie/3 -Lizzy/3 -Ljubljana/2 1 -ll -LL -llama/1 1 -llano/1 1 -LLB/2 1 -LLD/2 1 -Llewellyn -Lloyd -Ln -LNG -lo -load/23 1 -loadable -loader/1 1 -loading/1 1 -loadstar/1 1 -loadstone/1 1 -loaf/115 1 -loafer/1 1 -Loafer/1 1 -loafing 1 -loam/18 1 -loamy/34 1 -loan/23 1 -loanable -loaner/1 1 -loaning 1 -loansharking/2 1 -loanword/1 1 -loath/44 1 -loathe/253 1 -loather/1 1 -loathing/1 1 -loathsome/16 1 -lob/136 1 -Lobachevsky -lobar 1 -lobber/1 1 -lobby/56 1 -lobbying 1 -lobbyist/1 1 -lobe/77 1 -lobotomist -lobotomize/6 1 -lobotomy/15 1 -lobster/18 1 -local/164 1 -locale/18 1 -locality/15 1 -localization/1 1 -localize/6 1 -locatable -locate/6 1 -location/1 1 -locational -locative 1 -locator/1 1 -loch/1 1 -Lochinvar -loci 858 -lock/23 1 -lockable -Locke/2 1 -Lockean -locker/1 1 -locket/1 1 -Lockheed/3 -lockjaw/2 1 -lockout/1 1 -locksmith/1 1 -lockstep/2 1 -lockup/1 1 -Lockwood/3 -loco/391 1 -locomotion/2 1 -locomotive/1 1 -loco 1 -locoweed/1 1 -locum/10 1 -locus/2 859 -locust/1 1 -locution/1 1 -lode/1 1 -lodestar/1 1 -lodestone/1 1 -Lodge -lodge/28 1 -lodgement 1 -lodger/1 1 -lodging/130 1 -Lodz/2 1 -Loewe -Loewi -Loews/3 -loft/23 1 -lofty/50 1 -log/152 1 -Logan/2 1 -loganberry/15 1 -logarithm/1 1 -logarithmic/39 1 -logbook/1 1 -loge/1 1 -logger/1 1 -loggerhead/1 1 -loggia/1 1 -logging/2 1 -logic/2 1 -logical/8 1 -logicality/2 1 -logician/1 1 -logistic/32 1 -logistical/8 1 -logjam/1 1 -LOGO -logo/1 1 -logotype/1 1 -logrolling/2 1 -logy/34 1 -Lohengrin -loin/1 1 -loincloth/1 1 -Loire/2 1 -Lois/3 -loiter/11 1 -loiterer/1 1 -loitering/2 1 -Loki/2 1 -Lola/3 -Lolita 1 -loll/5 1 -Lollard 1 -lollies -lolling 1 -lollipop/1 1 -Lollobrigida/3 -lollop/11 1 -lolly -lollygag/117 1 -lollypop/1 1 -Lombard/2 1 -Lombardi/3 -Lombardy/2 1 -Lome/2 1 -Lon/3 -London/2 1 -Londoner/1 1 -lone/392 1 -lonely/140 1 -loner/1 1 -lonesome/16 1 -Long -long/179 1 -longboat/1 1 -longbow/1 1 -longer 1 -longevity/2 1 -Longfellow/2 1 -longhair/1 1 -longhand/2 1 -longhorn/1 1 -longhouse/10 1 -longing/30 1 -longish 1 -longitude/1 1 -longitudinal/8 1 -longshoreman/2 860 -longshoremen 861 -longsighted 1 -longstanding -Longstreet/3 -longsword -longtime 1 -Longueuil -longueur/1 1 -longways 1 -longwise 1 -Lonnie/3 -loo/70 1 -loofah/1 1 -look/23 1 -lookalike/1 1 -looker/1 1 -looking 1 -lookout/1 1 -loom/23 1 -loon/1 1 -looney/2 862 -loonier 863 -loonies 864 -looniest 863 -loony/42 1 -loop/23 1 -loophole/18 1 -looping 1 -loopy/34 1 -loos/393 1 -loose/104 1 -loosen/11 1 -loot/23 1 -looter/1 1 -looting/2 1 -lop/394 1 -lope/28 1 -Lopez/3 -lopper/58 1 -lopping 1 -lopsided/16 1 -loquacious/16 1 -loquacity/2 1 -Lora/3 -Loraine/3 -lord/1 1 -Lord/1 1 -lord/11 1 -lording 1 -lordly/49 1 -lordship/1 1 -Lordship/1 1 -lore/2 1 -L'Oreal -Lorelei/2 1 -Loren -Lorena/3 -Lorene/3 -Lorentz -Lorenz -Lorenzo/3 -Loretta/3 -lorgnette/1 1 -Lori/3 -Lorie/3 -loris/4 1 -Lorna/3 -lorn 1 -Lorraine/2 1 -Lorre/3 -Lorrie/3 -lorry/15 1 -lorryload -lorryloads -losable 1 -lose/395 1 -loser/1 1 -losing/1 1 -loss/4 1 -lot/1 1 -Lot/2 1 -lot/58 1 -Lothario/1 1 -loth 1 -lotion/1 1 -Lott/3 -lottery/15 1 -Lottie/3 -lotto/2 1 -lot 1 -lotus/4 1 -Lou/3 -louche 1 -loud/396 1 -loudhailer/1 1 -loudmouth/1 1 -loudmouthed -loudspeaker/1 1 -Louella/3 -lough/10 1 -Louie/3 -Louis -Louisa/3 -Louise/3 -Louisiana/2 1 -Louisianan/1 1 -Louisianian/1 1 -Louisville/2 1 -lounge/28 1 -lounger/1 1 -lounging 1 -lour/11 1 -Lourdes -louring 1 -louse/28 865 -lousy/50 1 -lout/18 1 -loutish/83 1 -louver/62 1 -L'Ouverture -Louvre/2 1 -lovable/29 1 -Love/3 -love/28 1 -loveable 1 -lovebird/1 1 -lovechild/2 1 -Lovecraft/3 -Lovelace -loveless 1 -lovelies -lovelorn 1 -lovely/49 1 -lovely's -lovemaking/2 1 -lover/1 1 -loveseat/1 1 -lovesick 1 -lovestruck -lovey/10 1 -loving/8 1 -low/397 1 -lowborn 1 -lowboy/1 1 -lowbrow/1 1 -lowdown/2 1 -Lowe/3 -Lowell -Lowenbrau/3 -lower/5 1 -lowercase/2 1 -lowering 1 -lowermost -Lowery/3 -lowing 1 -lowish -lowland/129 1 -lowlander/1 1 -Lowlands -lowlife/1 1 -lowly/140 1 -lows 1 -lox/2 1 -loyal/75 1 -loyalism/2 1 -loyalist/1 1 -loyalty/15 1 -Loyang/2 1 -Loyd/3 -Loyola -lozenge/1 1 -LP/2 1 -LPG -LPN/1 1 -Lr -LSAT -LSD/2 1 -Lt -ltd -Ltd -Lu/2 1 -Luanda/2 1 -Luann/3 -luau/1 1 -Lubavitcher 1 -lubber/1 1 -lubberly 1 -lubber 1 -Lubbock -lube/28 1 -lubricant/1 1 -lubricate/6 1 -lubrication/2 1 -lubricator/1 1 -lubricious/8 1 -lubricity/2 1 -Lubumbashi -Lucas -Luce/3 -Lucia/3 -Lucian -Luciano/3 -lucid/16 1 -lucidity/2 1 -Lucien/3 -Lucifer/2 1 -Lucile/3 -Lucille/3 -Lucinda/3 -Lucio/3 -Lucite/1 1 -Lucius/3 -luck/23 1 -luckless 1 -Lucknow/2 1 -lucky/50 1 -lucrative/16 1 -lucre/2 1 -Lucretia -Lucretius -lucubrate/6 1 -lucubration/2 1 -Lucy/2 1 -Luddite/1 1 -Ludhiana -ludicrous/16 1 -ludo 1 -Ludwig/3 -Luella/3 -luff/5 1 -Lufthansa/3 -Luftwaffe -lug/92 1 -luge/70 1 -Luger/2 1 -luggage/2 1 -lugger/1 1 -lughole/10 1 -Lugosi/3 -lugsail/1 1 -lugubrious/16 1 -Luigi/3 -Luis/3 -Luisa/3 -Luke/2 1 -lukewarm/16 1 -Lula/3 -lull/23 1 -lullaby/167 1 -lulling 1 -Lulu/3 -lulu/10 1 -Lully -lumbago/2 1 -lumbar 1 -lumber/23 1 -lumberer/1 1 -lumbering/2 1 -lumberjack/1 1 -lumberman/2 866 -lumbermen 867 -lumberyard/1 1 -lumen 1 -Lumiere/3 -luminance 1 -luminary/15 1 -luminescence/2 1 -luminescent -luminosity/15 1 -luminous/8 1 -lummox/4 1 -lump/23 1 -lumpectomy/60 1 -lumpen 1 -lumpish 1 -lumpy/49 1 -Luna/2 1 -lunacy/15 1 -lunar 1 -lunatic/1 1 -lunch/22 1 -lunchbox/89 1 -luncheon/18 1 -luncheonette/1 1 -lunchpack -lunchroom/1 1 -lunchtime/1 1 -lune 1 -lung/23 1 -lunge/28 1 -lunges 868 -lungfish/4 1 -lungful/10 1 -lunkhead/1 1 -Lupe/3 -Lupercalia 1 -lupine/1 1 -lupus/2 1 -Lupus/2 1 -lurch/22 1 -lurching 1 -lure/28 1 -lurex 1 -lurgy -Luria/3 -lurid/16 1 -lurk/5 1 -lurker/10 1 -lurking 1 -Lusaka/2 1 -luscious/16 1 -lush/398 1 -lusher 1 -Lusitania/2 1 -lust/23 1 -luster/2 1 -lusterless 1 -luster 1 -lustful/8 1 -lustrous/8 1 -lusty/50 1 -lutanist/1 1 -lute/18 1 -lutenist/1 1 -lutetium/2 1 -Luther/2 1 -Lutheran/1 1 -Lutheranism/1 1 -luv/10 1 -Luvs/3 -luvvie/10 1 -Luxembourg/2 1 -Luxembourger/1 1 -Luxembourgian -Luxemburg/2 1 -luxuriance/2 1 -luxuriant/8 1 -luxuriate/6 1 -luxuriation/2 1 -luxurious/16 1 -luxury/15 1 -Luz/3 -Luzon/2 1 -lvi -lvii -LVN -Lvov -lxi -lxii -lxiv -lxix -lxvi -lxvii -Lyallpur -lyceum/1 1 -lychee/1 1 -lychgate/10 1 -Lycra 1 -Lycurgus -Lydia -Lydian/1 1 -lye/2 1 -Lyell -lying/2 869 -Lyle/3 -Lyly -Lyman/3 -Lyme/3 -lymph/2 1 -lymphatic/1 1 -lymphocyte/1 1 -lymphoid 1 -lymphoma/1 1 -Lynch -lynch/7 1 -lyncher/1 1 -lynching/1 1 -lynchpin/1 1 -Lynda/3 -Lyndon/3 -Lynette/3 -Lynn -Lynne/3 -Lynnette/3 -lynx/4 1 -Lyon/1 1 -Lyra/2 1 -lyre/1 1 -lyrebird/1 1 -lyric/18 1 -lyrical/8 1 -lyricism/2 1 -lyricist/1 1 -lyric 1 -Lysenko -lysine 1 -Lysistrata/3 -Lysol/2 1 -LyX/3 -M/1 1 -m/10 1 -ma/1 1 -MA/2 1 -Maalox/2 1 -ma'am -Mabel/3 -Mable/3 -mac/23 1 -macabre 1 -macadam/2 1 -macadamia/1 1 -macadamize/6 1 -Macao/2 1 -macaque/1 1 -macaroni/1 1 -macaroon/1 1 -MacArthur -Macaulay -macaw/1 1 -Macbeth -MacBride/3 -Maccabees -Maccabeus/3 -MacDonald -mace/28 1 -Macedon/2 1 -Macedonia/2 1 -Macedonian/1 1 -macerate/6 1 -maceration/2 1 -Mace 1 -mach/2 1 -machete/1 1 -Machiavelli/2 1 -Machiavellian 1 -machinable -machinate/6 1 -machination/1 1 -machine/28 1 -machinery/2 1 -machinist/1 1 -machismo/2 1 -macho/2 1 -Mach 1 -Macias/3 -Macintosh/3 -Mack/3 -mack/10 1 -Mackenzie/2 1 -mackerel/1 1 -Mackinac/3 -mackinaw/1 1 -Mackinaw 1 -mackintosh/4 1 -MacLeish/3 -Macmillan -Macon 1 -macrame/2 1 -macro/1 1 -macrobiotic/32 1 -macrocosm/1 1 -macroeconomic/32 1 -macrology/60 1 -macromolecular -macromolecules -macron/1 1 -macrophage/10 1 -macroscopic -macroscopically -macro 1 -Mac 1 -Macumba/3 -Macy/3 -mad/399 1 -Madagascan/1 1 -Madagascar/2 1 -madam/1 870 -madame/2 870 -madcap/1 1 -Madden/3 -madden/11 1 -maddeningly -maddening 1 -madder/1 1 -Maddox/3 -Madeira/1 1 -Madeleine/3 -Madeline/3 -Madelyn/3 -mademoiselle/1 871 -made 872 -Madge/3 -madhouse/1 1 -Madison/2 1 -madman/2 873 -madmen 874 -Madonna/1 1 -Madras/2 1 -madras/4 1 -Madrid/2 1 -madrigal/18 1 -mad's -Madurai/3 -madwoman/2 875 -madwomen 876 -Mae/3 -maelstrom/1 1 -maestro/1 1 -Maeterlinck/3 -mafia/1 1 -Mafia/1 1 -mafioso/323 1 -Mafioso 1 -mag/18 1 -magazine/1 1 -Magdalena -Magdalene/3 -Magellan/2 1 -Magellanic -magenta/2 1 -Maggie/3 -maggot/1 1 -maggoty/34 1 -Maghreb/3 -magic/64 1 -magical/8 1 -magician/1 1 -magic 1 -Maginot/3 -magi's 877 -magisterial/8 1 -magi 878 -Magi 879 -magistracy/2 1 -magistrate/1 1 -magma/1 1 -magmatic -magnanimity/2 1 -magnanimosity -magnanimous/8 1 -magnate/1 1 -magnesia/2 1 -magnesia's 880 -magnesia 881 -magnesium/2 882 -magnet/1 1 -magnetic/39 1 -magnetism/2 1 -magnetite/2 1 -magnetizable -magnetization/2 1 -magnetize/6 1 -magneto/1 1 -magnetodynamics -magnetohydrodynamical -magnetohydrodynamics -magnetometer/1 1 -magnetosphere 1 -magnetron 1 -magnification/1 1 -magnificence/2 1 -magnificent/8 1 -magnifier/1 1 -magnify/31 1 -magniloquence/2 1 -magniloquent 1 -Magnitogorsk -magnitude/1 1 -magnolia/1 1 -magnum/1 1 -Magog -Magoo/3 -magpie/1 1 -Magritte -Magsaysay/3 -Magus 883 -Magyar/1 1 -Mahabharata/2 1 -Mahabharata's 884 -Mahabharata 885 -maharaja/1 1 -maharajah/1 1 -maharanee/1 1 -maharani/1 1 -Maharashtra/2 1 -maharishi/1 1 -mahatma/1 1 -Mahavira/3 -Mahayana/2 1 -Mahayanist/2 1 -Mahdi 1 -Mahfouz/3 -Mahican/1 1 -mahjong/2 1 -Mahler -mahogany/15 1 -Mahomet/2 1 -mahout/1 1 -maid/1 1 -maiden/30 1 -Maidenform/3 -maidenhair/2 1 -maidenhead/1 1 -maidenhood/2 1 -maidenly 1 -maidservant/1 1 -Maigret/3 -mail/23 1 -mailable -mailbag/1 1 -mailbomb/11 1 -mailbox/4 1 -Mailer -mailer/1 1 -mailing/1 1 -Maillol -maillot/1 1 -mailman/2 886 -mailmen 887 -mailshot/10 1 -maim/5 1 -Maiman/3 -maimed 1 -maiming 1 -Maimonides -main/164 1 -mainbrace 1 -Maine/2 1 -Mainer/1 1 -mainframe/1 1 -mainland/1 1 -mainline/6 1 -mainline's -mainline 1 -mainmast/1 1 -mainsail/1 1 -mainspring/1 1 -mainstay/1 1 -mainstream/23 1 -mainstreaming 1 -mainstream 1 -maintain/11 1 -maintainability 1 -maintainable -maintainer/10 1 -maintenance/2 1 -maintop/1 1 -maiolica/2 1 -Maisie/3 -maisonette/1 1 -Maitreya/2 1 -maize/1 1 -Maj -majestic/39 1 -majesty/15 1 -Majesty 1 -majolica/2 1 -Major -major/23 1 -Majorca/2 1 -majordomo/1 1 -majorette/1 1 -majority/15 1 -majorly -major 1 -Majuro -Makarios/3 -make/73 888 -makeover/1 1 -Maker -maker/1 1 -makeshift/1 1 -makeup/1 1 -makeweight/10 1 -making/130 1 -Malabar/3 -Malabo/2 1 -Malacca -Malachi -malachite/2 1 -maladaptive -maladjusted -maladjustment/2 1 -maladministration 1 -maladroit/16 1 -malady/15 1 -Malagasy 1 -malaise/2 1 -Malamud -malamute/1 1 -Malaprop/3 -malapropism/1 1 -malaria/2 1 -malarial -malarkey/2 1 -malathion/2 1 -Malawi/2 1 -Malawian/1 1 -Malay/1 1 -Malaya/2 1 -Malayalam/2 1 -Malayan/1 1 -Malaysia/2 1 -Malaysian/1 1 -Malay 1 -Malcolm -malcontent/1 1 -Maldive/3 -Maldives/2 1 -Maldivian/1 1 -Maldonado/3 -male/20 1 -Male/2 1 -malediction/1 1 -malefaction/1 1 -malefactor/1 1 -malefic -maleficence/2 1 -maleficent -males 889 -malevolence/2 1 -malevolent/8 1 -malfeasance/2 1 -malformation/1 1 -malformed -malfunction/23 1 -malfunctioning 1 -Malian/1 1 -Malibu/3 -malice/2 1 -malicious/16 1 -malign/11 1 -malignancy/15 1 -malignant/8 1 -maligners -malignity/2 1 -malign 1 -Malinda/3 -malinger/11 1 -malingerer/1 1 -Malinowski -Mali 890 -mall/18 1 -mallard/1 1 -Mallarme -malleability/2 1 -malleable 1 -mallet/1 1 -Mallomars/3 -Mallory/3 -mallow/1 1 -malnourished -malnourishment 1 -malnutrition/2 1 -malocclusion/2 1 -malodorous 1 -Malone/3 -Malory/3 -Malplaquet/3 -malpractice/1 1 -Malraux -malt/23 1 -Malta/2 1 -malted/1 1 -Maltese/2 1 -Malthus/2 1 -Malthusian/1 1 -malting 1 -maltose/2 1 -maltreat/11 1 -maltreatment/2 1 -malty/34 1 -mam/10 1 -mama/1 1 -mamba/1 1 -mambo/23 1 -Mameluke 1 -Mamet -Mamie/3 -mamma/57 1 -mammal/1 1 -mammalian/1 1 -mammary 1 -mamma's 891 -mamma 892 -mammogram/1 1 -mammography/2 1 -Mammon/1 1 -mammon/2 893 -mammoth/1 1 -mammy/15 1 -Mamore/3 -Man/2 1 -man/400 894 -manacle/28 1 -manage/6 1 -manageability/2 1 -manageable 1 -management/1 1 -manager/1 1 -manageress/89 1 -managerial/8 1 -managership 1 -Managua/2 1 -Manama/2 1 -manana/1 1 -Manasseh -manatee/1 1 -Manaus -Manchester/2 1 -Manchu/1 1 -Manchuria/2 1 -Manchurian 1 -Mancini/3 -manciple 1 -Mancunian/1 1 -mandala/1 1 -Mandalay/2 1 -mandamus/40 1 -mandarin/1 1 -Mandarin/2 1 -mandate/28 1 -mandatory 1 -Mandela -Mandelbrot -mandible/1 1 -mandibular -Mandingo 1 -mandolin/1 1 -mandrake/1 1 -mandrel/1 1 -Mandrell/3 -mandril/1 1 -mandrill/1 1 -Mandy/3 -mane/1 1 -maned 1 -manege/2 1 -Manet -maneuver/23 1 -maneuverability/2 1 -maneuverable -maneuverings -Manfred/3 -manful/8 1 -manganese/2 1 -mange/149 1 -manged/10 1 -manger/1 1 -mangetout/10 1 -mangier 895 -mangiest 895 -mangle/28 1 -mangler/10 1 -mangling 1 -mango/4 1 -mangrove/1 1 -mangy/49 1 -manhandle/6 1 -Manhattan/1 1 -manhole/1 1 -manhood/2 1 -manhunt/1 1 -Mani -mania/1 1 -maniac/1 1 -maniacal/8 1 -maniac 1 -manic/1 1 -manically -Manichean 1 -manic 1 -manicure/28 1 -manicurist/1 1 -manifest/210 1 -manifestation/1 1 -manifesto/18 1 -manifold/23 1 -manikin/1 1 -Manila/1 1 -manila/2 1 -manilla/2 1 -manioc/1 1 -manipulable -manipulate/6 1 -manipulation/1 1 -manipulative -manipulatively -manipulator/1 1 -Manitoba/2 1 -Manitoulin/3 -mankind/2 1 -manky 1 -Manley/3 -manlike 1 -manly/140 1 -Mann -manna/2 1 -mannequin/1 1 -manner/1 1 -mannered -mannerism/1 1 -mannerist 1 -mannerly/222 1 -Mannheim/2 1 -mannikin/1 1 -Manning -mannish/16 1 -manoeuvrings -manometer/1 1 -manor/1 1 -manorial -manpower/2 1 -manque 1 -mans/89 1 -mansard/1 1 -manse/1 1 -manservant/2 896 -Mansfield -mansion/1 1 -manslaughter/2 1 -Manson/3 -manta/1 1 -Mantegna -mantel/1 1 -mantelpiece/1 1 -mantelshelf/338 1 -mantes 897 -mantilla/1 1 -mantis/4 898 -mantissa/1 1 -Mantle/3 -mantle/28 1 -mantlepiece/10 1 -mantling 1 -mantra/1 1 -mantrap/10 1 -manual/30 1 -Manuel/3 -Manuela/3 -manufacture/28 1 -manufacturer/1 1 -manufacturing/2 1 -manumission/1 1 -manumit/12 1 -manure/28 1 -manuscript/1 1 -Manx/2 1 -many/2 899 -Mao/401 1 -Maoism/1 1 -Maoist/1 1 -Maori/1 1 -map/47 1 -maple/1 1 -mapmaker/1 1 -mappable -mapper/1 1 -mapping/10 1 -Mapplethorpe/3 -Maputo/2 1 -mar/13 1 -Mar/130 1 -Mara/2 1 -marabou/1 1 -marabout/1 1 -maraca/1 1 -Maracaibo -maraschino/1 1 -Marat -Maratha/2 1 -Maratha's 900 -Maratha 901 -Marathi/2 1 -marathon/1 1 -Marathon/2 902 -marathoner/1 1 -maraud/5 1 -marauder/1 1 -marble/28 1 -marbleize/6 1 -marble 1 -marbling/2 1 -Marc -Marceau -Marcel/3 -Marcelino/3 -Marcella/3 -Marcelo/3 -march/4 1 -March/4 1 -march/7 1 -marcher/1 1 -marches 1 -marchioness/3 -marchionesses -Marci/3 -Marcia/3 -Marciano -Marcie/3 -Marco/3 -Marconi -Marcos -Marcus/3 -Marcuse -Marcy/3 -Marduk/2 1 -mare/1 1 -Margaret -margarine/2 1 -Margarita -margarita/1 1 -Margarito/3 -Marge/3 -Margery/3 -marge 1 -Margie/3 -margin/18 1 -marginal/191 1 -marginalia/2 1 -marginality 1 -marginalization/2 1 -marginalize/6 1 -Margo/3 -Margret/3 -Margrethe/3 -Marguerite/3 -Mari/1 1 -maria/2 1 -mariachi/1 1 -Mariana/1 1 -Marianne -Mariano/3 -Marian 1 -Maria's 903 -Maria 904 -Maribel/3 -Maricela/3 -Marie/3 -Marietta/3 -marigold/1 1 -marihuana/2 1 -marijuana/2 1 -Marilyn/3 -marimba/1 1 -Marin -Marina/3 -marina/1 1 -marinade/28 1 -marinara/2 1 -marinate/6 1 -marination/2 1 -marine/48 1 -Marine/1 1 -mariner/1 1 -Mario/3 -Marion/2 905 -marionette/1 1 -Marisa/3 -Marisol/3 -Marissa/3 -Maritain -marital/8 1 -maritime -Maritza/3 -Mariupol -Marius -marjoram/2 1 -Marjorie/3 -Marjory/3 -mark/1 1 -Mark/1 1 -mark/11 1 -Markab/3 -markdown/1 1 -marked/8 1 -marker/1 1 -market/23 1 -marketability/2 1 -marketable 1 -marketeer/1 1 -marketer/1 1 -marketing/2 1 -marketplace/1 1 -Markham -marking/1 1 -markka/402 1 -Markov -marksman/2 906 -marksmanship/2 1 -marksmen 907 -markup/1 1 -marl/18 1 -Marla/3 -Marlboro/3 -Marlborough -Marlene/3 -Marley/3 -Marlin -marlin/1 1 -marlinespike/1 1 -marlinspike/1 1 -Marlon/3 -Marlowe -marmalade/2 1 -Marmara/2 1 -marmoreal -marmoset/1 1 -marmot/1 1 -Marne -Maronite 1 -maroon/23 1 -marooning 1 -maroon 1 -Marple/3 -marque/1 1 -marquee/1 1 -Marquesas/3 -marquess/4 1 -marquetry/2 1 -Marquette -Marquez/3 -Marquis -marquis/4 1 -marquise/1 1 -marquisette/2 1 -Marquita/3 -Marrakesh/3 -marriage/1 1 -marriageability/2 1 -marriageable 1 -married/1 1 -Marriott/3 -marrow/18 1 -marry/31 1 -Mars/4 1 -Marsala/2 1 -Marseillaise/1 1 -Marseille/10 1 -Marsh/3 -marsh/4 1 -Marsha/3 -marshal/23 1 -Marshall/2 1 -marshaller 1 -marshland/1 1 -marshmallow/1 1 -marshy/259 1 -mars 1 -marsupial/1 1 -mart/18 1 -Marta/3 -Martel -marten/1 1 -Martha -Martial -martial/8 1 -Martian/1 1 -martian/10 1 -Martian 1 -Martin -martin/1 1 -Martina/3 -martinet/1 1 -Martinez/3 -martingale/1 1 -martini/1 1 -Martinique/2 1 -Marty/3 -martyr/23 1 -martyrdom/2 1 -Marva/3 -marvel/23 1 -Marvell/3 -marvelous/8 1 -Marvin -Marx/2 1 -Marxian 1 -Marxism/1 1 -Marxist/1 1 -Mary/2 1 -Maryann/3 -Maryanne/3 -Maryellen/3 -Maryland/2 1 -Marylander 1 -Marylou/3 -marzipan/2 1 -mas/79 1 -Masada/3 -Masai/2 1 -Masaryk -masc -Mascagni -mascara/23 1 -mascara's 908 -mascara 909 -mascot/1 1 -masculine/1 1 -masculinity/2 1 -Masefield -maser/1 1 -Maserati/3 -Maseru/2 1 -MASH -mash/22 1 -masher/1 1 -Mashhad/2 1 -mashing 1 -mask/23 1 -masker/1 1 -masking 1 -masochism/2 1 -masochist/1 1 -masochistic/39 1 -mason/1 1 -Mason/1 1 -mason/58 1 -Masonic -masonic 1 -Masonite/2 1 -masonry/2 1 -masque/1 1 -masquerade/28 1 -masquerader/1 1 -mass/4 1 -Mass/4 1 -mass/7 1 -Massachusetts -massacre/28 1 -massage/28 1 -Massasoit -massed 1 -Massenet -masseur/1 1 -masseuse/1 1 -Massey -massif/1 1 -massive/16 1 -ma's 910 -mass 1 -mast/62 1 -mastectomy/15 1 -master/30 1 -Master/10 1 -master/11 1 -MasterCard/3 -masterclass -masterclasses -masterful/8 1 -mastering 1 -masterly 1 -mastermind/23 1 -masterpiece/1 1 -mastership 1 -masterstroke/1 1 -masterwork/1 1 -mastery/2 1 -masthead/18 1 -mastic/2 1 -masticate/6 1 -mastication/2 1 -mastiff/1 1 -mastitis 1 -ma 911 -mastodon/1 1 -mastoid/1 1 -masturbate/6 1 -masturbation/2 1 -masturbatory -mat/403 1 -matador/1 1 -match/22 1 -matchable -matchbook/1 1 -matchbox/4 1 -matcher 1 -matchless 1 -matchlock/1 1 -matchmaker/1 1 -matchmaking/2 1 -matchplay -matchstick/1 1 -matchwood/2 1 -mate/28 1 -mater/10 1 -material/30 1 -materialism/2 1 -materialist/1 1 -materialistic/39 1 -materiality 1 -materialization/2 1 -materialize/6 1 -materiel/2 1 -maternal/8 1 -maternity/2 1 -matey/10 1 -math/1 1 -mathematical/8 1 -mathematician/1 1 -mathematics -mathematics's -Mather -Mathew/3 -Mathews -Mathewson/3 -Mathias -Mathis -Matilda 1 -matinee/1 1 -mating/1 1 -matins -matins's -Matisse -matriarch/1 1 -matriarchal -matriarchy/15 1 -matricidal -matricide/1 1 -matriculate/43 1 -matriculation/2 1 -matrimonial/8 1 -matrimony/2 1 -matrix/184 1 -matron/1 1 -matronly 1 -Matt -matte/139 1 -Mattel/3 -matter/23 1 -Matterhorn/2 1 -Matthew/1 1 -Matthias -Mattie/3 -matting/2 1 -mattins -mattins's -mattock/1 1 -mattress/4 1 -maturate/6 1 -maturation/2 1 -mature/404 1 -maturer 1 -maturity/15 1 -matzo/405 1 -matzoh/1 1 -Maud/3 -Maude/3 -maudlin 1 -Maugham -Maui/2 1 -maul/23 1 -mauler/1 1 -maunder/11 1 -maundering 1 -Maupassant -Maura/3 -Maureen/3 -Mauriac -Maurice -Mauricio/3 -Maurine/3 -Mauritania/2 1 -Mauritanian/1 1 -Mauritian/1 1 -Mauritius/2 1 -Mauro/3 -Maurois -Mauryan/3 -Mauser -mausoleum/1 1 -mauve/2 1 -maven/1 1 -maverick/18 1 -mavin/1 1 -Mavis/3 -maw/18 1 -mawkish/16 1 -Max/3 -max/287 1 -maxes 912 -maxi/1 1 -maxilla/53 1 -maxillary 1 -maxim/1 1 -maximal/8 1 -maximality -maximal 1 -Maximilian -maximization/2 1 -maximize/6 1 -maximizer 1 -maximum/1 1 -Maxine/3 -maxis 913 -maxi 1 -Maxwell -May/1 1 -may/406 914 -Maya/1 1 -Mayan/1 1 -maybe/1 1 -mayday/1 1 -Mayer -Mayfair -mayflies -mayflower/1 1 -Mayflower/2 1 -mayfly/3 -mayhem/2 1 -Maynard/3 -mayn't -Mayo -mayo/2 1 -mayonnaise/2 1 -mayor/1 1 -mayoral -mayoralty/2 1 -mayoress/4 1 -maypole/1 1 -Maypole 1 -Mayra/3 -Maytag/3 -Mazama/2 1 -Mazarin -Mazatlan/3 -Mazda -maze/18 1 -Mazola/3 -mazourka/1 1 -mazurka/1 1 -Mazzini/3 -Mb/2 1 -MB/2 1 -MBA/2 1 -Mbabane/2 1 -Mbini/3 -MC -McAdam/3 -McBride/3 -McCain/3 -McCall/3 -McCarthy -McCarthyism/2 1 -McCartney/3 -McCarty/3 -McClain/3 -McClellan -McClure/3 -McConnell/3 -McCormick -McCoy 1 -McCray/3 -McCullough/3 -McDaniel/3 -McDonald/3 -McDonnell/3 -McDowell/3 -McEnroe/3 -McFadden/3 -McFarland/3 -McGee/3 -McGovern/3 -McGowan/3 -McGuffey/3 -McGuire/3 -MCI/3 -McIntosh/2 1 -McIntyre/3 -McKay/3 -McKee/3 -McKenzie/3 -McKinley/2 1 -McKinney/3 -McKnight/3 -McLaughlin/3 -McLean/3 -McLeod/3 -McLuhan/3 -McMahon/3 -McMillan/3 -McNamara/3 -McNaughton/3 -McNeil/3 -McPherson/3 -McQueen/3 -McVeigh/3 -Md/2 1 -MD/2 1 -mdse -MDT -Me -ME -me/10 1 -Mead -mead/2 1 -Meade -meadow/1 1 -meadowland 1 -meadowlark/1 1 -Meadows -Meagan/3 -meager/16 1 -meagreness -meal/18 1 -mealtime/1 1 -mealy/49 1 -mealybug/1 1 -mealymouthed 1 -mean/407 1 -meander/23 1 -meandering/32 1 -meaner 1 -meanie/1 1 -meaning/1 1 -meaningful/16 1 -meaningless/16 1 -meaning 1 -meantime/2 1 -meanwhile/2 1 -Meany/3 -meany/15 1 -meas -measles -measles's -measly/34 1 -measurable/19 1 -measure/28 1 -measured 1 -measureless 1 -measurement/1 1 -measuring 1 -meat/1 1 -meataxe -meatball/1 1 -meatless 1 -meatloaf/120 1 -meatpacking/2 1 -meaty/49 1 -mecca/1 1 -Mecca/1 1 -mechanic/130 1 -mechanical/8 1 -mechanism/1 1 -mechanistic/39 1 -mechanist 1 -mechanizable -mechanization/2 1 -mechanize/6 1 -med -medal/18 1 -medalist/1 1 -medallion/1 1 -Medan -meddle/6 1 -meddler/1 1 -meddlesome 1 -meddling 1 -Medea/2 1 -Medellin -Media -media/1 1 -medial/8 1 -median/1 1 -media's 915 -media 916 -mediate/6 1 -mediation/2 1 -mediator/1 1 -media 1 -medic/1 1 -Medicaid/1 1 -medicaid/2 1 -medical/30 1 -medicament/2 1 -Medicare/1 1 -medicare/2 1 -medicate/6 1 -medication/1 1 -Medici -medicinal/8 1 -medicine/18 1 -medico/1 1 -medievalist/1 1 -medieval 1 -Medina -mediocre 1 -mediocrity/15 1 -meditate/6 1 -meditation/1 1 -meditative/8 1 -Mediterranean/1 1 -medium/1 917 -medley/1 1 -medulla/1 1 -Medusa/2 1 -meed/2 1 -meek/21 1 -meerschaum/1 1 -meet/408 918 -meeter 1 -meeting/1 1 -meetinghouse/1 1 -Meg/3 -meg/10 1 -megabit/1 1 -megabucks -megabucks's -megabyte/1 1 -megacycle/1 1 -megadeath/1 1 -megahertz/2 1 -megajoules -megalith/1 1 -megalithic -megalomania/2 1 -megalomaniac/1 1 -megalopolis/4 1 -Megan/3 -megaparsec 1 -megaphone/28 1 -megapixel -megapixels -megastar/10 1 -megaton/1 1 -mega 1 -megawatt/1 1 -Meghan/3 -MEGO/10 1 -Meier/3 -Meighen/3 -Meiji/3 -meiosis/2 1 -meiotic 1 -Meir -Mejia/3 -Mekong/2 1 -Mel/3 -melamine/2 1 -melancholia/2 1 -melancholic/10 1 -melancholies -melancholy's -melancholy 1 -Melanesia/2 1 -Melanesian 1 -melange/1 1 -Melanie/3 -melanin/2 1 -melanoma/1 1 -melatonin 1 -Melba -Melbourne/2 1 -Melchior -Melchizedek -meld/23 1 -melee/1 1 -Melendez/3 -Melinda/3 -meliorate/6 1 -melioration/2 1 -meliorative -Melisa/3 -Melisande/3 -Melissa/2 1 -mellifluous/16 1 -Mellon -mellow/98 1 -mellowing 1 -melodic/39 1 -melodious/16 1 -melodrama/1 1 -melodramatic/35 1 -Melody/3 -melody/15 1 -melon/1 1 -Melpomene/2 1 -melt/23 919 -meltdown/1 1 -melter 1 -melting 1 -Melton/3 -Melva/3 -Melville/2 1 -Melvin/3 -member/1 1 -membership/1 1 -membrane/1 1 -membranous -meme/10 1 -memento/1 1 -Memling -memo/1 1 -memoir/1 1 -memorabilia/2 1 -memorability/2 1 -memorable/19 1 -memorandum/1 1 -memorial/1 1 -memorialize/6 1 -memorial 1 -memorization/2 1 -memorize/6 1 -memory/15 1 -Memphis/2 1 -memsahib/10 1 -menace/28 1 -menacing/8 1 -menage/1 1 -menagerie/1 1 -Menander -menarche 1 -Mencius -Mencken -mend/23 1 -mendacious/8 1 -mendacity/2 1 -Mendel/2 1 -Mendeleev/2 1 -mendelevium/2 1 -Mendelian 1 -Mendelssohn -mender/1 1 -Mendez/3 -mendicancy/2 1 -mendicant/1 1 -mending/2 1 -Mendocino/3 -Mendoza -Menelaus/3 -Menelik/3 -Menes -menfolk/130 1 -Mengzi -menhaden/2 1 -menial/30 1 -meningeal -meningitis/2 1 -meninx/201 1 -menisci 920 -meniscus/2 921 -Menkalinan/3 -Menkar/3 -Menkent/3 -Mennen/3 -Mennonite/1 1 -Menominee/2 1 -menopausal -menopause/2 1 -menorah/1 1 -Menotti -Mensa -mensch/4 1 -menservants 922 -menses -menses's -men 923 -menstrual 1 -menstruate/6 1 -menstruation/2 1 -mensurable -mensuration/2 1 -menswear/2 1 -mental/8 1 -mentalist/1 1 -mentality/15 1 -menthol/2 1 -mentholated -Mentholatum/3 -menthol 1 -mention/23 1 -mentionable -mentor/23 1 -menu/1 1 -Menuhin/3 -Menzies -meow/23 1 -Mephistopheles -Merak/3 -Mercado/3 -mercantile -mercantilism/2 1 -Mercator -Mercedes -mercenary/15 1 -Mercer/3 -mercer/1 1 -mercerize/6 1 -merchandise/28 1 -merchandiser/1 1 -merchandising/2 1 -merchandize/6 1 -merchandizing 1 -merchant/18 1 -merchantability 1 -merchantable 1 -merchantman/2 924 -merchantmen 925 -merchant 1 -Mercia -merciful/8 1 -merciless/16 1 -Merck/3 -mercurial/8 1 -mercuric -Mercurochrome/2 1 -Mercury/15 1 -mercury/2 1 -mercy/15 1 -mere/409 1 -Meredith -meres 926 -meretricious/16 1 -merganser/1 1 -merge/6 1 -merger/1 1 -merging 1 -meridian/1 1 -meridional 1 -meringue/18 1 -Merino -merino/1 1 -merit/23 1 -merited 1 -meritocracy/15 1 -meritocratic -meritocrats -meritorious/16 1 -Merle/3 -Merlin/2 1 -Merlot 1 -mermaid/1 1 -merman/2 927 -mermen 928 -meromorphic -Merovingian 1 -Merriam/3 -Merrick/3 -Merrill/3 -Merrimack/3 -merriment/2 1 -Merritt/3 -merry/50 1 -merrymaker/1 1 -merrymaking/2 1 -Merthiolate/2 1 -Merton -Mervin/3 -mes/79 1 -Mesa -mesa/1 1 -Mesabi/3 -mesa's 929 -mesa 930 -mescal/1 1 -mescalin -mescaline/2 1 -mesdames 931 -mesdemoiselles 932 -mesh/22 1 -Meshed/2 1 -meshing 1 -Mesmer/3 -mesmeric -mesmerism/2 1 -mesmerize/6 1 -mesmerizer/1 1 -Mesolithic -mesomorph/1 1 -meson/1 933 -Mesopotamia/2 1 -Mesopotamian 1 -mesosphere/1 1 -mesozoic -Mesozoic/2 1 -mesquit/1 1 -mesquite/1 1 -mess/22 1 -message/28 1 -messeigneurs 934 -messenger/18 1 -Messerschmidt/3 -Messiaen -messiah/1 1 -Messiah/1 1 -messianic -Messianic -messieurs 935 -messmate/1 1 -Messrs -messy/50 1 -mestizo/1 1 -meta -metabolic/39 1 -metabolism/1 1 -metabolite/1 1 -metabolize/6 1 -metacarpal/1 1 -metacarpi 936 -metacarpus/2 937 -metal/62 1 -metalanguage/1 1 -metalinguistic 1 -metalized -Metallica/3 -metallic 1 -metallurgic -metallurgical -metallurgist/1 1 -metallurgy/2 1 -metal 1 -metalwork/2 1 -metalworker/1 1 -metalworking/2 1 -metamorphic -metamorphism/2 1 -metamorphose/6 1 -metamorphoses 938 -metamorphosis/2 939 -Metamucil/3 -metaphor/1 1 -metaphoric -metaphorical/8 1 -metaphysical/8 1 -metaphysics -metaphysics's -metastability 1 -metastable -metastases 940 -metastasis/2 941 -metastasize/6 1 -metastatic -metatarsal/1 1 -metatarsi 942 -metatarsus/2 943 -metatheses 944 -metathesis/2 945 -metathesizes -mete/28 1 -metempsychoses 946 -metempsychosis/2 947 -meteor/1 1 -meteoric/39 1 -meteorite/1 1 -meteoroid/1 1 -meteorologic -meteorological 1 -meteorologist/1 1 -meteorology/2 1 -meter/23 1 -metes 948 -methadon/2 1 -methadone/2 1 -methamphetamine/2 1 -methane/2 1 -methanol/2 1 -methinks 949 -methionine 1 -method/1 1 -methodical/16 1 -Methodism/1 1 -Methodist/1 1 -methodological/8 1 -methodology/15 1 -methought 950 -meths -Methuselah 1 -methyl/2 1 -methylated -methylene 1 -methyl 1 -meticulous/16 1 -metier/1 1 -metonymy 1 -metric/10 1 -metrical/8 1 -metricate/6 1 -metrication/2 1 -metricize/6 1 -metric 1 -metro/1 1 -metronome/1 1 -metronomic -metropolis/4 1 -metropolitan 1 -met 951 -Metternich -mettle/2 1 -mettlesome 1 -Meuse/2 1 -mew/185 1 -mewl/11 1 -mewling 1 -mews/2 1 -Mex -Mexicali -Mexican/1 1 -Mexico/2 1 -Meyer/3 -Meyerbeer -Meyers -mezzanine/1 1 -mezzo/1 1 -MFA/2 1 -mfg -mfr -mfrs -Mfume/3 -Mg/2 1 -MGM/3 -mgr -Mgr -mg 1 -MHz 1 -mi/2 1 -MI/2 1 -MIA -Mia/3 -Miami/1 1 -Miaplacidus/3 -miasma/1 1 -mic/10 1 -mica/2 1 -Micah -Micawber 1 -micelles -mice 952 -Mich -Michael -Michaelmas/4 1 -Micheal/3 -Michel/3 -Michelangelo/2 1 -Michele/3 -Michelin/3 -Michelle/3 -Michelob/3 -Michelson -Michigan/2 1 -Michigander/1 1 -Michiganite 1 -Mick/2 1 -mick/10 1 -mickey/1 1 -Mickey/2 1 -Mickie/3 -Micky/3 -Micmac/1 1 -micro/1 1 -microanalyses 953 -microbe/1 1 -microbial -microbiological 1 -microbiologist/1 1 -microbiology/2 1 -microbrewery/15 1 -microchip/1 1 -microcircuit/1 1 -microcode 1 -microcomputer/1 1 -microcosm/1 1 -microcosmic -microdensitometer 1 -microdot/1 1 -microeconomics -microeconomics's -microelectronic/32 1 -microfarad 1 -microfiber/1 1 -microfiche/2 1 -microfilm/23 1 -microfloppies/89 1 -micrograms -micrograph 1 -microgravity 1 -microgroove/1 1 -microhydrodynamics -microlight/1 1 -micromanage/6 1 -micromanagement/2 1 -micrometeorite/1 1 -micrometer/1 1 -micron/1 1 -Micronesia/2 1 -Micronesian 1 -microorganism/1 1 -microphone/1 1 -microprocessor/1 1 -microprogram 1 -microscope/1 1 -microscopic -microscopical/8 1 -microscopist 1 -microscopy/2 1 -microsecond/1 1 -Microsoft/3 -microsurgery/2 1 -micro 1 -microwavable -microwave/28 1 -microwaveable -midair/2 1 -Midas/2 1 -midday/2 1 -midden/1 1 -middle/73 1 -middlebrow/1 1 -middleman/2 954 -middlemen 955 -middlemost -Middleton 1 -middle 1 -middleweight/1 1 -middling 1 -middy/15 1 -Mideast -Mideastern -midfielder/10 1 -midfield 1 -midge/1 1 -midget/1 1 -midi/1 1 -MIDI/2 1 -midi 1 -Midland -midland/1 1 -Midlands -midland 1 -midlife/2 1 -midmost 1 -midnight/1 1 -midpoint/1 1 -midrib/1 1 -midriff/1 1 -midsection/1 1 -midshipman/2 956 -midshipmen 957 -midships -midsize -midsized -midst/2 1 -midstream/2 1 -midsummer/2 1 -midterm/1 1 -midtown/2 1 -mid 1 -midway/1 1 -Midway/2 1 -midway 1 -midweek/1 1 -Midwest/2 1 -Midwestern -Midwesterner 1 -midwicket -midwife/360 958 -midwifery/15 1 -midwinter/2 1 -midwives 959 -midyear/1 1 -mien/1 1 -miff/5 1 -MiG -might/1 1 -mightn't -might 960 -mighty/50 1 -mignonette/1 1 -migraine/1 1 -migrant/1 1 -migrate/6 1 -migration/1 1 -migratory -Miguel/3 -mikado/1 1 -Mike/3 -mike/28 1 -Mikhail/3 -Mikoyan/3 -mil/213 1 -milady/15 1 -Milagros/3 -Milan/2 1 -Milanese -milch 1 -mild/410 1 -mildew/23 1 -mildewy -Mildred/3 -mile/1 1 -mileage/1 1 -mileometer/10 1 -milepost/1 1 -miler/1 1 -Miles -milestone/1 1 -Milford/3 -milieu/1 1 -militancy/2 1 -militant/30 1 -militarism/2 1 -militarist/1 1 -militaristic -militarization/2 1 -militarize/6 1 -military/411 1 -militate/6 1 -militia/1 1 -militiaman/2 961 -militiamen 962 -milk/78 1 -Milken/3 -milker/1 1 -milking 1 -milkmaid/1 1 -milkman/2 963 -milkmen 964 -milkshake/1 1 -milksop/1 1 -milkweed/1 1 -milky/49 1 -Mill -mill/23 1 -millage/2 1 -Millard/3 -Millay -millenarian 1 -millennial 1 -millennium/1 1 -millepede/1 1 -Miller -miller/1 1 -Millet -millet/2 1 -milliard/1 1 -millibar/1 1 -Millicent/3 -Millie/3 -milligram/1 1 -Millikan -milliliter/1 1 -millimeter/1 1 -milliner/1 1 -millinery/2 1 -milling/1 1 -million/1 1 -millionaire/1 1 -millionaires/9 1 -millionairess/89 1 -millionnaire/2 1 -millionth/1 1 -million 1 -millipede/1 1 -millisecond/1 1 -millpond/1 1 -millrace/1 1 -Mills -millstone/1 1 -millstream/1 1 -millwright/1 1 -Milne -Milo/3 -milometer/10 1 -Milosevic/3 -milquetoast/1 1 -Milquetoast/2 1 -milt/23 1 -Miltiades -Milton -Miltonic -Miltown/2 1 -Milwaukee/2 1 -mime/28 1 -mimeograph/23 1 -mimes 1 -mimetic -mimic/64 1 -mimicker/1 1 -mimicry/15 1 -mimic 1 -Mimi's 965 -Mimi 966 -Mimosa/3 -mimosa/1 1 -Min/2 1 -Minamoto/3 -minaret/1 1 -minatory -mince/28 1 -mincemeat/2 1 -mincer/1 1 -mincing 1 -mind/23 1 -Mindanao -mindbogglingly -mindedness -minder/10 1 -mindful/16 1 -mindless/16 1 -Mindoro/2 1 -mindset/1 1 -Mindy/3 -mine/28 1 -minefield/1 1 -miner/1 1 -mineral/1 1 -mineralization 1 -mineralogical 1 -mineralogist/1 1 -mineralogy/2 1 -Minerva/2 1 -mineshaft 1 -mines 967 -minestrone/2 1 -minesweeper/1 1 -mineworkers -Ming -mingle/6 1 -mingling 1 -Mingus/3 -mingy 1 -mini/1 1 -miniature/18 1 -miniaturist/1 1 -miniaturization/2 1 -miniaturize/6 1 -minibar/10 1 -minibike/1 1 -minibus/4 1 -minicab/10 1 -minicam/1 1 -minicomputer/1 1 -minifloppies/89 1 -minim/1 1 -minimal/8 1 -minimalism/2 1 -minimalist/1 1 -minimalistic -minimality 1 -minimal 1 -minimization 1 -minimize/6 1 -minimizer 1 -minim 1 -minimum/1 1 -mining/2 1 -minion/1 1 -miniscule/1 1 -miniseries/2 1 -miniskirt/1 1 -mini's 968 -minister/23 1 -ministerial/8 1 -mini 969 -ministrant/1 1 -ministration/1 1 -ministry/15 1 -minis 970 -mini 1 -minivan/1 1 -mink/1 1 -minke 1 -Minn -Minneapolis/2 1 -Minnelli/3 -minnesinger/1 1 -Minnesota/2 1 -Minnesotan/1 1 -Minnie/3 -minnow/1 1 -Minoan/1 1 -Minolta/3 -minor/23 1 -minority/15 1 -minor 1 -Minos/2 1 -Minot/3 -minotaur -Minotaur/2 1 -minotaurs -minoxidil/2 1 -Minsk/2 1 -Minsky/3 -minster/1 1 -minstrel/18 1 -minstrelsy/2 1 -mint/78 1 -mintage/2 1 -Mintaka/3 -minter/1 1 -min 1 -minty/34 1 -minuend/1 1 -minuet/1 1 -Minuit -minus/4 971 -minuscule/1 1 -minus 1 -minute/107 1 -Minuteman/2 1 -minuteman/2 972 -minutemen 973 -minutia/53 1 -minx/4 1 -Miocene/2 1 -MIPS/89 1 -Mir/3 -Mira/3 -Mirabeau -Mirach/3 -miracle/1 1 -miraculous/83 1 -mirage/1 1 -Miranda -mire/28 1 -Mirfak/3 -Miriam/3 -Miro 1 -mirror/23 1 -mirth/2 1 -mirthful/16 1 -mirthless/8 1 -MIRV 1 -miry/34 1 -Mirzam/3 -misaddress/7 1 -misadventure/1 1 -misaligned -misalignment/2 1 -misalliance/1 1 -misanalysed -misanthrope/1 1 -misanthropic -misanthropically -misanthropist/1 1 -misanthropy/2 1 -misapplication/1 1 -misapply/31 1 -misapprehend/11 1 -misapprehension/1 1 -misappropriate/6 1 -misappropriation/1 1 -misbegotten -misbehave/6 1 -misbehavior/2 1 -misc -miscalculate/6 1 -miscalculation/1 1 -miscall/11 1 -miscarriage/1 1 -miscarry/31 1 -miscast/121 1 -miscegenation/2 1 -miscellanea 1 -miscellaneous -miscellaneously -miscellany/15 1 -mischance/18 1 -mischief/2 1 -mischievous/16 1 -miscibility/2 1 -miscible 1 -misclassified -miscomprehended -misconceive/6 1 -misconception/1 1 -misconduct/23 1 -misconfiguration -misconstruction/1 1 -misconstrue/6 1 -miscopying -miscount/23 1 -miscreant/1 1 -miscue/28 1 -misdeal/412 1 -misdeed/1 1 -misdemeanor/1 1 -misdiagnose/6 1 -misdiagnoses 974 -misdiagnosis/2 975 -misdirect/11 1 -misdirection/1 1 -misdo/413 1 -misdoing/1 1 -miser/1 1 -miserable/29 1 -miserly/140 1 -misery/15 1 -misfeasance/2 1 -misfeature/58 1 -misfield 1 -misfile/6 1 -misfire/28 1 -misfit/109 1 -misfortune/1 1 -misgiving/1 1 -misgovern/11 1 -misgovernment/2 1 -misguidance/2 1 -misguide/6 1 -misguided/8 1 -mishandle/6 1 -mishap/18 1 -mishear/46 1 -mishit/88 1 -mishmash/4 1 -misidentify/31 1 -misinform/11 1 -misinformation/2 1 -misinterpret/11 1 -misinterpretation/1 1 -misjudge/6 1 -misjudgment/1 1 -Miskito 1 -mislabel/11 1 -mislay/312 1 -mislead/121 976 -misleading/8 1 -misled 977 -mismanage/6 1 -mismanagement/2 1 -mismatch/22 1 -misname/6 1 -misnomer/18 1 -misogamist/1 1 -misogamy/2 1 -misogynist/1 1 -misogynistic -misogynous -misogyny/2 1 -misplace/6 1 -misplacement/2 1 -misplay/23 1 -mispositioned -misprint/23 1 -misprision/2 1 -mispronounce/6 1 -mispronunciation/1 1 -misquotation/1 1 -misquote/6 1 -misquote's -misread/121 1 -misreading/1 1 -misremember/241 1 -misreport/23 1 -misrepresent/11 1 -misrepresentation/1 1 -misrule/28 1 -miss/22 1 -missal/1 1 -misses 978 -misshape/376 1 -misshapen 1 -missile/1 1 -missilery/2 1 -missilry/2 1 -missing 1 -mission/18 1 -missionary/15 1 -missioner/1 1 -missis/4 979 -Mississauga -Mississippi/2 1 -Mississippian/1 1 -missive/1 1 -Missouri/2 1 -Missourian/1 1 -misspeak/121 980 -misspell/11 1 -misspelling/1 1 -misspend/382 1 -misspoken 981 -misspoke 981 -misstate/6 1 -misstatement/1 1 -misstep/18 1 -Miss 1 -missus/4 1 -Missy/3 -mist/23 1 -mistakable 1 -mistake/263 982 -mistaken/8 1 -Mistassini -mister/18 1 -Mister 1 -mistime/6 1 -misting 1 -mistletoe/2 1 -mistook 983 -mistral/1 1 -mistranslated -mistranslates -mistranslating -mistranslation/10 1 -mistreat/11 1 -mistreatment/2 1 -mistress/4 1 -Mistress 1 -mistrial/1 1 -mistrust/23 1 -mistrustful/8 1 -Misty/3 -misty/50 1 -mistype/6 1 -mistypings -misunderstand/121 984 -misunderstanding/1 1 -misunderstood 985 -misuse/28 1 -misuser 1 -MIT/3 -Mitch/3 -Mitchel/3 -Mitchell -mite/1 1 -miter/23 1 -mites 986 -Mitford/3 -Mithra/2 1 -Mithridates/2 1 -mitigate/6 1 -mitigated 1 -mitigation/2 1 -mitigatory -mitochondrial -mitochondria 987 -mitoses 988 -mitosis/2 989 -mitotic 1 -Mitsubishi/3 -mitt/1 1 -mitten/1 1 -Mitterrand/3 -Mitzi/3 -Mitty/3 -mix/22 1 -mixable 1 -mixed 1 -mixer/1 1 -Mixtec 1 -mixture/1 1 -Mizar -mizzen/1 1 -mizzenmast/1 1 -mizzen 1 -Mk -mks -Mlle -ml 1 -MM -Mme -Mmes -mm 1 -MN -Mn/2 1 -mnemonic/51 1 -Mnemosyne/2 1 -mo -MO -Mo/2 1 -moan/23 1 -moaner/1 1 -moaning 1 -moat/62 1 -mob/136 1 -Mobil/3 -mobile/1 1 -Mobile/2 1 -mobile 1 -mobility/15 1 -mobilizable -mobilization/1 1 -mobilize/6 1 -mobilizer/1 1 -mobster/1 1 -mob 1 -Mob 1 -Mobutu/3 -moccasin/1 1 -mocha/2 1 -mock/414 1 -mocker/1 1 -mockery/15 1 -mocking/8 1 -mockingbird/1 1 -mocking 1 -mockup/1 1 -mod/415 1 -modal/1 1 -modality/60 1 -modal 1 -mode/299 1 -model/78 1 -modeler/1 1 -modeling/1 1 -modem/18 1 -moderate/207 1 -moderation/2 1 -moderator/1 1 -modern/38 1 -modernism/2 1 -modernist/1 1 -modernistic -modernity/2 1 -modernization/1 1 -modernize/6 1 -modernizer/1 1 -modest/75 1 -Modesto -modesty/2 1 -modicum/1 1 -modifiable 1 -modification/1 1 -modifier/1 1 -modify/31 1 -Modigliani -modish/16 1 -modularity 1 -modularization -modularize/251 1 -modular 1 -modulate/6 1 -modulation/1 1 -modulator/1 1 -module/1 1 -moduli 990 -modulo/416 1 -modulus 991 -Moe/3 -Moet/3 -Mogadishu -moggie/10 1 -mogul/1 1 -Mogul/1 1 -moggy/60 1 -Mohacs/3 -mohair/2 1 -Mohamed/3 -Mohammad/3 -Mohammed/2 1 -Mohammedan/1 1 -Mohammedanism/1 1 -Mohave/1 1 -Mohawk/1 1 -Mohegan 1 -Mohican/1 1 -Moho/3 -Mohorovicic/3 -moiety/15 1 -moil/23 1 -moiling 1 -Moira 1 -moire/1 1 -Moises -Moiseyev/3 -moist/21 1 -moisten/11 1 -moistener/1 1 -moisture/2 1 -moisturize/6 1 -moisturizer/1 1 -Mojave/1 1 -molar/1 1 -molarity/60 1 -molar 1 -molasses/2 1 -mold/23 1 -Moldavia/2 1 -Moldavian 1 -moldboard/1 1 -molder/23 1 -molding/1 1 -Moldova/2 1 -Moldovan -moldy/49 1 -mole/1 1 -molecularity/2 1 -molecular 1 -molecule/1 1 -molehill/1 1 -moleskin/2 1 -molest/11 1 -molestation/1 1 -molester/1 1 -Moliere/2 1 -Molina -Moll/3 -moll/1 1 -Mollie/3 -mollies -mollification/2 1 -mollify/31 1 -mollusc/1 1 -molluscan/1 1 -mollusk/1 1 -molluskan/1 1 -Molnar/3 -Moloch/2 1 -Molokai/2 1 -Molotov/2 1 -molt/23 1 -molten 992 -molter/1 1 -Moluccas -molybdenum/2 1 -molly/3 -Molly/3 -mollycoddle/28 1 -mom/1 1 -Mombasa/2 1 -moment/1 1 -momentary/72 1 -momenta 993 -momentous/16 1 -momentum/2 994 -momma/1 1 -mommie/1 1 -mommy/15 1 -Mon/1 1 -Mona/3 -Monacan 1 -Monaco/2 1 -monadic -monarch/1 1 -monarchic -monarchical 1 -monarchism/2 1 -monarchist/1 1 -monarchistic -monarchy/15 1 -monastery/15 1 -monastic/1 1 -monastical/8 1 -monasticism/2 1 -monaural 1 -Mondale/3 -Monday/1 1 -Mondrian -Monegasque/1 1 -Monera/2 1 -Monet -monetarism/2 1 -monetarist/1 1 -monetary/211 1 -monetize/6 1 -money/1 995 -moneybag/1 1 -moneybox -moneyboxes -moneychangers -moneyed -moneygrubber/1 1 -moneygrubbing/2 1 -moneylender/1 1 -moneyless 1 -moneymaker/1 1 -moneymaking/2 1 -monger/23 1 -mongering 1 -Mongol/1 1 -mongol/10 1 -Mongolia/2 1 -Mongolian/1 1 -Mongolic/2 1 -mongolism/2 1 -mongoloid/1 1 -Mongoloid 1 -Mongol 1 -mongoose/1 1 -mongrel/1 1 -Monica/3 -monicker/1 1 -monied 1 -monies 996 -moniker/1 1 -Monique/3 -monism/2 1 -monist/1 1 -monition/1 1 -monitor/23 1 -monitory 1 -Monk/3 -monk/1 1 -monkey/23 1 -monkeyshine/1 1 -monkish 1 -monkshood/1 1 -Monmouth -mono/2 1 -monochromatic 1 -monochrome/1 1 -monocle/1 1 -monocled -monoclonal 1 -monocotyledon/1 1 -monocotyledonous -monocular 1 -monoculture 1 -monodic -monodist/1 1 -monody/15 1 -monogamist/1 1 -monogamously -monogamous 1 -monogamy/2 1 -monogram/160 1 -monograph/18 1 -monolayers -monolingual/1 1 -monolith/1 1 -monolithic 1 -monolog/18 1 -monologist/1 1 -monologue/18 1 -monologuist/1 1 -monomania/2 1 -monomaniac/1 1 -monomaniacal -monomer/1 1 -monomeric -monomial/10 1 -monomolecular 1 -Monongahela -mononucleosis/2 1 -monophonic -monophthongs -monoplane/1 1 -monopole/10 1 -monopolies -monopolist/1 1 -monopolistic 1 -monopolization/2 1 -monopolize/6 1 -monopolizer/1 1 -monopoly/3 -monorail/1 1 -monostable -monosyllabic 1 -monosyllable/1 1 -monotheism/2 1 -monotheist/1 1 -monotheistic -monotone/18 1 -monotonic/39 1 -monotonicity 1 -monotonous/16 1 -monotony/2 1 -mono 1 -monounsaturated -monoxide/1 1 -Monroe/2 1 -Monrovia/2 1 -Monsanto/3 -monseigneur/2 997 -monsieur/2 998 -monsignor/1 1 -Monsignor/1 1 -monsoon/1 1 -monsoonal -monster/1 1 -monstrance/1 1 -monstrosity/15 1 -monstrous/8 1 -Mont -montage/18 1 -Montague -Montaigne -Montana/2 1 -Montanan/1 1 -Montcalm -Monte/3 -Montenegrin 1 -Montenegro/2 1 -Monterrey -Montesquieu -Montessori -Monteverdi -Montevideo/2 1 -Montezuma/2 1 -Montgolfier -Montgomery/2 1 -month/1 1 -monthlies -monthly's -monthly 1 -Monticello -Montoya/3 -Montpelier/2 1 -Montrachet 1 -Montreal/2 1 -Montserrat/2 1 -Monty/3 -monument/18 1 -monumental/8 1 -moo/417 1 -mooch/22 1 -moocher/1 1 -mood/1 1 -Moody -moody/50 1 -Moog 1 -Moon/3 -moon/23 1 -moonbeam/1 1 -Mooney/3 -moonless 1 -moonlight/23 999 -moonlighter/1 1 -moonlighting/2 1 -moonlit 1000 -moonrise 1 -moonscape/1 1 -moonshine/18 1 -moonshiner/1 1 -moonshot/1 1 -moonstone/1 1 -moonstruck 1 -moonwalk/18 1 -moor/1 1 -Moor/1 1 -moor/11 1 -Moore -moorhen/10 1 -mooring/1 1 -Moorish/2 1 -moorland/1 1 -moose/2 1 -moot/414 1 -mooter 1 -mooting 1 -mop/47 1 -mope/28 1 -moped/1 1 -moper/1 1 -mopey 1001 -mopier 1002 -mopiest 1002 -mopish 1 -moppet/1 1 -mopy/34 1 -moraine/1 1 -moral/164 1 -morale/2 1 -Morales/3 -moralist/1 1 -moralistic/39 1 -morality/15 1 -moralization/2 1 -moralize/6 1 -moralizer/1 1 -Moran/3 -morass/4 1 -moratorium/1 1 -Moravia -Moravian 1 -moray/1 1 -morbid/16 1 -morbidity/2 1 -mordancy/2 1 -mordant/164 1 -Mordred -More -more/130 1 -moreish -morel/1 1 -Moreno/3 -moreover -more 1003 -Morgan/1 1 -morgue/1 1 -Moriarty/3 -moribund/8 1 -moribundity 1 -Morin/3 -Morison/3 -Morita/3 -Morley -Mormon/1 1 -Mormonism/1 1 -Mormon 1 -morn/86 1 -morning/1 1 -Moroccan/1 1 -morocco/2 1 -Morocco/2 1 -moron/1 1 -Moroni -moronic/39 1 -morose/16 1 -Moro 1 -morph/5 1 -morpheme/18 1 -morphemic 1 -Morpheus/2 1 -morphia/2 1 -morphine/2 1 -morphing/2 1 -morphism -morphisms -morphogenesis 1 -morphological/8 1 -morphology/15 1 -Morphy/3 -Morris -Morrison -Morrow/3 -morrow/1 1 -Morse/2 1 -morsel/18 1 -Mort/3 -mortal/30 1 -mortality/2 1 -mortar/23 1 -mortarboard/1 1 -mortgage/28 1 -mortgageable -mortgagee/1 1 -mortgager/1 1 -mortgagor/1 1 -mortice/28 1 -mortician/1 1 -mortification/2 1 -mortified 1 -mortify/31 1 -mortifying 1 -Mortimer -mortise/28 1 -Morton/2 1 -mortuary/15 1 -mos/157 1 -mosaic/1 1 -Mosaic/2 1 -mosaic/58 1 -Mosaic 1 -Moscow/2 1 -Moseley -Moselle/2 1 -Moses/2 1 -mosey/11 1 -mosh/7 1 -moshing 1 -Mosley/3 -mosque/1 1 -mosquito/4 1 -Moss/3 -moss/40 1 -mossback/1 1 -mossy/34 1 -most/37 1004 -Mosul -mot/1 1 -mote/1 1 -motel/1 1 -motet/1 1 -moth/1 1 -mothball/23 1 -mother/23 1 -motherboard/1 1 -motherfucker/80 1 -motherfucking/309 -motherhood/2 1 -mothering 1 -motherland/1 1 -motherless 1 -motherly/140 1 -motif/123 1 -motile/10 1 -motility/2 1 -motion/23 1 -motionless/16 1 -motivate/6 1 -motivation/1 1 -motivational -motivator/1 1 -motive/18 1 -motiveless 1 -motive 1 -motley/18 1005 -motlier 1006 -motliest 1006 -motocross/4 1 -motor/23 1 -motorbike/28 1 -motorboat/1 1 -motorcade/18 1 -motorcar/1 1 -motorcycle/28 1 -motorcyclist/1 1 -motoring 1 -motorist/1 1 -motorization/2 1 -motorize/6 1 -motorman/2 1007 -motormen 1008 -motormouth/1 1 -Motorola/3 -motor 1 -motorway/1 1 -Motown/2 1 -Motrin/2 1 -Mott -mottle/43 1 -mottling 1 -motto/4 1 -moue/18 1 -moulder/5 1 -moult/23 1 -moulting 1 -mound/23 1 -Mount -mount/23 1 -mountable 1 -mountain/1 1 -mountaineer/23 1 -mountaineering/2 1 -mountainous 1 -mountainside/1 1 -mountaintop/1 1 -mountain 1 -Mountbatten -mountebank/18 1 -mounter/1 1 -Mountie/1 1 -mounties -mounting/1 1 -mourn/11 1 -mourner/1 1 -mournful/85 1 -mourning/2 1 -mouse/360 1009 -mouser/1 1 -mousetrap/47 1 -mousey 1010 -mousier 1011 -mousiest 1011 -mousing 1 -moussaka/10 1 -mousse/28 1 -Moussorgsky -moustachioed -mousy/49 1 -mouth/23 1 -Mouthe/3 -mouthful/1 1 -mouthing 1 -mouthorgan -mouthpiece/1 1 -mouthwash/4 1 -mouthwatering -mouthy/49 1 -Mouton/3 -mouton/2 1 -movable/1 1 -move/28 1 -moveable/1 1 -movement/1 1 -mover/1 1 -movie/1 1 -moviegoer/1 1 -moving/8 1 -mow/23 1 -mower/1 1 -Mowgli/3 -mowing 1 -moxie/2 1 -Mozambican/1 1 -Mozambique/2 1 -Mozart/2 1 -Mozilla/3 -mozzarella/2 1 -mp -MP/2 1 -mpg -mph 1 -Mr/1 1 -MRI/2 1 -MS/2 1 -Mses -MSG/2 1 -Msgr -MST/2 1 -MSW -mt -Mt -MT/2 1 -mtg -mtge -m 1 -MTV -mu/1 1 -Muawiya/3 -Mubarak/3 -much/418 899 -mucilage/2 1 -mucilaginous 1 -muck/23 1 -muckrake/6 1 -muckraker/1 1 -mucky/34 1 -mucosa 1 -mucous 1 -mucus/2 1 -mud/2 1 -muddle/28 1 -muddled 1 -muddleheaded -muddy/143 1 -muddying 1 -mudflap/10 1 -mudflat/1 1 -mudflow/10 1 -mudguard/1 1 -mudlarks -mudpack/10 1 -mudroom/1 1 -mudslide/1 1 -mudslinger/1 1 -mudslinging/2 1 -mud 1 -Mueller/3 -Muenster/1 1 -muenster/2 1 -muesli 1 -muezzin/1 1 -muff/23 1 -muffin/1 1 -muffle/43 1 -muffler/1 1 -muffling 1 -mufti/1 1 -mug/92 1 -Mugabe/3 -mugful/1 1 -mugger/18 1 -mugging/1 1 -muggins 1 -mugshot/1 1 -mugwump/1 1 -muggy/49 1 -Muhammad/2 1 -Muhammadan/1 1 -Muhammadanism/1 1 -Muir -mujaheddin -mujahedin/2 1 -Mujib/3 -mukluk/1 1 -mulatto/4 1 -mulberry/15 1 -mulch/22 1 -mulct/23 1 -Mulder/3 -mule/18 1 -muleskinner/1 1 -muleteer/1 1 -mulish/16 1 -mull/5 1 -mullah/1 1 -mullein/2 1 -Mullen/3 -Muller/3 -mullet/1 1 -Mulligan/3 -mulligan/1 1 -mulligatawny/2 1 -Mullikan/3 -Mullins -mullion/62 1 -Mulroney/3 -Multan -multichannel 1 -multicolored -multicolor 1 -multicultural -multiculturalism/2 1 -Multics/89 1 -multidimensional -multidisciplinary -multifaceted -multifamily -multifarious/16 1 -multiform -multifunction -multifunctional -multilateral/8 1 -multilayer -multilevel -multilingual -multilingualism/2 1 -multimedia/2 1 -multimeter 1 -multimillionaire/1 1 -multimillion 1 -multinational/1 1 -multiparty -multiphase -multiple/419 1 -multiplex/22 1 -multiplexer/1 1 -multiplexor/1 1 -multiplicand/1 1 -multiplication/1 1 -multiplicative 1 -multiplicity/15 1 -multiplier/1 1 -multiply/31 1 -multiprocessing 1 -multiprocessor/1 1 -multiprogramming 1 -multipurpose -multiracial -multistage 1 -multistory 1 -multitask/121 1 -multitasking/2 1 -multitude/1 1 -multitudinous 1 -multivalued -multivariate -multivitamin/1 1 -mum/420 1012 -Mumbai/3 -mumble/28 1 -mumbler/1 1 -mumbletypeg/2 1 -mumbling/10 1 -Mumford -mummer/1 1 -mummery/2 1 -mummification/2 1 -mummify/31 1 -mummy/167 1 -mumps -mumps's -Munch -munch/7 1 -muncher/10 1 -Munchhausen/2 1 -munchies/2 1 -munchkin/1 1 -mundane/191 1 -mung/5 1 -Munich/2 1 -municipal/30 1 -municipality/15 1 -munificence/2 1 -munificent/8 1 -munition/23 1 -Munoz/3 -Munro 1 -Munster 1 -mun 1 -muons -Muppet/3 -mural/1 1 -muralist/1 1 -mural 1 -Murasaki/3 -Murat -Murchison/3 -Murcia -murder/23 1 -murderer/1 1 -murderess/4 1 -murderous/8 1 -Murdoch -Muriel/3 -Murillo -Murine/3 -murk/18 1 -murky/50 1 -Murmansk -murmur/23 1 -murmurer/1 1 -murmuring/1 1 -murmurous 1 -Murphy 1 -murrain/2 1 -Murray/2 1 -Murrow/3 -Murrumbidgee -mus/421 1 -muscat/1 1 -Muscat/2 1 -muscatel/1 1 -muscle/28 1 -musclebound -muscleman 1013 -musclemen 1014 -muscling 1 -muscly -Muscovite/2 1 -Muscovy/2 1 -muscular/8 1 -muscularity/2 1 -musculature/2 1 -muse/1 1 -Muse/2 1 -muse/6 1 -musette/1 1 -museum/1 1 -mush/22 1 -Musharraf/3 -musher/10 1 -mushroom/23 1 -mushy/49 1 -Musial/3 -music/18 1 -musical/30 1 -musicale/1 1 -musicality/2 1 -musician/1 1 -musicianly -musicianship/2 1 -musicological 1 -musicologist/1 1 -musicology/2 1 -musing/30 1 -musk/2 1 -muskeg/1 1 -muskellunge/1 1 -musket/1 1 -musketeer/1 1 -musketry/2 1 -muskie/41 1 -muskmelon/1 1 -Muskogee/2 1 -muskox/422 1 -muskrat/1 1 -musk 1 -musky/423 1 -Muslim/1 1 -muslin/2 1 -muss/22 1 -mussel/1 1 -Mussolini/2 1 -Mussorgsky -mussy/34 1 -must/91 1 -mustache/1 1 -mustached -mustachio/1 1 -mustachioed -mustang/1 1 -mustard/2 1 -muster/23 1 -mustn't -musty/50 1 -mutability/2 1 -mutable/19 1 -mutagen/1 1 -mutant/1 1 -mutate/6 1 -mutation/1 1 -mutational 1 -mutative -mute/107 1 -muted 1 -mutilate/6 1 -mutilation/1 1 -mutilator/1 1 -mutineer/18 1 -mutinous/8 1 -mutiny/56 1 -Mutsuhito/3 -mutt/1 1 -mutter/23 1 -mutterer/1 1 -muttering/1 1 -mutton/2 1 -muttonchops -muttonchops's -mutual/8 1 -mutuality/2 1 -mutual 1 -muumuu/1 1 -muzak -Muzak 1 -muzzle/28 1 -muzzy/243 1 -MVP/2 1 -MW -my/10 1 -Myanmar/2 1 -Mycenae/2 1 -Mycenaean 1 -mycologist/1 1 -mycology/2 1 -myelitis/2 1 -Myers -Mylar/1 1 -Myles/3 -myna/1 1 -mynah/1 1 -myocardial -myopia/2 1 -myopically -myopic 1 -Myra/3 -Myrdal/3 -myriad/1 1 -myrmidon/1 1 -Myrna/3 -Myron -myrrh/2 1 -Myrtle/3 -myrtle/1 1 -myself 1 -Mysore -MySpace/3 -Myst/3 -mysterious/16 1 -mystery/167 1 -mystic/1 1 -mystical/8 1 -mysticism/2 1 -mystic 1 -mystification/2 1 -mystified 1 -mystify/31 1 -mystifying 1 -mystique/2 1 -myth/1 1 -mythical 1 -mythic 1 -mythological 1 -mythologist/1 1 -mythologize/6 1 -mythology/15 1 -myxomatosis 1 -n -N/2 1 -Na/2 1 -NAACP -naan/10 1 -nab/145 1 -Nabisco/3 -nabob/1 1 -Nabokov -nabs 1 -nacelle/1 1 -nacho/1 1 -nacre/2 1 -nacreous 1 -Nader -Nadia/3 -Nadine/3 -nadir/1 1 -nae 1 -naffer -naffest -naff 1 -NAFTA -nag/92 1 -Nagasaki/2 1 -nagger/1 1 -nagging 1 -Nagoya -Nagpur -nagware -nagwares -Nagy -nah -Nahuatl/1 1 -Nahum -naiad/1 1 -naif/1 1 -nail/23 1 -nailbrush/4 1 -nailing 1 -Naipaul/3 -Nair/3 -Nairobi/2 1 -Naismith/3 -naive/45 1 -naivete/2 1 -naive 1 -naivety/2 1 -naked/21 1 -Nam/3 -Namath/3 -name/28 1 -nameable 1 -namedrop/424 1 -namedropping/2 1 -namelessly -nameless 1 -namely 1 -nameplate/1 1 -namesake/1 1 -Namibia/2 1 -Namibian/1 1 -naming/10 1 -Nan/3 -nan/10 1 -Nanak -Nanchang -Nancy -Nanette/3 -Nanjing/2 1 -Nanking/1 1 -Nannie/3 -nanobot/10 1 -nanometer/10 1 -Nanook/3 -nanosecond/1 1 -nanotechnology/60 1 -Nansen -Nantes/3 -Nantucket/2 1 -nanny/167 1 -Naomi/2 1 -nap/47 1 -napalm/23 1 -nape/1 1 -Naphtali/3 -naphtha/2 1 -naphthalene/2 1 -Napier/2 1 -napkin/1 1 -Naples/2 1 -napless 1 -napoleon/1 1 -Napoleon/1 1 -Napoleonic 1 -napper/1 1 -nappy/42 1 -Napster/3 -narc/18 1 -narcissism/2 1 -narcissist/1 1 -narcissistic -narcissus/2 1 -Narcissus/2 1 -narcolepsy/2 1 -narcoleptic 1 -narcoses 1015 -narcosis/2 1016 -narcotic/1 1 -narcotization/2 1 -narcotize/6 1 -nark/23 1 -narky 1 -Narmada/3 -Narnia/3 -Narraganset 1 -Narragansett 1 -narrate/6 1 -narration/1 1 -narrative/1 1 -narratology 1 -narrator/1 1 -narrow/52 1 -narrowing 1 -narwhal/1 1 -nary 1 -NASA/2 1 -nasal/30 1 -nasality/2 1 -nasalization/2 1 -nasalize/6 1 -NASCAR/3 -nascence/2 1 -nascent 1 -NASDAQ/2 1 -Nash -Nashua -Nashville/2 1 -Nassau/2 1 -Nasser/2 1 -nasturtium/1 1 -nasty/50 1 -Nat/3 -Natalia/3 -Natalie/3 -natal 1 -Natasha/3 -Natchez -natch 1 -Nate/3 -Nathan -Nathaniel/3 -Nathans -nation/1 1 -national/30 1 -nationalism/2 1 -nationalist/1 1 -nationalistic/39 1 -nationality/15 1 -nationalization/1 1 -nationalize/6 1 -nationhood/2 1 -Nation 1 -nationwide -Nationwide/3 -native/1 1 -nativity/15 1 -Nativity/2 1 -natl -NATO/2 1 -natter/23 1 -natural/36 1 -naturalism/2 1 -naturalist/1 1 -naturalistic 1 -naturalization/2 1 -naturalize/6 1 -Nature -nature/18 1 -naturism 1 -naturist/10 1 -natty/50 1 -Naugahyde 1 -naught/1 1 -naughty/50 1 -Nauru/2 1 -nausea/2 1 -nauseate/6 1 -nauseating/8 1 -nauseous/16 1 -nautical/8 1 -nautilus/4 1 -Nautilus 1 -Navaho/2 1 -Navajo/71 1 -naval 1 -Navarre -Navarro/3 -nave/1 1 -navel/1 1 -navigability/2 1 -navigable 1 -navigate/6 1 -navigation/2 1 -navigational -navigator/1 1 -Navratilova/3 -navvy/425 1 -navy/15 1 -Navy 1 -nay/1 1 -naysayer/1 1 -nay 1 -Nazarene 1 -Nazareth -Nazca -Nazi/1 1 -Naziism/1 1 -Nazism/1 1 -Nazi 1 -NB -Nb/2 1 -NBA -NBC -NBS -NC -NCAA -NCO -ND -Nd/2 1 -N'Djamena -Ndjamena/2 1 -Ne/2 1 -NE/2 1 -Neal/3 -neanderthal/1 1 -Neanderthal/1 1 -neap/18 1 -Neapolitan 1 -neap 1 -near/426 1 -nearby 1 -nearside 1 -nearsighted/33 1 -nearsightedly -neat/21 1 -neaten/11 1 -neath -neat 1 -Neb -Nebr -Nebraska/2 1 -Nebraskan/1 1 -Nebuchadnezzar 1 -nebula/53 1 -nebular -nebulosity 1 -nebulous/16 1 -necessary/206 1 -necessitate/6 1 -necessitous 1 -necessity/15 1 -neck/23 1 -neckband/10 1 -neckerchief/1 1 -necking/2 1 -necklace/28 1 -necklacings -neckline/1 1 -necktie/1 1 -necrology/2 1 -necromancer/1 1 -necromancy/2 1 -necromantic -necrophiliac/10 1 -necrophilia 1 -necropolis/4 1 -necropsy 1 -necroses 1017 -necrosis/2 1018 -necrotic -nectar/2 1 -nectarine/1 1 -Ned/3 -need/23 1 -needful/8 1 -needle/28 1 -needlecraft 1 -needlepoint/2 1 -needless/8 1 -needlessness/3 -needless 1 -needlewoman/2 1019 -needlewomen 1020 -needlework/2 1 -needling 1 -needn't -needy/49 1 -ne'er -nee 1 -nefarious/16 1 -Nefertiti -negate/6 1 -negation/1 1 -negative/207 1 -negativism/2 1 -negativity/2 1 -Negev/2 1 -neglect/23 1 -neglected 1 -neglectful/16 1 -neglige/1 1 -negligee/1 1 -negligence/2 1 -negligent/8 1 -negligibility 1 -negligible/19 1 -negotiability/2 1 -negotiable 1 -negotiate/6 1 -negotiation/1 1 -negotiator/1 1 -Negress/4 1 -negritude/2 1 -Negritude 1 -Negro/4 1 -Negroid/1 1 -negroid 1 -Negros -negro 1 -neg 1 -NEH -Nehemiah -Nehru/2 1 -neigh/23 1 -neighbor/210 1 -neighborhood/1 1 -neighborly/140 1 -Neil/3 -neither 1 -Nelda/3 -Nell/3 -Nellie/3 -Nelsen/3 -Nelson -nelson/1 1 -Nelly/3 -nematode/1 1 -Nembutal/2 1 -nemeses 1021 -Nemesis/2 1 -nemesis/2 1022 -neoclassic -neoclassical -neoclassicism/2 1 -neocolonialism/2 1 -neocolonialist/1 1 -neoconservative/1 1 -neodymium/2 1 -Neogene -neolithic -Neolithic -neologism/1 1 -neon/2 1 -neonatal 1 -neonate/1 1 -neophilia/10 1 -neophyte/1 1 -neoplasm/1 1 -neoplastic -neoprene/2 1 -Nepal/2 1 -Nepalese/2 1 -Nepali/1 1 -nepenthe/2 1 -nephew/1 1 -nephrite/2 1 -nephritic -nephritis/2 1 -nepotism/2 1 -nepotist/1 1 -nepotistic -Neptune/2 1 -neptunium/2 1 -nerd/1 1 -nerdy/34 1 -Nereid/2 1 -Nerf -Nero -Neruda -nerve/28 1 -nerveless/16 1 -nerving 1 -nervous/16 1 -nervy/49 1 -Nescafe/3 -Nesselrode 1 -nest/23 1 -nestable -Nestle/3 -nestle/43 1 -nestling/1 1 -Nestor/2 1 -Nestorius -net/403 1 -netball 1 -Netherlander/1 1 -Netherlands -nethermost -nether 1 -netherworld/2 1 -netiquette/10 1 -Netscape/2 1 -nett/427 1 -netter/10 1 -Nettie/3 -netting/2 1 -nettle/28 1 -nettlesome -nettling 1 -nett 1 -network/23 1 -networking/2 1 -Netzahualcoyotl/3 -neuralgia/2 1 -neuralgic -neural 1 -neurally 1 -neurasthenia/2 1 -neurasthenic/1 1 -neuritic/1 1 -neuritis/2 1 -neurobiology 1 -neurological -neurologically -neurologist/1 1 -neurology/2 1 -neuron/1 1 -neuronal -neurone/10 1 -neurophysiology 1 -neuroscience 1 -neuroses 1023 -neurosis/2 1024 -neurosurgeon/1 1 -neurosurgery/2 1 -neurotic/51 1 -neurotransmitter/1 1 -neut -neuter/23 1 -neutral/30 1 -neutralism/2 1 -neutralist/1 1 -neutrality/2 1 -neutralization/2 1 -neutralize/6 1 -neutralizer/1 1 -neutrino/1 1 -neutron/1 1 -Nev -Neva -Nevada/2 1 -Nevadan/1 1 -Nevadian 1 -nevermore -nevertheless -never 1 -Nevis/2 1 -nevi 1025 -Nevsky/3 -nevus/2 1026 -new/428 1 -Newark/2 1 -newbie/1 1 -newborn/1 1 -Newcastle/2 1 -newcomer/1 1 -newel/1 1 -newfangled 1 -Newfoundland/1 1 -Newfoundlander 1 -newish -newline/10 1 -newlywed/1 1 -Newman -Newport/2 1 -new's -news/2 1 -NeWS/89 1 -newsagent/10 1 -newsboy/1 1 -newscast/18 1 -newscaster/1 1 -newsdealer/1 1 -newsflash/89 1 -newsgirl/1 1 -newsgroup/1 1 -newshound/10 1 -newsletter/1 1 -newsman/2 1027 -newsmen 1028 -newspaper/18 1 -newspaperman/2 1029 -newspapermen 1030 -newspaperwoman/2 1031 -newspaperwomen 1032 -newsprint/2 1 -newsreader/10 1 -newsreel/1 1 -newsroom/1 1 -newsstand/1 1 -news 1 -Newsweek/3 -newsweeklies -newsweekly/3 -newswoman/2 1033 -newswomen 1034 -newsworthy/49 1 -newsy/34 1 -newt/1 1 -newton/1 1 -Newton/2 1 -Newtonian/2 1 -Nexis -next's -next 1 -nexus/4 1 -NF -NFC -NFL -Ngaliema/3 -Nguyen/3 -NH -NHL -niacin/2 1 -Niagara/2 1 -Niamey/2 1 -nib/18 1 -nibble/28 1 -nibbler/1 1 -nibbling 1 -Nibelung 1 -Nicaea -Nicaragua/2 1 -Nicaraguan/1 1 -Niccolo/3 -nice/27 1 -Nice/2 1 -Nicene -nicety/15 1 -niche/18 1 -Nichiren/3 -Nicholas -Nichole/3 -Nichols -Nicholson -Nick/3 -nick/23 1 -nickel/18 1 -Nickelodeon/3 -nickelodeon/1 1 -nickel 1 -nicker/23 1 -Nicklaus -nickle/58 1 -nicknack/1 1 -nickname/28 1 -Nickolas -Nicobar/3 -Nicodemus -Nicola/1 1 -Nicole/3 -Nicosia/2 1 -nicotine/2 1 -Niebuhr/3 -niece/1 1 -Nielsen -Nietzsche -Nieves/3 -niff 1 -niffy 1 -niftily -nifty/34 1 -Nigel/3 -Niger/2 1 -Nigeria/2 1 -Nigerian/1 1 -Nigerien/2 1 -niggard/164 1 -niggardly/140 1 -nigger/429 1 -niggle/6 1 -niggler/1 1 -niggle's -niggling 1 -nigh/166 1 -night/1 1 -nightcap/1 1 -nightclothes/2 1 -nightclub/136 1 -nightdress/4 1 -nightfall/2 1 -nightgown/1 1 -nighthawk/1 1 -nightie/1 1 -nightingale/1 1 -Nightingale/2 1 -nightlife/2 1 -nightlight/10 1 -nightlong 1 -nightly 1 -nightmare/1 1 -nightmarish 1 -nightshade/1 1 -nightshirt/1 1 -nightspot/1 1 -nightstand/1 1 -nightstick/1 1 -nigh 1 -nighttime/2 1 -night 1 -nightwatchman -nightwatchmen -nightwear/2 1 -nighty/15 1 -NIH -nihilism/2 1 -nihilist/1 1 -nihilistic -Nijinsky -Nike/2 1 -Nikita/3 -Nikkei -Nikki/3 -Nikolai/3 -Nikolayev -Nikon/3 -nil/2 1 -Nile/2 1 -nil 1 -nimbi 1035 -nimble/289 1 -nimbus/2 1036 -NIMBY -nimby 1 -Nimitz -nimrod/1 1 -Nimrod 1 -Nina/2 1 -nincompoop/1 1 -nine/1 1 -ninepence 1 -ninepin/130 1 -nineteen/1 1 -nineteenth/1 1 -ninetieth/1 1 -nine 1 -ninety/15 1 -Nineveh/2 1 -ninja/1 1 -Nintendo -ninth/1 1 -ninny/15 1 -Niobe -niobium/2 1 -nip/47 1 -nipper/18 1 -nippiness/3 -nipping 1 -nipple/18 1 -Nippon/2 1 -Nipponese/2 1 -nippy/34 1 -Nirenberg/3 -nirvana/2 1 -Nirvana 1 -Nisan/2 1 -nisei/2 1 -Nisei 1 -Nissan/2 1 -Ni 1037 -nit/1 1 -Nita/3 -nite/1 1 -niter/2 1 -nitpick/11 1 -nitpicker/1 1 -nitpicking/2 1 -nitrate/28 1 -nitration/2 1 -nitric 1 -nitride/58 1 -nitrification/2 1 -nitrite/1 1 -nitrocellulose/2 1 -nitrogen/2 1 -nitrogenous -nitroglycerin/2 1 -nitroglycerine/2 1 -nitrous 1 -nitwit/1 1 -Nivea/3 -nix/22 1 -Nixon/2 1 -nix 1 -NJ -Nkrumah -NLRB -NM -No/2 1038 -no/71 1 -Noah/2 1 -nob/10 1 -nobble/6 1 -Nobel -Nobelist/1 1 -nobelium/2 1 -nobility/2 1 -Noble/3 -noble/430 1 -nobleman/2 1039 -noblemen 1040 -nobles 1 -noblewoman/2 1041 -noblewomen 1042 -nobody/15 1 -nocturnal/8 1 -nocturne/1 1 -nod/113 1 -nodal 1 -nodding 1 -noddle/18 1 -noddy 1 -node/1 1 -NoDoz/3 -nodular -nodule/1 1 -Noe/3 -noel/1 1 -Noel/1 1 -Noelle/3 -Noemi/2 1 -noes 1 -noggin/1 1 -Noh -nohow 1 -noise/28 1 -noiseless/16 1 -noisemaker/1 1 -noisome 1 -noisy/50 1 -Nokia/3 -Nola/3 -Nolan/3 -nomad/1 1 -nomadic 1 -Nome -nomenclature/1 1 -nominal/8 1 -nominate/6 1 -nomination/1 1 -nominative/1 1 -nominator/1 1 -nominee/1 1 -Nona/2 1 -nonabrasive 1 -nonabsorbent/1 1 -nonacademic 1 -nonacceptance/2 1 -nonacid 1 -nonactive/1 1 -nonaddictive -nonadhesive 1 -nonadjacent 1 -nonadjustable 1 -nonadministrative 1 -nonage/1 1 -nonagenarian/1 1 -nonaggression/2 1 -nonalcoholic 1 -nonaligned -nonalignment/2 1 -nonallergic -nonappearance/1 1 -nonassignable 1 -nonathletic 1 -nonattendance/2 1 -nonautomotive -nonavailability/2 1 -nonbasic -nonbeliever/1 1 -nonbelligerent/1 1 -nonbinding 1 -nonbreakable -nonburnable -noncaloric -noncancerous -nonce/2 1 -nonchalance/2 1 -nonchalant/8 1 -nonchargeable -nonclerical/1 1 -nonclinical 1 -noncollectable -noncom/1 1 -noncombat -noncombatant/1 1 -noncombustible 1 -noncommercial/1 1 -noncommittal -noncommittally -noncommunicable -noncompeting -noncompetitive 1 -noncompliance/2 1 -noncomplying 1 -noncomprehending 1 -nonconducting -nonconductor/1 1 -nonconforming -nonconformism 1 -nonconformist/1 1 -nonconformity/2 1 -nonconsecutive 1 -nonconstructive 1 -noncontagious 1 -noncontinuous 1 -noncontributing -noncontributory 1 -noncontroversial 1 -nonconvertible 1 -noncooperation/2 1 -noncorroding 1 -noncorrosive 1 -noncredit -noncriminal/1 1 -noncritical 1 -noncrystalline -noncumulative 1 -noncustodial -nondairy 1 -nondeductible/2 1 -nondelivery/15 1 -nondemocratic -nondenominational 1 -nondepartmental 1 -nondepreciating -nondescriptly -nondescript 1 -nondestructive 1 -nondetachable -nondisciplinary -nondisclosure/2 1 -nondiscrimination/2 1 -nondiscriminatory -nondramatic 1 -nondrinker/1 1 -nondrying 1 -noneducational 1 -noneffective 1 -nonelastic 1 -nonelectrical 1 -nonelectric 1 -nonempty -nonenforceable -nonentity/15 1 -nonequivalent/1 1 -nonessential 1 -nonesuch/4 1 -nonetheless -none 1 -nonevent/1 1 -nonexchangeable -nonexclusive -nonexempt/2 1 -nonexistence/2 1 -nonexistent -nonexplosive/1 1 -nonfactual 1 -nonfading -nonfatal 1 -nonfattening -nonfat 1 -nonferrous -nonfiction/2 1 -nonfictional -nonflammable -nonflowering -nonfluctuating -nonflying 1 -nonfood/2 1 -nonfreezing -nonfunctional 1 -nongovernmental -nongranular -nonhazardous 1 -nonhereditary 1 -nonhuman -nonidentical -noninclusive 1 -nonindependent 1 -nonindustrial 1 -noninfectious 1 -noninflammatory -noninflationary -noninflected -nonintellectual/1 1 -noninterchangeable 1 -noninterference/2 1 -nonintervention/2 1 -nonintoxicating 1 -noninvasive -nonirritating -nonjudgmental -nonjudicial 1 -nonlegal -nonlethal 1 -nonlinear -nonliterary 1 -nonliving/2 1 -nonmagnetic -nonmalignant 1 -nonmember/1 1 -nonmetal/1 1 -nonmetallic -nonmigratory -nonmilitant 1 -nonmilitary 1 -nonnarcotic/1 1 -nonnative/1 1 -nonnegotiable -nonnuclear -nonnumerical 1 -nonobjective -nonobligatory 1 -nonobservance/2 1 -nonobservant 1 -nonoccupational -nonoccurrence/2 1 -nonofficial 1 -nonoperational -nonoperative -nonparallel/1 1 -nonparametric -nonpareil/1 1 -nonparticipant/1 1 -nonparticipating -nonpartisan/1 1 -nonpaying -nonpayment/1 1 -nonperformance/2 1 -nonperforming -nonperishable 1 -nonperson/1 1 -nonphysical/8 1 -nonplus/431 1 -nonpoisonous 1 -nonpolitical 1 -nonpolluting -nonporous -nonpracticing -nonprejudicial 1 -nonprescription -nonproductive 1 -nonprofessional/1 1 -nonprofit/1 1 -nonprofitable 1 -nonproliferation/2 1 -nonpublic -nonpunishable -nonracial 1 -nonradioactive -nonrandom 1 -nonreactive -nonreciprocal/1 1 -nonreciprocating -nonrecognition/2 1 -nonrecoverable -nonrecurring -nonredeemable -nonrefillable -nonrefundable -nonreligious 1 -nonrenewable -nonrepresentational -nonresident/1 1 -nonresidential -nonresidual/2 1 -nonresistance/2 1 -nonresistant 1 -nonrestrictive -nonreturnable/1 1 -nonrhythmic 1 -nonrigid -nonsalaried -nonscheduled -nonscientific 1 -nonscoring -nonseasonal 1 -nonsectarian -nonsecular -nonsegregated -nonsense/1 1 -nonsensical/8 1 -nonsensitive 1 -nonsexist -nonsexual 1 -nonskid 1 -nonslip 1 -nonsmoker/1 1 -nonsmoking -nonsocial 1 -nonspeaking -nonspecialist/1 1 -nonspecializing -nonspecific 1 -nonspiritual/1 1 -nonstaining -nonstandard -nonstarter/1 1 -nonstick 1 -nonstop 1 -nonstrategic -nonstriking -nonstructural 1 -nonsuccessive 1 -nonsupport/2 1 -nonsupporting -nonsurgical 1 -nonsustaining -nonsympathizer/2 1 -nontarnishable -nontaxable 1 -nontechnical 1 -nontenured -nontheatrical 1 -nonthinking 1 -nonthreatening 1 -nontoxic 1 -nontraditional 1 -nontransferable -nontransparent 1 -nontrivial -nontropical 1 -non 1 -nonuniform -nonunion 1 -nonuser/1 1 -nonvenomous 1 -nonverbal 1 -nonviable 1 -nonviolence/2 1 -nonviolent/8 1 -nonvirulent 1 -nonvocal 1 -nonvocational 1 -nonvolatile -nonvoter/1 1 -nonvoting -nonwhite/1 1 -nonworking -nonzero -nonyielding -noodle/28 1 -nook/1 1 -nookie 1 -nooky 1 -noon/18 1 -noonday/2 1 -noontide/2 1 -noontime/2 1 -noon 1 -noose/18 1 -Nootka/2 1 -nope 1 -nor -Nora/3 -NORAD/3 -noradrenaline 1 -noradrenalin 1 -Norbert/3 -Norberto/3 -Nordic/1 1 -nor'easter -Noreen/3 -Norfolk/2 1 -Noriega/3 -norm/62 1 -Norma -normal/30 1 -normalcy/2 1 -normality/2 1 -normalizable -normalization/1 1 -normalize/6 1 -normalizer/10 1 -Norman/1 1 -Normand/3 -Normandy/2 1 -Norman 1 -normative 1 -Norplant 1 -Norris -Norse/2 1 -Norseman/2 1043 -Norsemen 1044 -Norse 1 -north/44 1 -North/1 1 -north/2 1 -Northampton -northbound 1 -northeast/44 1 -Northeast/1 1 -northeast/2 1 -northeaster/1 1 -northeasterly -northeastern -northeastward/10 1 -norther/1 1 -northerlies -northerly's -northerly 1 -northern/44 1 -Northern/2 1 -northerner/1 1 -Northerner/2 1 -northernmost -northern 1 -northmen -Northrop/3 -Northrup/3 -North 1 -northward/10 1 -northwest/44 1 -Northwest/1 1 -northwest/2 1 -northwester/1 1 -northwesterly -northwestern -northwestward/10 1 -Norton/3 -Norw -Norway/2 1 -Norwegian/1 1 -Norwich -nos/205 1 -nose/28 1 -nosebag/10 1 -nosebleed/1 1 -nosecone/1 1 -nosedive/6 1 -nosedive's -nosegay/1 1 -Nosferatu/3 -nosh/22 1 -nosher/1 1 -nosier 1045 -nosiest 1045 -nosing 1 -nostalgia/2 1 -nostalgic/39 1 -Nostradamus -nostril/1 1 -nostrum/1 1 -nosy/50 1 -notability/15 1 -notable/82 1 -notarial 1 -notarization/2 1 -notarize/6 1 -notary/15 1 -notate/6 1 -notation/1 1 -notational -notationally -notch/22 1 -notching 1 -note/28 1 -notebook/1 1 -noted 1 -notelet/10 1 -notepad/10 1 -notepaper/2 1 -noteworthy/140 1 -nothing/1 1 -nothingness/3 -nothing 1 -notice/28 1 -noticeable/19 1 -noticeboard -noticeboards -notifiable -notification/1 1 -notifier/1 1 -notify/31 1 -notion/1 1 -notional/8 1 -notoriety/2 1 -notorious/8 1 -no 1 -Nottingham -not 1 -notwithstanding -notwork/10 1 -Nouakchott/2 1 -nougat/1 1 -Noumea/3 -noun/1 1 -nounal -nourish/7 1 -nourishing 1 -nourishment/2 1 -nous 1 -Nov/2 1 -Nova -nova/57 1 -Novartis/3 -nova's 1046 -nova 1047 -novel/1 1 -novelette/1 1 -novelist/1 1 -novelistic 1 -novelization/1 1 -novelize/6 1 -novella/1 1 -novel 1 -novelty/15 1 -November/1 1 -novena/1 1 -novene -Novgorod -novice/1 1 -novitiate/1 1 -Novocain/1 1 -Novocaine -Novokuznetsk -Novosibirsk/2 1 -NOW -now/2 1 -nowadays/2 1 -noway/10 1 -nowhere/2 1 -nowise 1 -now 1 -nowt 1 -noxious/83 1 -Noxzema/3 -Noyce/3 -Noyes/3 -nozzle/1 1 -NP -Np/2 1 -NPR -NR -NRA -NRC -NS -NSC -NSF -NT -nth 1 -nu/1 1 -nuance/1 1 -nuanced 1 -nub/1 1 -nubbin/1 1 -nubby/34 1 -Nubia -Nubian 1 -nubile 1 -nuclear 1 -nuclease 1 -nucleate/6 1 -nucleation/2 1 -nucleic -nuclei 1048 -nucleoli 1049 -nucleolus/2 1050 -nucleon/1 1 -nucleotide/10 1 -nucleus/2 1051 -nude/41 1 -nudge/28 1 -nudism/2 1 -nudist/1 1 -nudity/2 1 -nugatory -nugget/1 1 -nuisance/1 1 -nuke/28 1 -Nukualofa -null/58 1 -nullification/2 1 -nullify/31 1 -nullity/2 1 -null 1 -numb/98 1 -number/23 1 -numberings -numberless 1 -numberplate 1 -Numbers/2 1 -numbers/89 1 -numbing/8 1 -numbskull/1 1 -numerable -numeracy/2 1 -numeral/1 1 -numerate/6 1 -numeration/1 1 -numerator/1 1 -numerical/8 1 -numeric 1 -numerological -numerologist/1 1 -numerology/2 1 -numerous/8 1 -numinous 1 -numismatic/32 1 -numismatist/1 1 -numskull/1 1 -nun/1 1 -Nunavut/3 -nuncio/1 1 -Nunez/3 -Nunki/3 -nunnery/15 1 -nuptial/1 1 -Nuremberg -Nureyev -nurse/28 1 -nurseling/1 1 -nursemaid/18 1 -nurser/1 1 -nursery/15 1 -nurseryman/2 1052 -nurserymen 1053 -nursing/2 1 -nursling/1 1 -nurture/28 1 -nurturer/1 1 -nut/109 1 -nutation 1 -nutcase/10 1 -nutcracker/1 1 -nuthatch/4 1 -nuthouse/10 1 -nutmeat/1 1 -nutmeg/18 1 -nutpick/1 1 -NutraSweet/3 -nutria/1 1 -nutrient/1 1 -nutriment/1 1 -nutrition/2 1 -nutritional/8 1 -nutritionist/1 1 -nutritious/16 1 -nutritive 1 -nutshell/1 1 -nutter/10 1 -nutting 1 -nutty/49 1 -nuzzle/6 1 -nuzzler/1 1 -nuzzle's -NV -NW/2 1 -NWT -NZ -NY -Nyasa/3 -nybble/43 1 -NYC -Nyerere/3 -nyetwork/10 1 -nylon/130 1 -nymph/1 1 -nymphet/1 1 -nympho/10 1 -nympholepsy 1 -nymphomania/2 1 -nymphomaniac/1 1 -NyQuil/3 -NYSE -o -O/1 1 -oaf/1 1 -oafish/8 1 -oafishness/3 -Oahu/2 1 -oak/1 1 -oaken 1 -Oakland/2 1 -Oakley -oak 1 -oakum/2 1 -oar/23 1 -oarlock/1 1 -oarsman/2 1054 -oarsmen 1055 -oarswoman/2 1056 -oarswomen 1057 -OAS/2 1 -oases 1058 -oasis/2 1059 -oat/130 1 -oatcake/1 1 -oaten 1 -Oates -oath/1 1 -oatmeal/2 1 -Oaxaca/2 1 -ob -OB -Ob/2 1 -Obadiah -Obama/3 -obbligato/1 1 -obduracy/2 1 -obdurate/8 1 -obdurateness/3 -obdurate 1 -obedience/2 1 -obedient/8 1 -obeisance/1 1 -obeisant 1 -obelisk/1 1 -Oberlin/3 -Oberon -obese 1 -obesity/2 1 -obey/11 1 -obfuscate/6 1 -obfuscation/1 1 -obfuscatory -obi/18 1 -obis 1 -obit/1 1 -obituary/15 1 -obj -object/23 1 -objectification 1 -objectify/31 1 -objection/1 1 -objectionable/55 1 -objective/36 1 -objectivity/2 1 -objectless 1 -objector/1 1 -objurgate/6 1 -objurgation/1 1 -oblate 1 -oblation/1 1 -obligate/6 1 -obligation/1 1 -obligatory/211 1 -oblige/6 1 -obliged 1 -obliging/8 1 -oblique/432 1 -obliquity/2 1 -obliterate/6 1 -obliteration/2 1 -oblivion/2 1 -oblivious/16 1 -oblong/1 1 -obloquy/2 1 -obnoxious/16 1 -oboe/1 1 -oboist/1 1 -O'Brien -obs -obscene/45 1 -obscenity/15 1 -obscurantism/2 1 -obscurantist/1 1 -obscuration 1 -obscure/433 1 -obscurement 1 -obscurer 1 -obscurity/15 1 -obsequious/16 1 -obsequy/15 1 -observability 1 -observable/268 1 -observance/1 1 -observant/8 1 -observation/1 1 -observational -observationally -observatory/15 1 -observe/6 1 -observed 1 -observer/1 1 -observing 1 -obsess/7 1 -obsession/1 1 -obsessional/8 1 -obsessive/36 1 -obsidian/2 1 -obsolesce/6 1 -obsolescence/2 1 -obsolescent 1 -obsolete/6 1 -obstacle/1 1 -obstetric/32 1 -obstetrical 1 -obstetrician/1 1 -obstinacy/2 1 -obstinate/8 1 -obstreperous/16 1 -obstruct/11 1 -obstructed 1 -obstruction/1 1 -obstructionism/2 1 -obstructionist/1 1 -obstructive/16 1 -obtain/11 1 -obtainable -obtainment/2 1 -obtrude/6 1 -obtruding 1 -obtrusion/2 1 -obtrusive/16 1 -obtuse/27 1 -obverse/1 1 -obviate/6 1 -obviation/2 1 -obvious/16 1 -ocarina/1 1 -O'Casey -Occam -occasion/23 1 -occasional/8 1 -occidental/1 1 -Occidental/1 1 -occidental 1 -Occident 1 -occipital 1 -occlude/6 1 -occlusion/1 1 -occlusive 1 -occult/18 1 -occultism/2 1 -occultist/1 1 -occult 1 -occupancy/15 1 -occupant/1 1 -occupation/1 1 -occupational/8 1 -occupier/1 1 -occupy/31 1 -occur/13 1 -occurrence/1 1 -ocean/1 1 -oceanfront/1 1 -oceangoing -Oceania/2 1 -oceanic/2 1 -oceanographer/1 1 -oceanographic -oceanography/2 1 -oceanology/2 1 -Oceanside -Oceanus/2 1 -ocelot/1 1 -ocher/18 1 -Ochoa/3 -och 1 -ocker/10 1 -o'clock -O'Connell -O'Connor -OCR -Oct/2 1 -octagon/1 1 -octagonal 1 -octahedral -octahedron 1 -octal 1 -octane/1 1 -octant 1 -octave/1 1 -Octavia -Octavian/2 1 -Octavio/3 -octavo/1 1 -octet/1 1 -octette/1 1 -October/1 1 -octogenarian/1 1 -octopus/4 1 -ocular/1 1 -oculist/1 1 -OD/1 1 -odalisque/1 1 -odd/434 1 -oddball/1 1 -oddity/15 1 -oddment/1 1 -ode/1 1 -Odell/3 -Oder/2 1 -Odessa/2 1 -Odets -Odin/2 1 -odious/16 1 -Odis/3 -odium/2 1 -Odom/3 -odometer/1 1 -O'Donnell -odor/1 1 -odored -odoriferous 1 -odorless 1 -odorous -Odysseus/2 1 -odyssey/1 1 -Odyssey/2 1 -OE -OED -oedipal -Oedipal -Oedipus/2 1 -oenology/2 1 -oenophile/1 1 -o'er -Oersted/3 -oeuvre/1 1 -of -Ofelia/3 -off/414 1 -offal/2 1 -offbeat/1 1 -offcuts -Offenbach -offend/11 1 -offended 1 -offender/1 1 -offense/1 1 -offensive/36 1 -offer/23 1 -offering/1 1 -offertory/15 1 -offhanded/8 1 -offhandedness/3 -offhand 1 -office/1 1 -officeholder/1 1 -OfficeMax/3 -officer/18 1 -officership -officerships -official/30 1 -officialdom/2 1 -officialese 1 -officialism/2 1 -officialness -officiant/1 1 -officiate/6 1 -officiator/1 1 -officious/16 1 -offing/1 1 -offish 1 -offline 1 -offload/11 1 -offprint/18 1 -offset/128 1 -offshoot/1 1 -offshore 1 -offside 1 -offspring/2 1 -offstage/10 1 -offtrack 1 -oft/166 1 -often/166 1 -oftentimes -ofttimes -Ogbomosho -Ogden/3 -Ogilvy/3 -ogle/28 1 -ogler/1 1 -Oglethorpe -ogling 1 -ogre/1 1 -ogreish 1 -ogres/9 1 -ogress/4 1 -ogrish -OH -oh/1 1 -O'Hara -O'Higgins -Ohio/2 1 -Ohioan/1 1 -ohm/1 1 -ohmic 1 -ohmmeter/1 1 -oho 1 -OHSA/3 -oik/10 1 -oil/23 1 -oilcan/10 1 -oilcloth/1 1 -oilfield/10 1 -oiling 1 -oilman 1060 -oilmen 1061 -oilseed 1 -oilskin/130 1 -oily/49 1 -oink/23 1 -ointment/1 1 -Oise/3 -oi 1062 -OJ -Ojibwa/1 1 -Ojibway/1 1 -OK/1 1 -okapi/1 1 -okay/86 1 -Okayama -okay 1 -Okeechobee -O'Keeffe -Okefenokee -Okhotsk -Okinawa/2 1 -Okinawan 1 -Okla -Oklahoma/2 1 -Oklahoman 1 -okra/1 1 -Oktoberfest 1 -OK 1 -Ola/3 -Olaf/3 -Olajuwon/3 -Olav/3 -old/187 1063 -olde -Oldenburg -olden 1 -Oldfield/3 -oldie/1 1 -oldish 1 -Oldsmobile/3 -oldster/1 1 -Olduvai/3 -ole/1 1 -oleaginous 1 -oleander/1 1 -olefin 1 -Olen/3 -Olenek/3 -oleo/2 1 -oleomargarin/2 1 -oleomargarine/2 1 -olfactory/15 1 -Olga/3 -oligarch/1 1 -oligarchic -oligarchical 1 -oligarchy/15 1 -Oligocene/2 1 -oligopolies -oligopoly/3 -Olin/3 -Olive/3 -olive/1 1 -Oliver -olive 1 -Olivetti/3 -Olivia/3 -Olivier -olivine 1 -Ollie/3 -Olmec 1 -Olmsted/3 -Olsen/3 -Olson/3 -Olympia/1 1 -Olympiad/1 1 -Olympian/1 1 -Olympic/10 1 -Olympus/2 1 -om/1 1 -Omaha/1 1 -Oman/2 1 -Omani/1 1 -Omar/3 -Omayyad 1 -OMB/2 1 -ombudsman/2 1064 -ombudsmen 1065 -Omdurman/2 1 -omega/1 1 -omelet/1 1 -omen/18 1 -omicron/1 1 -ominous/16 1 -omission/1 1 -omit/12 1 -omnibus/4 1 -omnidirectional -omnipotence/2 1 -Omnipotent -omnipotent 1 -omnipresence/2 1 -omnipresent -omniscience/2 1 -omniscient 1 -omnivore/1 1 -omnivorous/16 1 -Omsk/2 1 -ON -on/435 1 -Onassis -once/2 1 -oncogene/1 1 -oncogenes 1 -oncologist/1 1 -oncology/2 1 -oncoming 1 -one/20 1 -Oneal/3 -Onega -Onegin/3 -Oneida/1 1 -O'Neil -O'Neill -onerous/16 1 -oneself 1 -onetime -ongoing 1 -Onion/3 -onion/18 1 -onionskin/2 1 -online 1 -onlooker/1 1 -onlooking -Ono/3 -onomatopoeia/2 1 -onomatopoeic -onomatopoetic 1 -Onondaga/1 1 -onrush/4 1 -onrushing -Onsager/3 -onscreen -onset/18 1 -onshore 1 -onside 1 -onslaught/1 1 -onstage 1 -Ont -Ontarian 1 -Ontario/2 1 -onto -ontogeny/2 1 -ontological -ontologically -ontology/2 1 -on 1066 -onus/4 1 -onward/10 1 -onyx/4 1 -oodles/2 1 -ooh/11 1 -oolitic -oomph 1 -oops 1 -Oort/3 -ooze/28 1 -oozy/34 1 -op/1 1 -opacity/2 1 -Opal/3 -opal/1 1 -opalescence/2 1 -opalescent -opaque/436 1 -ope/6 1 -OPEC/2 1 -Opel/3 -open/52 1 -opencast -opener/1 1 -openhanded/33 1 -openhearted -opening/1 1 -openwork/2 1 -opera/1 1 -operable 1 -operand/10 1 -opera's 1067 -opera 1068 -operate/6 1 -operatically -operatic 1 -operation/1 1 -operational/8 1 -operative/1 1 -operator/1 1 -operetta/1 1 -ope 1 -Ophelia/3 -Ophiuchus -ophthalmic -ophthalmics -ophthalmologist/1 1 -ophthalmology/2 1 -opiate/18 1 -opine/6 1 -opinion/1 1 -opinionated 1 -opioid 1 -opium/2 1 -opossum/1 1 -opp -Oppenheimer/2 1 -opponent/1 1 -opportune/8 1 -opportunism/2 1 -opportunist/1 1 -opportunistic/39 1 -opportunity/15 1 -oppose/6 1 -opposing 1 -opposite/30 1 -opposition/1 1 -oppositional -oppress/7 1 -oppression/1 1 -oppressive/16 1 -oppressor/1 1 -opprobrious/8 1 -opprobrium/2 1 -Oprah/3 -opt/11 1 -optic/130 1 -optical/8 1 -optician/1 1 -optic 1 -optimal/8 1 -optimality 1 -optima 1069 -optimism/1 1 -optimist/1 1 -optimistic/39 1 -optimization/1 1 -optimize/6 1 -optimizer/10 1 -optimum/1 1070 -option/23 1 -optional/8 1 -optionality 1 -optional 1 -optoelectronic 1 -optometrist/1 1 -optometry/2 1 -opulence/2 1 -opulent/8 1 -opus/4 1071 -OR -Ora/3 -Oracle/3 -oracle/18 1 -oracular 1 -oral/30 1 -Oran/2 1 -Orange -orange/437 1 -orangeade/1 1 -orangery/15 1 -orangutan/1 1 -orangutang/1 1 -Oranjestad/3 -orate/6 1 -oration/1 1 -orator/1 1 -oratorical/8 1 -oratorio/1 1 -oratory/15 1 -orb/18 1 -orbicular 1 -Orbison/3 -orbit/23 1 -orbital/1 1 -orbiter/1 1 -orchard/1 1 -orchestra/1 1 -orchestral 1 -orchestrate/6 1 -orchestration/1 1 -orchestrator 1 -orchid/1 1 -ordain/11 1 -ordainment/2 1 -ordeal/1 1 -order/23 1 -ordering/10 1 -orderless 1 -orderlies -orderly/140 1 -orderly's -ordinal/1 1 -ordinance/1 1 -ordinands -ordinary/221 1 -ordinate/18 1 -ordination/1 1 -ordnance/2 1 -Ordovician/2 1 -ordure/2 1 -Ore -ore/1 1 -Oreg -oregano/2 1 -Oregon/2 1 -Oregonian/1 1 -Oreo 1 -Orestes -org -organ/1 1 -organdie/2 1 -organdy/2 1 -organelle/1 1 -organic/51 1 -organism/1 1 -organismic 1 -organist/1 1 -organizable -organization/1 1 -organizational/8 1 -organize/6 1 -organizer/1 1 -organza/2 1 -orgasm/18 1 -orgasmic -orgiastic -orgy/15 1 -oriel/1 1 -orient/23 1 -orientable -oriental/1 1 -Oriental/1 1 -orientalist/10 1 -oriental 1 -orientate/6 1 -orientation/1 1 -orienteering 1 -orient 1 -Orient 1 -orifice/1 1 -orig -origami/2 1 -origin/1 1 -original/30 1 -originality/2 1 -originate/6 1 -origination/2 1 -originator/1 1 -Orin/3 -Orinoco/2 1 -oriole/1 1 -Orion/2 1 -orison/1 1 -Oriya/2 1 -Orizaba/2 1 -Orkney/2 1 -Orlando/2 1 -Orleans/2 1 -Orlon/1 1 -Orly/2 1 -ormolu/2 1 -ornament/23 1 -ornamental 1 -ornamentation/2 1 -ornate/16 1 -ornery/49 1 -ornithological 1 -ornithologist/1 1 -ornithology/2 1 -orotund -orotundity/15 1 -O'Rourke -orphan/23 1 -orphanage/1 1 -orphan 1 -Orpheus/2 1 -Orphic 1 -Orr/3 -orris/4 1 -Ortega/3 -orthodontia/2 1 -orthodontic/32 1 -orthodontist/1 1 -orthodox 1 -Orthodox 1 -orthodoxy/15 1 -orthogonal/8 1 -orthogonality 1 -orthographic/39 1 -orthographical -orthography/15 1 -orthonormal -orthopedic/32 1 -orthopedist/1 1 -orthorhombic -Ortiz/3 -or 1 -Orval/3 -Orville/3 -Orwell -Orwellian -orzo/2 1 -OS/4 1 -Osage/1 1 -Osaka/2 1 -Osbert/3 -Osborn/3 -Osborne -Oscar/1 1 -Osceola -oscillate/6 1 -oscillation/1 1 -oscillator/1 1 -oscillatory -oscilloscope/1 1 -osculate/6 1 -osculation/1 1 -Osgood/3 -OSHA/2 1 -Oshawa -Oshkosh/3 -osier/1 1 -Osiris/2 1 -Oslo/2 1 -Osman/3 -osmium/2 1 -osmosis/2 1 -osmotic 1 -osprey/1 1 -ossification/2 1 -ossify/31 1 -ostensible/19 1 -ostentation/2 1 -ostentatious/8 1 -osteoarthritis/2 1 -osteopath/1 1 -osteopathic 1 -osteopathy/2 1 -osteoporosis/2 1 -ostler/10 1 -ostracism/2 1 -ostracize/6 1 -ostrich/4 1 -Ostrogoth/2 1 -Ostwald -Osvaldo/3 -Oswald -OT -OTB -OTC -Othello/3 -other/438 1 -otherwise -otherworldly 1 -otiose 1 -Otis/2 1 -OTOH -O'Toole -Ottawa/1 1 -otter/18 1 -Otto -ottoman/1 1 -Ottoman 1 -Ouagadougou -oubliette/1 1 -ouch 1 -oughtn't -ought 1 -Ouija/1 1 -ounce/1 1 -our/10 1 -ourselves -our 1 -oust/11 1 -ouster/1 1 -out/78 1 -outage/1 1 -outargue/6 1 -outback/1 1 -outbalance/6 1 -outbid/439 1 -outboard/1 1 -outboast/11 1 -outbound 1 -outbox/205 1 -outbox's -outbreak/18 1 -outbuilding/1 1 -outburst/18 1 -outcast/18 1 -outclass/7 1 -outcome/1 1 -outcrop/47 1 -outcropping/1 1 -outcry/167 1 -outdated -outdistance/6 1 -outdo/413 1 -outdoor/32 1 -outdoorsy 1 -outdoor 1 -outdraw/301 1072 -outdrew 1073 -outermost -outer 1 -outerwear/2 1 -outface/6 1 -outfall/10 1 -outfield/1 1 -outfielder/1 1 -outfight/121 1074 -outfit/109 1 -outfitter/1 1 -outflank/11 1 -outflow/18 1 -outfought 1075 -outfox/7 1 -outgo/182 1 -outgoing/10 1 -outgrew 1076 -outgrow/301 1077 -outgrowth/1 1 -outguess/7 1 -outgun/192 1 -outhit/88 1 -outhouse/1 1 -outing/1 1 -outlandish/16 1 -outlast/11 1 -outlaw/23 1 -outlawry 1 -outlaw 1 -outlay/353 1 -outlet/1 1 -outlier/10 1 -outline/28 1 -outlive/6 1 -outlook/18 1 -outlying 1078 -outmaneuver/11 1 -outmatch/7 1 -outmoded -outnumber/11 1 -outpace/6 1 -outpatient/1 1 -outperform/11 1 -outplacement/2 1 -outplace 1 -outplay/11 1 -outpoint/11 1 -outpost/1 1 -outpouring/1 1 -outproduce/6 1 -output/109 1 -outrace/6 1 -outrage/28 1 -outrageous/8 1 -outrank/11 1 -outran 1079 -outreach/22 1 -outre 1 -outrider/1 1 -outrigger/1 1 -outright 1 -outrun/119 1080 -outscore/6 1 -outsell/121 1081 -outset/18 1 -outshine/14 1082 -outshone 1083 -outshout/11 1 -outside/48 1 -outsider/1 1 -outsize/1 1 -outsized -outsize 1 -outskirt/1 1 -outsmart/11 1 -outsold 1084 -outsource/6 1 -outsourcing/2 1 -outspend/382 1 -outspoken/16 1085 -outspread/141 1 -outstanding/8 1 -outstation/1 1 -outstay/11 1 -outstretch/7 1 -outstrip/105 1 -outta -outtake/1 1 -outvote/6 1 -outward/191 1 -outwear/121 1086 -outweigh/11 1 -outwit/12 1 -outwith -outwore 1087 -outwork/23 1 -outworker/10 1 -outworn 1087 -ouzo/1 1 -oval/1 1 -ovarian -ovary/15 1 -ova 1088 -ovate 1 -ovation/1 1 -oven/1 1 -ovenbird/1 1 -ovenproof -ovenware 1 -over/164 1 -overabundance/2 1 -overabundant 1 -overachieve/6 1 -overachiever/1 1 -overact/11 1 -overactive -overage/1 1 -overaggressive 1 -overall/130 1 -overallocation -overambitious 1 -overanxious 1 -overarching -overarm/11 1 -overate 1089 -overattentive 1 -overawe/6 1 -overbalance/28 1 -overbear/121 1090 -overbearing/8 1 -overbid/440 1 -overbite/1 1 -overblown -overboard -overbold -overbook/11 1 -overbore 1091 -overborne 1091 -overbought 1092 -overbuild/382 1 -overburden/5 1 -overbuy/121 1093 -overcame 1094 -overcapacity/2 1 -overcapitalize/6 1 -overcareful 1 -overcast/86 1 -overcasting 1 -overcautious 1 -overcharge/28 1 -overclock -overclocked -overclocking -overclocks -overcloud/11 1 -overcoat/18 1 -overcome/14 1095 -overcommitment/10 1 -overcompensate/6 1 -overcompensation/2 1 -overcomplexity -overcomplicated -overconfidence/2 1 -overconfident 1 -overconscientious 1 -overcook/11 1 -overcritical 1 -overcrowd/11 1 -overcrowding/2 1 -overdecorate/6 1 -overdependent -overdetermined -overdevelop/11 1 -overdo/413 1 -overdose/28 1 -overdraft/1 1 -overdraw/301 1096 -overdress/22 1 -overdrew 1097 -overdrive/18 1 -overdub/136 1 -overdue -overeager 1 -overeat/116 1098 -overemotional 1 -overemphasis/2 1 -overemphasize/6 1 -overenthusiastic 1 -overestimate/28 1 -overestimation/2 1 -overexcite/6 1 -overexercise/6 1 -overexert/11 1 -overexertion/2 1 -overexpose/6 1 -overexposure/2 1 -overextend/11 1 -overfed 1099 -overfeed/121 1100 -overfill/11 1 -overfishing -overflight/1 1 -overflow/23 1 -overflowing 1 -overfly/441 1 -overfond 1 -overfull -overgeneralize/6 1 -overgenerous 1 -overgraze/6 1 -overgrew 1101 -overground -overgrow/301 1102 -overgrowth/2 1 -overhand/62 1 -overhang/86 1103 -overhasty 1 -overhaul/23 1 -overhead/1 1 -overhear/46 1 -overheat/5 1 -overhung 1104 -overincredulous -overindulge/6 1 -overindulgence/2 1 -overindulgent 1 -overinflated -overjoy/11 1 -overkill/2 1 -overladen -overlain 1105 -overland 1 -overlap/47 1 -overlarge -overlay/353 1 -overlaying 1 -overlay 1105 -overleaf -overlie/58 1106 -overload/23 1 -overlong -overlook/23 1 -overlord/18 1 -overlying 1105 -overmanned -overmanning -overmaster/11 1 -overmatching -overmodest 1 -overmuch/89 1 -overnice -overnight/18 1 -overoptimism/2 1 -overoptimistic 1 -overparticular 1 -overpass/40 1 -overpay/312 1 -overpayment 1 -overplay/11 1 -overpopulate/6 1 -overpopulation/2 1 -overpopulous 1 -overpower/11 1 -overpowering/8 1 -overpraise/43 1 -overprecise 1 -overpressure 1 -overprice/6 1 -overprint/23 1 -overproduce/6 1 -overproduction/2 1 -overprotect/11 1 -overprotective -overqualified -overran 1107 -overrate/6 1 -overreach/7 1 -overreact/11 1 -overreaction/1 1 -overrefined -overrepresented -override/366 1108 -overripe/2 1 -overrode 1109 -overrule/6 1 -overrun/442 1110 -oversampled -oversampling -oversaw 1111 -oversea/10 1 -oversee/301 1112 -overseer/1 1 -oversell/121 1113 -oversensitive/33 1 -oversensitivity 1 -oversexed -overshadow/11 1 -overshoe/1 1 -overshoot/141 1114 -overshot 1115 -oversight/1 1 -oversimple 1 -oversimplification/1 1 -oversimplify/31 1 -oversize/214 1 -oversleep/121 1116 -overslept 1117 -oversold 1118 -overspecialization/2 1 -overspecialize/6 1 -overspend/382 1 -overspill/86 1 -overspread/121 1 -overstaffed -overstate/6 1 -overstatement/1 1 -overstay/11 1 -overstep/105 1 -overstimulate/6 1 -overstock/5 1 -overstress/195 1 -overstretch/7 1 -overstrict -overstrung -overstuffed -oversubscribe/6 1 -oversubtle 1 -oversupply/31 1 -oversuspicious 1 -overt/8 1 -overtake/76 1119 -overtaker -overtakers -overtax/7 1 -overthrew 1120 -overthrow/144 1121 -overtightened -overtime/18 1 -overtire/6 1 -overtness -overtone/1 1 -overtook 1122 -overture/18 1 -overturn/5 1 -overuse/28 1 -overvaluation/10 1 -overvalue/6 1 -overview/1 1 -overweening/8 1 -overweight/2 1 -overwhelm/11 1 -overwhelming/8 1 -overwinter/11 1 -overwork/23 1123 -overwrite/317 1124 -overwrote 1125 -overwrought 1126 -overzealous 1 -Ovid -oviduct/1 1 -oviparous 1 -ovoid/1 1 -ovular -ovulate/6 1 -ovulation/2 1 -ovule/1 1 -ovum/2 1127 -ow -owe/6 1 -Owen/10 1 -owl/18 1 -owlet/1 1 -owlish/8 1 -own/233 1 -owner/1 1 -ownership/1 1 -ox/443 1 -oxalate 1 -oxalic -oxblood/2 1 -oxbow/1 1 -oxcart/1 1 -oxen 1 -oxford/1 1 -Oxford/1 1 -oxidant/1 1 -oxidation/2 1 -oxide/1 1 -oxidization/2 1 -oxidize/6 1 -oxidizer/1 1 -Oxnard -Oxonian/2 1 -oxtail/10 1 -Oxus -oxyacetylene/2 1 -Oxycontin/3 -oxygen/2 1 -oxygenate/6 1 -oxygenation/2 1 -oxymora 1128 -oxymoron/2 1129 -oyster/18 1 -oz -Oz -Ozark/3 -Ozarks/2 1 -ozone/2 1 -Ozymandias/3 -Ozzie/2 1 -p -P/2 1 -pa/1 1 -Pa/2 1 -PA/2 1 -Paar/3 -Pablo/3 -pablum/2 1 -Pablum/2 1 -Pabst/3 -pabulum/2 1 -PAC/2 1 -Pace/3 -pace/28 1 -pacemaker/1 1 -pacemen -pacer/1 1 -pacesetter/1 1 -pacey 1130 -Pacheco/3 -pachyderm/1 1 -pachysandra/1 1 -pacier 1131 -paciest 1131 -pacific -Pacific/2 1 -pacifically -pacification/2 1 -pacifier/1 1 -pacifism/2 1 -pacifist/1 1 -pacifistic 1 -pacify/31 1 -Pacino/3 -pack/23 1 -packable -package/139 1 -packager/1 1 -packaging/2 1 -Packard/3 -packer/1 1 -packet/18 1 -packhorse 1 -packing/2 1 -packinghouse/1 1 -packsaddle/1 1 -pact/1 1 -pacy/34 1 -pad/113 1 -Padang -padding/2 1 -paddle/28 1 -paddler/1 1 -paddling 1 -paddock/23 1 -paddy/15 1 -Paderewski -Padilla/3 -padlock/23 1 -padre/1 1 -paean/1 1 -paederast/10 1 -paediatricians -paediatrician's -paediatrics -paediatrics's -paella/1 1 -paeony 1 -pagan/1 1 -Paganini -paganism/2 1 -pagan 1 -Page -page/28 1 -pageant/1 1 -pageantry/2 1 -pageboy/1 1 -pageful 1 -pager/1 1 -paginate/6 1 -pagination/2 1 -paging 1 -Paglia/3 -pagoda/1 1 -Pahlavi -pah 1 -Paige/3 -pail/1 1 -pailful/1 1 -pain/23 1 -Paine -painful/85 1 -painkiller/1 1 -painkilling -painless/8 1 -painlessness/3 -painless 1 -painstaking/37 1 -paint/23 1 -paintball -paintbox/4 1 -paintbrush/4 1 -painter/1 1 -painterly 1 -painting/1 1 -paintwork 1 -pair/23 1 -pairing/10 1 -pairwise -paisley/1 1 -Paiute/1 1 -pajama/32 1 -Pakistan/2 1 -Pakistani/1 1 -pal/213 1 -palace/1 1 -paladin/1 1 -palaeolithic -palaeontologist/10 1 -palaeontology 1 -palanquin/1 1 -palatable 1 -palatal/1 1 -palatalization/2 1 -palatalize/6 1 -palate/1 1 -palatial/8 1 -palatinate/1 1 -palatine/1 1 -Palau -palaver/23 1 -pale/107 1 -paleface/1 1 -Palembang -Paleocene/2 1 -Paleogene -paleographer/1 1 -paleographic -paleography/2 1 -paleolithic -Paleolithic -paleontological -paleontologist/1 1 -paleontology/2 1 -Paleozoic/2 1 -Palermo/2 1 -Palestine/2 1 -Palestinian/1 1 -Palestrina -palette/1 1 -Paley -palfrey/1 1 -Palikir/3 -palimony/2 1 -palimpsest/1 1 -palindrome/1 1 -palindromic -paling/1 1 -palisade/18 1 -Palisades/3 -palish 1 -pall/23 1 -Palladio -palladium/2 1 -pallbearer/1 1 -pallet/18 1 -palliate/6 1 -palliation/2 1 -palliative/1 1 -pallid/16 1 -palling 1 -pallor/2 1 -palm/23 1 -palmate 1 -Palmer -Palmerston -palmetto/1 1 -palmist/1 1 -palmistry/2 1 -Palmolive/3 -palmtop/1 1 -palmy/34 1 -Palmyra/3 -Palomar/3 -palomino/1 1 -palpable/19 1 -palpate/6 1 -palpation/2 1 -palpitate/6 1 -palpitating 1 -palpitation/1 1 -palsy/56 1 -paltry/49 1 -pal 1 -paludal -pally 1 -Pam/3 -Pamela/3 -Pamirs -pampas -pampas's -pamper/11 1 -pampered 1 -Pampers -pamphlet/18 1 -pamphleteer/18 1 -pan/1 1 -Pan/2 1 -pan/192 1 -panacea/1 1 -panache/2 1 -panama/1 1 -Panama/1 1 -Panamanian/1 1 -Panasonic/3 -panatella/10 1 -pancake/28 1 -panchromatic -pancreas/4 1 -pancreatic -panda/1 1 -pandemic/1 1 -pandemonium/2 1 -pander/23 1 -panderer/1 1 -Pandora/2 1 -pane/1 1 -paned -panegyric/1 1 -panel/23 1 -paneling/1 1 -panelist/1 1 -pang/18 1 -Pangaea/2 1 -pangolin 1 -panhandle/28 1 -panhandler/1 1 -panic/64 1 -panicking 1 -panicky/34 1 -panier/1 1 -panjandrum 1 -Pankhurst -Panmunjom/3 -pannier/1 1 -panning 1 -panoplies -panoply/3 -panorama/1 1 -panoramic 1 -panpipes -panpipes's -Pansy/3 -pansy/15 1 -pant/23 1 -Pantagruel -Pantaloon/2 1 -pantaloons -pantaloons's -pantechnicon/10 1 -pantheism/2 1 -pantheist/1 1 -pantheistic -pantheist 1 -pantheon/1 1 -Pantheon 1 -panther/1 1 -pantie/1 1 -pantiled -pantiles -panting 1 -panto/10 1 -pantograph/10 1 -pantomime/28 1 -pantomimic -pantomimist/1 1 -pantry/15 1 -pantsuit/1 1 -panty/15 1 -pantyhose/2 1 -pantyliner/2 1 -pantywaist/1 1 -Panza/3 -panzer 1 -pap/18 1 -papa/1 1 -papacy/15 1 -papal 1 -paparazzo/444 1 -papaw/1 1 -papaya/1 1 -paper/78 1 -paperback/18 1 -paperbark -paperbarks -paperboard/2 1 -paperboy/1 1 -paperclip/10 1 -paperer/1 1 -papergirl/1 1 -paperhanger/1 1 -paperhanging/2 1 -papering 1 -paperless 1 -paperweight/1 1 -paperwork/2 1 -papery 1 -papilla/53 1 -papillary -papilla's 1132 -papilla 1133 -papist/1 1 -papoose/1 1 -pappy/15 1 -paprika/2 1 -papyri 1134 -papyrus/2 1135 -par/445 1 -para/1 1 -parable/18 1 -parabola/1 1 -parabolic -paraboloid/10 1 -Paracelsus -paracetamol -paracetamols -parachute/28 1 -parachutist/1 1 -Paraclete -parade/28 1 -parader/1 1 -paradigm/1 1 -paradigmatic -paradisaical -Paradise -paradise/1 1 -paradox/4 1 -paradoxical/8 1 -paraffin/2 1 -paragliding -paragon/18 1 -paragraph/23 1 -Paraguay/2 1 -Paraguayan/1 1 -parakeet/1 1 -paralegal/1 1 -paralinguistic 1 -parallax/4 1 -parallel/23 1 -parallelepiped 1 -parallelism/1 1 -parallelogram/1 1 -parallel 1 -paralysis/2 1 -paralytic/1 1 -paralytically -paralyze/6 1 -paralyzingly -paramagnetic -paramagnetism 1 -Paramaribo/2 1 -paramecia 1136 -paramecium/2 1137 -paramedic/1 1 -paramedical/1 1 -parameter/1 1 -parametric -parametrically -parametrization 1 -parametrize/122 1 -paramilitary/15 1 -Paramount/3 -paramountcy 1 -paramount 1 -paramour/1 1 -Parana/2 1 -paranoia/2 1 -paranoiac/1 1 -paranoid/1 1 -paranormal 1 -parapet/1 1 -paraphernalia/2 1 -paraphrase/28 1 -paraphrases 1138 -paraplegia/2 1 -paraplegic/1 1 -paraprofessional/1 1 -parapsychologist/1 1 -parapsychology/2 1 -paraquat/2 1 -parascending -parasite/1 1 -parasitic -parasitical/8 1 -parasitism/2 1 -parasitologist 1 -parasitology 1 -parasol/1 1 -parasympathetic/10 1 -parathion/2 1 -parathyroid/1 1 -paratroop/32 1 -paratrooper/1 1 -paratyphoid/2 1 -parboil/11 1 -PARC/10 1 -parcel/23 1 -parch/7 1 -parched 1 -Parcheesi/2 1 -parchment/1 1 -pardner/10 1 -pardon/23 1 -pardonable/19 1 -pardoner/1 1 -pardoning 1 -pare/6 1 -paregoric/2 1 -parent/23 1 -parentage/2 1 -parental 1 -parenteral 1 -parentheses 1139 -parenthesis/2 1140 -parenthesize/6 1 -parenthetic -parenthetical/8 1 -parenthood/2 1 -parenting/2 1 -parer/1 1 -pares/89 1 -pareses 1141 -paresis/2 1142 -pares 1143 -Pareto -parfait/1 1 -pariah/1 1 -parietal 1 -parimutuel/1 1 -paring/1 1 -Paris/2 1 -parish/4 1 -parishioner/1 1 -Parisian/1 1 -parity/15 1 -Park -park/23 1 -parka/1 1 -Parker -parking/2 1 -Parkinson/2 1 -parkland 1 -Parkman -Parks -parkway/1 1 -parky 1 -parlance/2 1 -parlay/23 1 -parley/23 1 -parliament/1 1 -parliamentarian/1 1 -parliamentary 1 -Parliament 1 -parlor/1 1 -parlormaid 1 -parlous 1 -Parmesan/1 1 -parmigiana -parmigiano -Parnassus/4 1 -Parnell -parochial/8 1 -parochialism/2 1 -parochiality -parodist/1 1 -parody/56 1 -parole/28 1 -parolee/1 1 -paroxysm/1 1 -paroxysmal 1 -parquet/23 1 -parquetry/2 1 -Parr -parrakeet/1 1 -parricidal -parricide/1 1 -Parrish -parrot/23 1 -parry/56 1 -pars/7 1 -parse/6 1 -parsec/1 1 -Parsee/1 1 -parser/10 1 -Parsi/1 1 -Parsifal/3 -parsimonious/8 1 -parsimony/2 1 -parsing/10 1 -parsley/2 1 -parsnip/1 1 -parson/1 1 -parsonage/1 1 -Parsons -part/210 1 -partake/76 1144 -partaker/1 1 -partaking 1 -parterre/1 1 -parthenogenesis/2 1 -Parthenon/2 1 -Parthia/2 1 -partial/30 1 -partiality/2 1 -participant/1 1 -participate/6 1 -participation/2 1 -participative -participator/1 1 -participatory -participial/2 1 -participle/1 1 -particle/1 1 -particleboard/2 1 -particular/30 1 -particularism 1 -particularity/15 1 -particularization/2 1 -particularize/6 1 -particulate/1 1 -parting/1 1 -partisan/1 1 -partisanship/2 1 -partition/23 1 -partitive/1 1 -partizan/1 1 -partner/23 1 -partnership/1 1 -partook 1145 -partridge/1 1 -parturition/2 1 -partway 1 -party/56 1 -parvenu/1 1 -pas/79 1 -Pasadena/2 1 -PASCAL -pascal/1 1 -Pascal/1 1 -paschal 1 -pasha/1 1 -Pasquale/3 -pass/147 1 -passable/19 1 -passage/18 1 -passageway/1 1 -passbook/1 1 -passe/446 1 -passel/1 1 -passenger/1 1 -passer/1 1 -passerby/2 1146 -passersby 1147 -passim 1 -passing/37 1 -passion/1 1 -Passion/1 1 -passion/58 1 -passionate/83 1 -passionflower/1 1 -passionless 1 -passivated -passive/36 1 -passivisation -passivise -passivised -passivises -passivising -passivity/2 1 -passivization -passivize -passivized -passivizes -passivizing -passkey/1 1 -passmark -Passover/1 1 -passover 1 -passport/1 1 -password/1 1 -past/23 1 -pasta/1 1 -paste/28 1 -pasteboard/2 1 -pastel/1 1 -pastern/1 1 -Pasternak -pastes 1148 -Pasteur/2 1 -pasteurization/2 1 -pasteurize/6 1 -pasteurizer/1 1 -pastiche/1 1 -pastie/447 1 -pastille/1 1 -pastime/1 1 -pasting 1 -pastis 1149 -pastor/18 1 -pastoral/1 1 -pastoralism 1 -pastoral 1 -pastorate/1 1 -pastrami/2 1 -pastry/15 1 -past 1 -pasturage/2 1 -pasture/28 1 -pastureland/2 1 -pasty/286 1 -Pat -pat/403 1 -Patagonia/2 1 -Patagonian 1 -patch/22 1 -patchable -patching 1 -patchouli 1 -patchwork/1 1 -patchy/50 1 -Pate/3 -pate/1 1 -Patel/3 -patella/57 1 -patent/210 1 -patentable 1 -pater/10 1 -paterfamilias/4 1150 -paternal/8 1 -paternalism/2 1 -paternalist/10 1 -paternalistic -paternity/2 1 -paternoster/1 1 -Paterson -path/1 1 -pathetic/39 1 -pathfinder/1 1 -pathless 1 -pathogen/1 1 -pathogenesis 1 -pathogenic 1 -pathological/8 1 -pathologist/1 1 -pathology/15 1 -pathos/2 1 -pathway/1 1 -patience/2 1 -patient/183 1 -patina/1 1 -patine 1 -patio/1 1 -patisserie/10 1 -Patna -patois/2 1 -patresfamilias 1151 -patriarch/1 1 -patriarchal 1 -patriarchate/1 1 -patriarchy/15 1 -Patrica/3 -Patrice/3 -Patricia/3 -patrician/1 1 -patricide/1 1 -Patrick/2 1 -patrimonial 1 -patrimony/15 1 -patriot/1 1 -patriotic/39 1 -patriotism/2 1 -patrol/213 1 -patrolling 1 -patrolman/2 1152 -patrolmen 1153 -patrolwoman/2 1154 -patrolwomen 1155 -patron/1 1 -patronage/18 1 -patroness/3 -patronesses -patronization 1 -patronize/6 1 -patronizer/1 1 -patronizing/8 1 -patronymic/51 1 -patroon/1 1 -Patsy/3 -patsy/15 1 -patten/10 1 -patter/23 1 -pattern/23 1 -patterning 1 -patternless 1 -Patterson/3 -Patti -Patton -Patty/3 -patty/15 1 -paucity/2 1 -Paul/2 1 -Paula/3 -Paulette/3 -Pauli -Pauline -Pauling -paunch/40 1 -paunchy/34 1 -pauper/18 1 -pauperism/2 1 -pauperize/6 1 -pause/28 1 -pausing 1 -Pavarotti -pave/6 1 -pavement/18 1 -paves 1156 -pavilion/18 1 -paving/1 1 -Pavlov/2 1 -pavlova/10 1 -Pavlova 1 -Pavlovian -paw/23 1 -pawl/1 1 -pawn/23 1 -pawnbroker/1 1 -pawnbroking/2 1 -Pawnee/1 1 -pawnshop/1 1 -pawpaw/1 1 -pay/448 1 -payable 1 -payback/1 1 -paycheck/1 1 -payday/1 1 -payee/1 1 -payer/1 1 -paying 1 -payload/1 1 -paymaster/1 1 -payment/1 1 -Payne/3 -payoff/1 1 -payola/2 1 -payout/1 1 -Paypal/3 -PayPal/3 -payphone/10 1 -payroll/1 1 -payslip/1 1 -payware/10 1 -Pb/2 1 -PBS/2 1 -PBX -PC/1 1 -PCB -PCP/2 1 -pct 1 -pd -PD -Pd/2 1 -PDQ -PDT -PE -pea/1 1 -Peabody/3 -Peace/3 -peace/18 1 -peaceable/19 1 -peaceful/85 1 -peacekeeper/1 1 -peacekeeping/2 1 -peacemaker/1 1 -peacemaking/2 1 -peacetime/2 1 -peach/40 1 -peachy/34 1 -peacock/18 1 -peafowl/1 1 -peahen/1 1 -peak/23 1 -peaky/222 1 -peal/23 1 -Peale -pealing 1 -peanut/1 1 -pear/1 1 -Pearl/3 -pearl/23 1 -Pearlie/3 -pearling 1 -pearl 1 -pearly/34 1 -Pearson/3 -peartrees -Peary -peasant/1 1 -peasantry/2 1 -peasant 1 -peashooter/1 1 -pea's 1157 -pea 1158 -peas 1 -peat/2 1 -pea 1 -peaty/34 1 -pebble/28 1 -pebbling 1 -pebbly/34 1 -pecan/1 1 -peccadillo/4 1 -peccary/15 1 -Pechora -Peck/3 -peck/23 1 -pecker/10 1 -pecking 1 -Peckinpah/3 -peckish 1 -Pecos/2 1 -pectic 1 -pectin/2 1 -pectoral/1 1 -peculate/6 1 -peculation/1 1 -peculator/2 1 -peculiar/8 1 -peculiarity/15 1 -peculiar 1 -pecuniary 1 -pecs -pedagog/1 1 -pedagogical/8 1 -pedagogic 1 -pedagogue/18 1 -pedagogy/2 1 -pedal/23 1 -pedalo/10 1 -pedal 1 -pedant/1 1 -pedantic -pedantically -pedantry/2 1 -peddle/6 1 -peddler/1 1 -peddling 1 -pederast/1 1 -pederasty/2 1 -pedestal/18 1 -pedestrian/1 1 -pedestrianization 1 -pedestrianize/6 1 -pediatric/32 1 -pediatrician/1 1 -pedicab/1 1 -pedicure/28 1 -pedicurist/1 1 -pedigree/1 1 -pedigreed -pediment/1 1 -pedlar/1 1 -pedology 1 -pedometer/1 1 -pedophile/10 1 -pedophilia 1 -Pedro/3 -peduncle/1 1 -pee/63 1 -peek/23 1 -peekaboo/2 1 -Peel/3 -peel/23 1 -peeler/1 1 -peeling/1 1 -peen/18 1 -peep/23 1 -peepbo -peeper/1 1 -peephole/1 1 -peepshow/1 1 -peer/23 1 -peerage/1 1 -peeress/4 1 -peerless 1 -peeve/28 1 -peeved 1 -peevish/16 1 -peewee/1 1 -peewit/10 1 -Peg/3 -peg/92 1 -Pegasus/4 1 -pegboard/1 1 -pegging 1 -Peggy/3 -Pei -peignoir/1 1 -Peiping/2 1 -pejoration/2 1 -pejorative/30 1 -peke/1 1 -Pekinese/1 1 -pekinese/2 1 -pekineses -Peking/1 1 -Pekingese/1 1 -pekingese/2 1 -pekingeses -pekoe/2 1 -pelagic -Pele/3 -Pelee/3 -pelf/2 1 -pelican/1 1 -pellagra/2 1 -pellet/23 1 -pellmell 1 -pellucid 1 -pelmet/10 1 -Peloponnese/2 1 -pelt/23 1 -pelting 1 -pelvic 1 -pelvis/4 1 -Pembroke/2 1 -pemmican/2 1 -Pen -pen/449 1 -Pena/3 -penalization/2 1 -penalize/6 1 -penal 1 -penalty/15 1 -penance/18 1 -pence 1159 -penchant/1 1 -pencil/23 1 -penciling/10 1 -pend/11 1 -pendant/1 1 -pendent/1 1 -Penderecki/3 -pendulous -pendulum/1 1 -Penelope/2 1 -penetrability/2 1 -penetrable 1 -penetrate/6 1 -penetrating/8 1 -penetration/1 1 -penetrative 1 -penfriend -penfriends -penguin/1 1 -penicillin/2 1 -penile 1 -peninsula/1 1 -peninsular -penis/4 1 -penitence/2 1 -penitent/30 1 -penitential 1 -penitentiary/15 1 -penknife/2 1160 -penknives 1161 -penlight/1 1 -penlite/1 1 -penman/2 1162 -penmanship/2 1 -penmen 1163 -Penn -Penna -pennant/1 1 -penned 1 -Penney/3 -pennies -penniless 1 -Pennington/3 -pennon/1 1 -Pennsylvania/2 1 -Pennsylvanian/1 1 -Pennzoil/3 -penologist/1 1 -penology/2 1 -Pensacola/3 -pension/23 1 -pensionable 1 -pensioner/1 1 -pensive/16 1 -pentacle/1 1 -pentagon/1 1 -Pentagon/2 1 -pentagonal 1 -pentagram/1 1 -pentameter/1 1 -pentasyllabic -Pentateuch/2 1 -pentathlete/1 1 -pentathlon/1 1 -pentatonic -Pentax/3 -Pentecost/1 1 -pentecostal -Pentecostal/1 1 -Pentecostalism 1 -penthouse/18 1 -Pentium/1 1 -pent 1 -penuche/2 1 -penultimate/1 1 -penultimately -penumbra/57 1 -penurious/16 1 -penury/2 1 -Penny/3 -penny/2 1164 -pennyweight/1 1 -pennyworth 1 -peon/1 1165 -peonage/2 1 -peony/15 1 -people/28 1 -people's 1166 -people 1167 -Peoria -pep/47 1 -peperoni 1 -Pepin/3 -pepper/23 1 -peppercorn/1 1 -peppering 1 -peppermint/1 1 -pepperoni/1 1 -peppery 1 -peppy/49 1 -Pepsi/2 1 -pepsin/2 1 -peptic/1 1 -peptide/10 1 -Pepys -Pequot 1 -peradventure/2 1 -perambulate/6 1 -perambulation/1 1 -perambulator/1 1 -percale/1 1 -perceivable -perceive/6 1 -perceived 1 -perceiving 1 -percent/1 1 -percentage/1 1 -percentile/1 1 -percent 1 -perceptibility 1 -perceptible/19 1 -perception/1 1 -perceptional -perceptive/16 1 -percepts -perceptual/8 1 -perch/22 1 -perchance 1 -Percheron 1 -perchlorate 1 -percipience/2 1 -percipient 1 -Percival -percolate/43 1 -percolation/2 1 -percolator/1 1 -percuss/7 1 -percussion/2 1 -percussionist/1 1 -percussive/8 1 -Percy -perdition/2 1 -perdurable 1 -peregrinate/6 1 -peregrination/1 1 -peregrine/1 1 -Perelman/3 -peremptoriness -peremptory/211 1 -perennial/30 1 -perestroika/2 1 -Perez/3 -perfect/52 1 -perfecta/1 1 -perfecter 1 -perfectibility/2 1 -perfectible -perfection/1 1 -perfectionism/2 1 -perfectionist/1 1 -perfidious/8 1 -perfidy/15 1 -perforate/6 1 -perforation/1 1 -perforce 1 -perform/11 1 -performable -performance/1 1 -performer/1 1 -performing 1 -perfume/28 1 -perfumer/1 1 -perfumery/15 1 -perfunctory/211 1 -perfused -perfusion 1 -pergola/1 1 -perhaps 1 -periastron -pericardia 1168 -pericardium/2 1169 -Periclean -Pericles -perigee/1 1 -periglacial -perihelia 1170 -perihelion/2 1171 -peril/23 1 -periling 1 -perilous/8 1 -perimeter/1 1 -perinatal -perinea 1172 -perineum/2 1173 -period/1 1 -periodic -periodical/30 1 -periodicity/2 1 -periodontal -periodontics -periodontics's -periodontist/1 1 -period 1 -peripatetic/1 1 -peripheral/30 1 -periphery/15 1 -periphrases 1174 -periphrasis/2 1175 -periphrastic -periscope/18 1 -perish/7 1 -perishable/1 1 -perisher/10 1 -peristalses 1176 -peristalsis/2 1177 -peristaltic 1 -peristyle/1 1 -peritoneal -peritoneum/1 1 -peritonitis/2 1 -periwig/18 1 -periwinkle/1 1 -perjure/6 1 -perjured 1 -perjurer/1 1 -perjury/15 1 -perk/23 1 -Perkins -perk 1 -perky/50 1 -Perl/1 1 -perm/1 1 -Perm/2 1 -perm/11 1 -permafrost/2 1 -Permalloy/2 1 -permanence/2 1 -permanency/2 1 -permanent/30 1 -permanganate 1 -permeability/2 1 -permeable 1 -permeate/6 1 -permeation/2 1 -Permian/2 1 -permissibility 1 -permissible/19 1 -permission/1 1 -permissive/16 1 -permit/109 1 -permitted 1 -permittivity 1 -permutation/1 1 -permute/6 1 -pernicious/16 1 -pernickety 1 -Pernod/2 1 -Peron -peroration/1 1 -Perot/3 -peroxidase 1 -peroxide/28 1 -perpendicular/30 1 -perpendicularity/2 1 -perpetrate/6 1 -perpetration/2 1 -perpetrator/1 1 -perpetual/30 1 -perpetuate/6 1 -perpetuation/2 1 -perpetuity/2 1 -perplex/7 1 -perplexed/8 1 -perplexing 1 -perplexity/15 1 -perquisite/1 1 -Perrier 1 -Perry -perry 1 -persecute/6 1 -persecution/1 1 -persecutor/1 1 -Perseid 1 -Persephone/2 1 -Persepolis/2 1 -Perseus/2 1 -perseverance/2 1 -persevere/6 1 -persevering/8 1 -Pershing -Persia/2 1 -Persian/1 1 -persiflage/2 1 -persimmon/1 1 -persist/11 1 -persistence/2 1 -persistent/8 1 -persnickety -person/1 1178 -persona/53 1 -personable 1 -personage/1 1 -personal/30 1 -personality/15 1 -personalization 1 -personalize/6 1 -personalty/2 1 -personification/1 1 -personify/31 1 -personnel/2 1 -perspective/1 1 -perspex 1 -perspicacious/8 1 -perspicacity/2 1 -perspicuity/2 1 -perspicuous/8 1 -perspiration/2 1 -perspire/6 1 -perspiring 1 -persuadable 1 -persuade/6 1 -persuader/1 1 -persuasion/1 1 -persuasive/16 1 -pert/21 1 -pertain/11 1 -Perth/2 1 -pertinacious/8 1 -pertinacity/2 1 -pertinence/2 1 -pertinent/8 1 -per 1 -pert 1 -perturb/11 1 -perturbation/1 1 -perturbed 1 -perturbing 1 -pertussis/2 1 -Peru/2 1 -peruke/1 1 -perusal/1 1 -peruse/6 1 -Peruvian/1 1 -perv/10 1 -pervade/6 1 -pervasive/16 1 -perverse/16 1 -perversion/1 1 -perversity/2 1 -pervert/23 1 -peseta/1 1 -Peshawar -peskiness/3 -pesky/59 1 -peso/1 1 -pessary/60 1 -pessimal/11 1 -pessimaling 1 -pessimally -pessimism/2 1 -pessimist/1 1 -pessimistic/39 1 -pest/1 1 -pester/11 1 -pestering 1 -pesticide/1 1 -pestiferous 1 -pestilence/1 1 -pestilent -pestilential 1 -pestle/28 1 -pestling 1 -pesto/2 1 -pet/1 1 -PET/2 1 -pet/12 1 -Petain/3 -petal/1 1 -petaled -petard/1 1 -petcock/1 1 -Pete/3 -peter/1 1 -Peter/1 1 -peter/11 1 -Petersen/3 -Peterson/3 -pethidine -petiole/1 1 -petite/1 1 -petition/23 1 -petitioner/1 1 -Petra -Petrarch/2 1 -petrel/1 1 -petrifaction/2 1 -petrification 1 -petrify/31 1 -petrochemical/1 1 -petrodollar/1 1 -petrographic -petrographical 1 -petrol/2 1 -petrolatum/2 1 -petroleum/2 1 -petrological 1 -petrologist/1 1 -petrology/2 1 -petrol 1 -petticoat/1 1 -pettifog/117 1 -pettifogger/1 1 -pettifoggery/2 1 -pettifogging 1 -petting/2 1 -pettish/83 1 -pet 1 -petulance/2 1 -petulant/8 1 -petunia/1 1 -Petty/3 -petty/50 1 -Peugeot/3 -pew/1 1 -pewee/1 1 -pewit/1 1 -pewter/1 1 -peyote/2 1 -pf -Pfc -PFC -pfennig/1 1 -Pfizer/3 -pg -PG -Phaedra -Phaethon/2 1 -phaeton/1 1 -phage/10 1 -phagocyte/1 1 -phalanger/1 1 -phalanx/450 1 -phallic 1 -phalli 1179 -phallus/2 1180 -Phanerozoic -phantasm/1 1 -phantasmagoria/1 1 -phantasmagorical 1 -phantasmal -phantasy/56 1 -phantom/1 1 -pharaoh/1 1 -Pharaoh/1 1 -pharisaic -Pharisaical -Pharisaic 1 -pharisee/1 1 -Pharisee/1 1 -pharmaceutic/130 1 -pharmaceutical/1 1 -pharmacist/1 1 -pharmacological 1 -pharmacologist/1 1 -pharmacology/2 1 -pharmacopeia/1 1 -pharmacopoeia/1 1 -pharmacy/15 1 -pharyngeal 1 -pharyngitis/2 1 -pharynx/201 1 -phase/28 1 -phaseout/1 1 -phases 1181 -phat -PhD/2 1 -pheasant/1 1 -Phekda/3 -Phelps/3 -phenacetin/2 1 -phenobarbital/2 1 -phenol/1 1 -phenolic 1 -phenolphthalein 1 -phenom/1 1 -phenomenal/8 1 -phenomena 1182 -phenomenological -phenomenologically -phenomenology 1 -phenomenon/1 1183 -phenotype/10 1 -phenylalanine 1 -pheromone/1 1 -phew 1 -phi/1 1 -phial/18 1 -Phidias -Phil -Philadelphia/2 1 -philander/11 1 -philanderer/1 1 -philandering's -philanthropic/39 1 -philanthropist/1 1 -philanthropy/15 1 -philatelic -philatelist/1 1 -philately/3 -Philby/3 -Philemon -philharmonic/1 1 -Philip -Philippe/3 -Philippians -philippic/1 1 -Philippine/1 1 -Philips -philistine/1 1 -Philistine 1 -philistinism/2 1 -Phillip/10 1 -Phillipa/3 -philodendron/1 1 -philological 1 -philologist/1 1 -philology/2 1 -philosopher/1 1 -philosophic -philosophical/8 1 -philosophize/6 1 -philosophizer/1 1 -philosophy/15 1 -philter/18 1 -philtre/18 1 -Philly/3 -Phipps/3 -phish -phished -phisher/3 -phishers -phishing -phlebitis/2 1 -phlebotomy 1 -phlegm/2 1 -phlegmatically -phlegmatic 1 -phloem/2 1 -phlogiston 1 -phlox/2 1 -phobia/1 1 -phobic/1 1 -Phobos -phoebe/1 1 -Phoebe/2 1 -Phoenicia/2 1 -Phoenician/1 1 -Phoenix/2 1 -phoenix/4 1 -phone/28 1 -phonecard/10 1 -phoneme/1 1 -phonemically -phonemic 1 -phonetic/35 1 -phonetician/1 1 -phoneticist 1 -phoney/23 1184 -phonic/32 1 -phonically -phonic 1 -phonier 1185 -phoniest 1185 -phonograph/1 1 -phonographic -phonological/8 1 -phonologist/1 1 -phonology/2 1 -phonon 1 -phony/282 1 -phooey 1 -phosphatase 1 -phosphate/1 1 -phosphor/1 1 -phosphorescence/2 1 -phosphorescent/8 1 -phosphoric -phosphorous -phosphorus/2 1 -photo/23 1 -photocell/1 1 -photochemical/8 1 -photochemistry 1 -photocopier/1 1 -photocopy/56 1 -photoelectric -photoelectrically -photoengrave/6 1 -photoengraver/1 1 -photoengraving/1 1 -photofinishing/2 1 -photogenic/39 1 -photograph/23 1 -photographer/1 1 -photographic/39 1 -photography/2 1 -photojournalism/2 1 -photojournalist/1 1 -photolysis 1 -photolytic -photometer/1 1 -photometric -photometrically -photometry 1 -photomultiplier 1 -photon/1 1 -photoreceptor 1 -photosensitive -photosphere 1 -photostat/1 1 -Photostat/1 1 -photostat/12 1 -Photostat/12 1 -photostatic 1 -photosynthesis/2 1 -photosynthesize/6 1 -photosynthetic/39 1 -phototypesetter 1 -phototypesetting 1 -photovoltaic 1 -phrasal 1 -phrase/28 1 -phrasebook -phrasebooks -phraseology/2 1 -phrasing/1 1 -phreaking/10 1 -phrenetic 1 -phrenological/8 1 -phrenologist/1 1 -phrenology/2 1 -Phrygia/2 1 -pH 1 -phylactery/15 1 -phyla 1186 -Phyllis/3 -phylogenetic 1 -phylogeny/2 1 -phylum/2 1187 -phys -physic/451 1 -physical/30 1 -physicality 1 -physician/1 1 -physicist/1 1 -physio/10 1 -physiognomy/15 1 -physiography/2 1 -physiologic -physiological/8 1 -physiologist/1 1 -physiology/2 1 -physiotherapist/1 1 -physiotherapy/2 1 -physique/1 1 -phytoplankton 1 -pi/452 1 -Piaf/3 -Piaget/2 1 -pianissimo/1 1 -pianist/1 1 -pianistic -piano/1 1 -pianoforte/1 1 -pianola -Pianola/2 1 -pianolas -piano 1 -piaster/1 1 -piazza/1 1 -pibroch/1 1 -pic/332 1 -pica/2 1 -picador/1 1 -picaresque 1 -Picasso/2 1 -picayune 1 -Piccadilly -piccalilli/2 1 -piccolo/1 1 -pick/23 1 -pickaback 1 -pickax/22 1 -pickaxe/28 1 -picker/1 1 -pickerel/1 1 -Pickering/3 -picket/23 1 -picketer/10 1 -Pickett -Pickford/3 -picking/32 1 -pickle/28 1 -pickling 1 -pickpocket/1 1 -pickpocketing -pickup/1 1 -Pickwick/3 -picky/34 1 -picnic/64 1 -picnicker/1 1 -picoseconds -picot/18 1 -pic's -pictogram 1 -pictograph/1 1 -pictographic -pictorial/30 1 -Pict 1 -picture/28 1 -picturesque/16 1 -piddle/28 1 -piddly 1 -pidgin/1 1 -pie/63 1 -piebald/1 1 -piece/28 1 -piecemeal -piecewise -piecework/2 1 -pieceworker/1 1 -piecing 1 -Piedmont/2 1 -pier/1 1 -Pierce/2 1 -pierce/6 1 -piercer/10 1 -piercing/30 1 -Pierre/2 1 -Pierrot/2 1 -piety/2 1 -piezoelectric -piffle/453 1 -pig/92 1 -pigeon/18 1 -pigeonhole/28 1 -piggery/60 1 -piggish/16 1 -pigheaded/33 1 -pigheadedly -piglet/1 1 -pigment/62 1 -pigmentation/2 1 -pigmy/15 1 -Pigmy/15 1 -pigpen/1 1 -pigskin/1 1 -pigsty/15 1 -pigswill 1 -pigtail/1 1 -pigtailed -piggy/42 1 -piggyback/23 1 -Pike/3 -pike/28 1 -piker/1 1 -pikes 1188 -pikestaff/1 1 -pilaf/1 1 -pilaff/1 1 -pilaster/1 1 -Pilate -Pilates -pilau/1 1 -pilchard/1 1 -Pilcomayo -pile/28 1 -piles 1189 -pileup/1 1 -pilfer/11 1 -pilferage/2 1 -pilferer/1 1 -pilfering 1 -pilgrim/1 1 -Pilgrim/10 1 -pilgrimage/18 1 -piling/1 1 -pill/18 1 -pillage/28 1 -pillager/1 1 -pillar/62 1 -pillbox/4 1 -pillion/18 1 -pillock/10 1 -pillory/56 1 -pillow/23 1 -pillowcase/1 1 -pillowslip/1 1 -Pillsbury/3 -pilot/23 1 -pilothouse/1 1 -piloting 1 -pilot 1 -pimento/1 1 -pimiento/1 1 -pimp/23 1 -pimpernel/1 1 -pimple/1 1 -pimpled 1 -pimply/34 1 -PIN -pin/133 1 -pinafore/1 1 -pinata/1 1 -Pinatubo/3 -pinball/2 1 -pincer/62 1 -pinch/22 1 -pincher 1 -pinching 1 -Pincus/3 -pincushion/1 1 -Pindar/2 1 -pine/28 1 -pineal 1 -pineapple/1 1 -pinewood/10 1 -piney 1190 -pinfeather/1 1 -ping/23 1 -pinhead/1 1 -pinhole/1 1 -pinier 1191 -piniest 1191 -pinion/23 1 -pink/179 1 -Pinkerton -pinker 1 -pinkeye/2 1 -pinkie/1 1 -pinking 1 -pinkish 1 -pinkness/3 -pinko/1 1 -pinky/15 1 -pinnacle/77 1 -pinnate 1 -pinning 1 -Pinocchio/3 -Pinochet/3 -pinochle/2 1 -pinocle/2 1 -pinon/1 1 -pinpoint/23 1 -pinprick/18 1 -pinsetter/1 1 -pinstripe/1 1 -pinstriped -pinstripe 1 -pint/1 1 -Pinter -pinto/1 1 -pinup/1 1 -pinwheel/23 1 -piny/34 1 -Pinyin -pinyin/2 1 -pinny/60 1 -pinyon/1 1 -pioneer/23 1 -pious/16 1 -pip/47 1 -pipe/28 1 -pipeline/18 1 -piper/1 1 -pipes 1192 -pipette/18 1 -pipework 1 -piping/2 1 -pipit/1 1 -pippin/1 1 -Pippin/2 1 -pipsqueak/1 1 -piquancy/2 1 -piquant/8 1 -pique/28 1 -piracy/2 1 -Piraeus -Pirandello -piranha/1 1 -pirate/28 1 -piratical/8 1 -pirogi/2 1 -piroshki/2 1 -pirouette/28 1 -pis/79 1 -Pisa 1193 -piscatorial -Pisces/2 1 -Pisistratus -pismire/1 1 -piss/22 1 -Pissaro/3 -pisser/10 1 -pissoir/10 1 -pi's 1194 -pistachio/1 1 -piste/10 1 -pistil/1 1 -pistillate -pistol/18 1 -piston/1 1 -pi 1195 -pit/109 1 -pita/1 1 -pitapat/18 1 -pita's 1196 -pita 1197 -Pitcairn/3 -pitch/22 1 -pitchblende/2 1 -pitcher/1 1 -pitchfork/23 1 -pitching 1 -pitchman/2 1198 -pitchmen 1199 -piteous/16 1 -pitfall/1 1 -pith/18 1 -pithead/10 1 -pithy/50 1 -pitiable/19 1 -pitiful/454 1 -pitiless/16 1 -piton/1 1200 -Pitt -pitta/10 1 -pittance/1 1 -pitting 1 -Pittman/3 -Pitts -Pittsburgh/2 1 -pituitary/15 1 -pity/56 1 -pitying/8 1 -Pius/3 -pivot/23 1 -pivotal 1 -pix/2 1 -pixel/1 1 -pixie/1 1 -pix 1 -pixy/15 1 -Pizarro -pizazz/2 1 -pizza/1 1 -pizzazz/2 1 -pizzeria/1 1 -pizzicato/323 1 -pj's -PJ's -pk -pkg -pkt -pkwy -Pkwy -pl -Pl -placard/23 1 -placate/6 1 -placating 1 -placation/2 1 -placatory -Place -place/28 1 -placebo/1 1 -placeholder/1 1 -placekick/23 1 -placekicker/1 1 -placemen 1201 -placement/1 1 -placenta/1 1 -placental/10 1 -placer/1 1 -placid/8 1 -placidity/2 1 -placing/10 1 -placket/1 1 -plagiarism/1 1 -plagiarist/1 1 -plagiarize/6 1 -plagiarizer/1 1 -plagiary/2 1 -plague/28 1 -plaice 1 -plaid/18 1 -plain/455 1 -plainchant 1 -plainclothes -plainclothesman/2 1202 -plainclothesmen 1203 -plainsman/2 1204 -plainsmen 1205 -plainsong/2 1 -plainspoken -plaint/1 1 -plaintiff/1 1 -plaintive/8 1 -plait/23 1 -plaiting 1 -plan/133 1 -planar 1 -Planck -plane/139 1 -planeload/1 1 -planer/1 1 -planet/1 1 -planetarium/1 1 -planetary 1 -planetesimals -planetoids -plangency/2 1 -plangent 1 -plank/23 1 -planking/2 1 -plankton/2 1 -planner/1 1 -planning/10 1 -Plano -plant/23 1 -Plantagenet/2 1 -plantain/1 1 -plantar 1 -plantation/1 1 -planter/1 1 -planting/1 1 -plantlike 1 -plaque/1 1 -plash/22 1 -plashing 1 -plasma/1 1 -plasma's 1206 -plasma 1207 -plasmid/10 1 -plaster/23 1 -plasterboard/2 1 -plasterer/1 1 -plastering 1 -plasterwork 1 -plastic/1 1 -Plasticine/2 1 -plasticine 1 -plasticity/2 1 -plasticize/6 1 -plasticizers -plastic 1 -plat/109 1 -Plataea/2 1 -plate/28 1 -plateau/23 1 -plateful/1 1 -platelet/1 1 -platen/1 1 -platform/23 1 -Plath -plating/2 1 -platinum/2 1 -platitude/1 1 -platitudinous 1 -Plato/2 1 -platonic -Platonic 1 -Platonism/2 1 -Platonist/2 1 -platoon/23 1 -Platte/2 1 -platter/1 1 -platting 1 -platy/2 1 -platypus/4 1 -platy 1 -plaudit/1 1 -plausibility/2 1 -plausible/19 1 -Plautus/2 1 -play/78 1 -playability 1 -playable 1 -playact/11 1 -playacting/2 1 -playback/1 1 -playbill/1 1 -playbook/1 1 -Playboy/3 -playboy/1 1 -player/1 1 -playfellow/1 1 -playful/16 1 -playgirl/1 1 -playgoer/1 1 -playground/1 1 -playgroup/10 1 -playhouse/1 1 -playing/10 1 -playmate/1 1 -playoff/1 1 -playpen/1 1 -playroom/1 1 -playschool/10 1 -PlayStation/3 -Playtex/3 -plaything/1 1 -playtime/2 1 -playwright/1 1 -plaza/1 1 -plea/1 1 -plead/11 1 -pleader/1 1 -pleading/30 1 -pleas/7 1 -pleasant/21 1 -pleasantry/15 1 -please/6 1 -pleased 1 -please 1 -pleasing/191 1 -plea's 1208 -plea 1209 -pleasurable/19 1 -pleasure/28 1 -pleasureful -pleat/23 1 -pleb/10 1 -plebby 1 -plebe/1 1 -plebeian/1 1 -plebiscite/1 1 -plectra 1210 -plectrum/1 1211 -pledge/28 1 -Pleiades's -Pleistocene/2 1 -plenary/15 1 -plenipotentiary/15 1 -plenitude/1 1 -plenteous/8 1 -plentiful/8 1 -plenty/2 1 -plenum/10 1 -pleonasm/1 1 -plethora/2 1 -pleura/53 1 -pleural 1 -pleura's 1212 -pleura 1213 -pleurisy/2 1 -Plexiglas/4 1 -plexiglass/2 1 -plexus/4 1 -pliability/2 1 -pliable 1 -pliancy/2 1 -pliant/8 1 -pliers -pliers's -plight/23 1 -plimsoll/10 1 -plinth/1 1 -Pliny -Pliocene/1 1 -PLO -plod/311 1 -plodder/1 1 -plodding/10 1 -plonk/5 1 -plonker/10 1 -plop/47 1 -plosive/10 1 -plot/109 1 -plotter/18 1 -plover/1 1 -plow/23 1 -plowers -plowman/2 1214 -plowmen 1215 -plowshare/1 1 -ploy/18 1 -pluck/23 1 -plucker 1 -plucky/50 1 -plug/92 1 -plugging 1 -plughole/10 1 -plum/18 1 -plumage/2 1 -plumb/78 1 -plumbago 1 -plumber/1 1 -plumbing/1 1 -plume/28 1 -plummet/23 1 -plummy 1 -plump/165 1 -plumper 1 -plumply 1 -plum 1 -plumy/34 1 -plunder/23 1 -plunderer/1 1 -plunge/28 1 -plunger/1 1 -plunging 1 -plunk/23 1 -pluperfect/1 1 -plural/1 1 -pluralism/2 1 -pluralist/1 1 -pluralistic -plurality/15 1 -pluralization/2 1 -pluralize/6 1 -plural 1 -plus/40 1 -plush/187 1 -plushly 1 -plushy/34 1 -plus 1 -Plutarch/2 1 -Pluto/2 1 -plutocracy/15 1 -plutocrat/1 1 -plutocratic -plutonium/2 1 -pluvial 1 -ply/31 1 -plying 1216 -Plymouth/2 1 -ply's -plywood/2 1 -PM/1 1 -Pm/2 1 -PMed -PMing -PMS/2 1 -pm 1 -pneumatic/276 1 -pneumonia/2 1 -PO -Po/2 1 -poach/7 1 -poacher/1 1 -poaching/2 1 -Pocahontas/2 1 -pock/23 1 -pocket/23 1 -pocketbook/1 1 -pocketful/1 1 -pocketknife/2 1217 -pocketknives 1218 -pocket 1 -pockmark/23 1 -Pocono/3 -Poconos -pod/113 1 -podcast -Podgorica -podgy 1 -Podhoretz/3 -podiatrist/1 1 -podiatry/2 1 -podium/1 1 -Podunk 1 -Poe -poem/1 1 -poesy/2 1 -poet/1 1 -poetaster/1 1 -poetess/4 1 -poetic/10 1 -poetical/8 1 -poetic 1 -poetry/2 1 -Pogo/3 -pogo 1 -pogrom/18 1 -poi/2 1 -poignancy/2 1 -poignant/8 1 -poikilothermic -Poincare/3 -poinciana/1 1 -poinsettia/1 1 -point/23 1 -pointblank 1 -pointed/83 1 -pointer/1 1 -pointillism/2 1 -pointillist/1 1 -pointing 1 -pointless/16 1 -pointy/34 1 -Poiret/3 -Poirot/3 -poise/28 1 -poison/78 1 -poisoner/1 1 -poisoning/1 1 -poisonous/8 1 -Poisson/3 -Poitier/2 1 -poke/28 1 -Pokemon/3 -poker/1 1 -pokey/1 1219 -pokier 1220 -pokiest 1220 -poky/34 1 -Pol -pol/213 1 -Poland/2 1 -Polanski/3 -Polaris/2 1 -polarity/15 1 -polarization/1 1 -polarize/6 1 -Polaroid/1 1 -polar 1 -pole/1 1 -Pole/1 1 -pole/6 1 -poleaxe/43 1 -polecat/1 1 -polemic/130 1 -polemical/8 1 -polemicist/1 1 -poles 1221 -polestar/1 1 -poleward -polewards -police/360 1 -policeman/2 1222 -policemen 1223 -policewoman/2 1224 -policewomen 1225 -policy/15 1 -policyholder/1 1 -policymaker/10 1 -poling 1 -polio/1 1 -poliomyelitis/2 1 -Polish/2 1 -polish/22 1 -polisher/1 1 -polishing/10 1 -Polish 1 -politburo/1 1 -Politburo 1 -polite/27 1 -politesse/2 1 -politic/456 1 -political/8 1 -politician/1 1 -politicization/2 1 -politicize/6 1 -politicking/2 1 -politico/1 1 -politic 1 -politics's -polity/15 1 -Polk/2 1 -polka/23 1 -poll/23 1 -pollack/1 1 -Pollard/3 -pollard/70 1 -pollen/18 1 -pollinate/6 1 -pollination/2 1 -pollinator/1 1 -polling/2 1 -polliwog/1 1 -pollock/1 1 -Pollock 1 -pollster/1 1 -pollutant/1 1 -pollute/6 1 -polluted 1 -polluter/1 1 -pollution/1 1 -Pollux/2 1 -polo/2 1 -Polo/2 1 -polonaise/1 1 -polonium/2 1 -Poltava/3 -poltergeist/1 1 -poltroon/1 1 -polyandrous -polyandry/2 1 -polyatomic -polycarbonate 1 -polychromatic -polychrome 1 -polyclinic/1 1 -polycrystalline -polycyclic -polyester/1 1 -polyethylene/2 1 -polygamist/1 1 -polygamous 1 -polygamy/2 1 -polyglot/1 1 -polygon/1 1 -polygonal 1 -polygraph/23 1 -polyhedral -polyhedron/1 1 -Polyhymnia/2 1 -Polly/3 -Pollyanna 1 -pollywog/1 1 -polymath/1 1 -polymer/1 1 -polymerase/10 1 -polymeric -polymerization/2 1 -polymerize/6 1 -polymorphic -polymorphism/10 1 -polymorphous -Polynesia/2 1 -Polynesian/1 1 -polynomial/1 1 -polynomially -polyp/1 1 -polypeptide/10 1 -Polyphemus -polyphonic 1 -polyphony/2 1 -polypropylene/2 1 -polysaccharides -polysemous -polystyrene/2 1 -polysyllabic 1 -polysyllable/1 1 -polytechnic/1 1 -polytheism/2 1 -polytheist/1 1 -polytheistic -polytheist 1 -polythene 1 -polytopes -poly 1 -polyunsaturate/10 1 -polyunsaturated -polyurethane/1 1 -polyvinyl 1 -pom/10 1 -pomade/28 1 -pomander/1 1 -pomegranate/1 1 -Pomerania -Pomeranian/2 1 -pommel/23 1 -pommy/60 1 -Pomona -pomp/2 1 -Pompadour -pompadour/62 1 -pompano/1 1 -Pompeian 1 -Pompeii/2 1 -Pompey/2 1 -pompom/1 1 -pompon/1 1 -pomposity/2 1 -pompous/16 1 -Ponce -ponce/43 1 -poncey -poncho/1 1 -poncy -pond/18 1 -ponder/11 1 -ponderer/1 1 -ponderous/16 1 -pone/1 1 -pong/11 1 -pongee/2 1 -poniard/18 1 -Pontchartrain -Pontiac/2 1 -Pontianak -pontiff/1 1 -pontifical/8 1 -pontificate/28 1 -pontification/10 1 -pontoon/18 1 -pony/56 1 -ponytail/1 1 -poo/444 1 -pooch/22 1 -poodle/1 1 -pooed -poof/1 1 -poofter/10 1 -Pooh/3 -pooh/23 1 -pooing -pool/23 1 -Poole/3 -pooling 1 -poolroom/1 1 -poolside/10 1 -Poona -poop/23 1 -poor/21 1 -poorboy/2 1 -poorhouse/1 1 -poos -pop/296 1 -popcorn/2 1 -pope/1 1 -Pope 1 -Popeye/3 -popgun/1 1 -popinjay/1 1 -poplar/1 1 -poplin/2 1 -Popocatepetl -popover/1 1 -poppa/1 1 -poppadom/10 1 -poppadum/10 1 -Popper/3 -popper/1 1 -poppet/10 1 -Poppins/3 -poppy/15 1 -poppycock/2 1 -Popsicle 1 -populace/1 1 -popular/8 1 -popularity/2 1 -popularization/1 1 -popularize/6 1 -popular 1 -populate/6 1 -population/1 1 -populism/2 1 -populist/1 1 -populous/33 1 -porcelain/1 1 -porch/4 1 -porcine 1 -porcupine/1 1 -pore/28 1 -Porfirio/3 -porgy/15 1 -pork/2 1 -porker/1 1 -porky/42 1 -porn/2 1 -porno/2 1 -pornographer/1 1 -pornographic -pornographically -pornography/2 1 -porosity/2 1 -porous/33 1 -porphyritic -porphyry/2 1 -porpoise/28 1 -porridge/2 1 -Porrima/3 -porringer/1 1 -Porsche/3 -Port -port/216 1 -portability/2 1 -portable/1 1 -portage/28 1 -portal/1 1 -portcullis/4 1 -portend/11 1 -portent/1 1 -portentous/83 1 -Porter -porter/18 1 -porterage 1 -porterhouse/1 1 -portfolio/1 1 -porthole/1 1 -Portia/3 -portico/4 1 -portiere/1 1 -portion/23 1 -Portland/2 1 -portly/140 1 -portmanteau/1 1 -Porto/3 -portrait/1 1 -portraitist/1 1 -portraiture/2 1 -portray/11 1 -portrayal/1 1 -Portsmouth -Portugal/2 1 -Portuguese/2 1 -portulaca/2 1 -pose/28 1 -Poseidon/2 1 -poser/1 1 -poseur/1 1 -posh/166 1 -posing 1 -posit/5 1 -position/23 1 -positionable -positional -positionally -positive/25 1 -positivism 1 -positivist/10 1 -positivity 1 -positron/1 1 -poss/89 1 -posse/1 1 -posses/79 1 -possess/7 1 -possession/1 1 -possessive/36 1 -possessor/1 1 -possibility/15 1 -possible/457 1 -possum/1 1 -Post/3 -post/78 1 -postage/2 1 -postal 1 -postbag/10 1 -postbox/89 1 -postcard/18 1 -postcode/10 1 -postconsonantal -postdate/6 1 -postdoctoral -postdoc 1 -poster/1 1 -posterior/1 1 -posterity/2 1 -postfixes -postgraduate/1 1 -posthaste 1 -posthumous/8 1 -posthypnotic 1 -postie/10 1 -postilion/1 1 -postillion/1 1 -postindustrial -posting/1 1 -postlude/1 1 -postman/2 1226 -postmark/23 1 -postmaster/1 1 -postmenopausal -postmen 1227 -postmeridian -postmistress/4 1 -postmodern -postmodernism/2 1 -postmodernist/1 1 -postmortem/1 1 -postnasal -postnatal -postoperative 1 -postpaid 1 -postpartum -postpone/6 1 -postponement/1 1 -postprandial 1 -postscript/1 1 -postseason/1 1 -postulate/28 1 -postulation/1 1 -postural -posture/28 1 -posturing/1 1 -postwar 1 -postwoman 1228 -postwomen 1229 -posy/15 1 -pot/109 1 -potability/2 1 -potable/1 1 -potash/2 1 -potassium/2 1 -potato/4 1 -potbellied -potbellies -potbelly/3 -potboiler/1 1 -Potemkin -potency/2 1 -potent/8 1 -potentate/1 1 -potential/30 1 -potentiality/15 1 -potentiometer/10 1 -potent 1 -potful/1 1 -pothead/1 1 -pother/23 1 -potherb/1 1 -potholder/1 1 -pothole/28 1 -potholer/10 1 -pothook/1 1 -potion/1 1 -potluck/1 1 -Potomac/2 1 -potpie/1 1 -potpourri/1 1 -Potsdam -potsherd/1 1 -potshot/1 1 -pottage/2 1 -Pottawatomie/3 -Potter -potter/23 1 -pottering 1 -pottery/15 1 -pottiness -Potts/3 -potty/42 1 -pouch/22 1 -pouf/10 1 -pouffe/10 1 -poulterer/1 1 -poultice/28 1 -poultry/2 1 -pounce/28 1 -Pound -pound/23 1 -poundage/2 1 -pounding/1 1 -pour/5 1 -pourable -pouring/10 1 -Poussin -pout/23 1 -pouter/1 1 -pouting 1 -poverty/2 1 -POW/2 1 -powder/23 1 -powdery 1 -Powell/3 -power/23 1 -powerboat/1 1 -powerful/83 1 -powerhouse/1 1 -powerless/16 1 -PowerPoint/3 -Powers -power 1 -Powhatan/2 1 -pow 1 -powwow/23 1 -pox/40 1 -poxy -Poznan/3 -pp -PP -ppm -ppr -PPS -pr -PR -Pr/4 1 -practicability/15 1 -practicable/19 1 -practical/30 1 -practicality/15 1 -practice/28 1 -practicum/1 1 -practise's -practitioner/1 1 -Prada/3 -Prado/3 -praesidium/10 1 -praetor/1 1 -praetorian 1 -Praetorian 1 -pragmatic/1 1 -pragmatical/8 1 -pragmatism/2 1 -pragmatist/1 1 -Prague/2 1 -Praia/2 1 -prairie/1 1 -praise/28 1 -praiseworthy/140 1 -praising 1 -Prakrit -praline/1 1 -pram/1 1 -prance/28 1 -prancer/1 1 -prancingly 1 -prancing 1 -prang/11 1 -prank/18 1 -prankster/1 1 -praseodymium/2 1 -prat/70 1 -Pratchett/3 -prate/28 1 -prater/1 1 -pratfall/1 1 -prating 1 -Pratt/3 -prattle/28 1 -prattler/1 1 -prattling 1 -Pravda/3 -prawn/23 1 -Praxiteles -pray/11 1 -prayer/1 1 -prayerbook -prayerful/8 1 -praying 1 -PRC/2 1 -preach/7 1 -preacher/1 1 -preaching/10 1 -preachment/2 1 -preachy/34 1 -preadolescence/1 1 -Preakness/3 -preallocate -preamble/28 1 -preamplifier 1 -preamp 1 -prearrange/6 1 -prearrangement/2 1 -preassigned -preauthorize -prebendary 1 -Precambrian/2 1 -precancel/23 1 -precancerous -precarious/16 1 -precast 1 -precaution/18 1 -precautionary -precede/6 1 -precedence/1 1 -precedent/1 1 -precept/1 1 -preceptor/1 1 -precess/241 1 -precession 1 -precinct/1 1 -preciosity/2 1 -precious/16 1 -precipice/1 1 -precipitant/1 1 -precipitate/54 1 -precipitation/1 1 -precipitous/8 1 -precis/22 1 -precise/104 1 -precision/1 1 -precis 1 -preclinical -preclude/6 1 -preclusion/2 1 -precocious/16 1 -precocity/2 1 -precognition/1 1 -precognitive -precolonial -precomputed -preconceive/6 1 -preconception/1 1 -precondition/23 1 -precook/11 1 -precursor/1 1 -precursory -predate/6 1 -predation/10 1 -predator/1 1 -predatory -predawn 1 -predecease/43 1 -predecessor/1 1 -predeclared -predefine/251 1 -predesignate/6 1 -predestination/2 1 -predestine/6 1 -predetermination/2 1 -predetermine/6 1 -predeterminer/1 1 -predicable 1 -predicament/1 1 -predicate/28 1 -predication/2 1 -predicative/8 1 -predict/11 1 -predictability/2 1 -predictable/19 1 -prediction/1 1 -predictive 1 -predictor/1 1 -predigest/11 1 -predilection/1 1 -predispose/6 1 -predisposed 1 -predisposition/1 1 -predominance/2 1 -predominant/8 1 -predominate/68 1 -preemie/1 1 -preeminence/2 1 -preeminent/8 1 -preempt/5 1 -preemption/2 1 -preemptively -preemptive 1 -preen/5 1 -preexist/11 1 -preexistence/2 1 -pref -prefab/136 1 -prefabricate/6 1 -prefabrication/2 1 -prefab 1 -preface/28 1 -prefatory -prefect/1 1 -prefecture/1 1 -prefer/13 1 -preferable/19 1 -preference/1 1 -preferential/8 1 -preferment/2 1 -preferred 1 -prefigure/6 1 -prefix/22 1 -preform/5 1 -pregame/3 -pregames -pregnancy/15 1 -pregnant 1 -preheat/11 1 -prehensile -prehistoric -prehistorical/8 1 -prehistory/2 1 -prejudge/6 1 -prejudgment/1 1 -prejudice/28 1 -prejudiced 1 -prejudicial -prekindergarten/1 1 -prelacy/2 1 -prelate/1 1 -prelates 1 -prelim/1 1 -preliminary/206 1 -preliterate 1 -preloaded -prelude/18 1 -premarital -premature/83 1 -prematurity 1 -premed/1 1 -premedical -premeditate/6 1 -premeditated 1 -premeditation/2 1 -premed 1 -premenstrual -premier/23 1 -premiere/28 1 -premiership/1 1 -premier 1 -Preminger/3 -premise/28 1 -premiss/40 1 -premium/1 1 -premix/156 1 -premolar/1 1 -premonition/1 1 -premonitory -Premyslid/3 -prenatal/8 1 -Prensa/3 -Prentice/3 -prenuptial -preoccupation/1 1 -preoccupied 1 -preoccupy/31 1 -preoperative -preordain/11 1 -prep/47 1 -prepackage/6 1 -prepacked -preparation/1 1 -preparative 1 -preparatory 1 -prepare/6 1 -prepared/33 1 -preparer/10 1 -prepay/312 1 -prepayment/1 1 -preplanned -preponderance/1 1 -preponderant/8 1 -preponderate/6 1 -preposition/18 1 -prepositional/8 1 -prepossess/7 1 -prepossessing 1 -prepossession/1 1 -preposterous/8 1 -preppie/41 1 -preppy/42 1 -preprocessed -prep 1 -prepubescence/2 1 -prepubescent/1 1 -prepuce/1 1 -prequel/1 1 -prerecord/11 1 -preregister/11 1 -preregistration/2 1 -prerequisite/1 1 -prerogative/1 1 -pres/79 1 -presage/28 1 -presbyopia/2 1 -presbyter/1 1 -Presbyterian/1 1 -Presbyterianism/1 1 -presbytery/15 1 -preschool/129 1 -preschooler/1 1 -prescience/2 1 -prescient/8 1 -Prescott/3 -prescribe/6 1 -prescript/1 1 -prescription/1 1 -prescriptive/8 1 -prescriptivism -prescriptivist 1 -prescript 1 -preseason/1 1 -preselect/458 1 -presence/1 1 -present/459 1 -presentable/19 1 -presentation/1 1 -presentational -presenter/1 1 -presentiment/1 1 -presentment/1 1 -preservable -preservation/2 1 -preservationist/1 1 -preservative/1 1 -preserve/28 1 -preserver/1 1 -preset/88 1 -preshrank 1230 -preshrink/121 1231 -preshrunk 1230 -preside/6 1 -presidency/15 1 -president/1 1 -President/1 1 -presidential 1 -presidia 1232 -presidium/2 1233 -Presley -presort/11 1 -press/22 1 -presser/1 1 -pressie/10 1 -pressing/30 1 -pressman/2 1234 -pressmen 1235 -pressure/28 1 -pressurization/2 1 -pressurize/6 1 -pressurizer/1 1 -prestidigitation/2 1 -prestidigitatorial -prestidigitator 1 -prestige/2 1 -prestigious 1 -presto/1 1 -Preston -presto 1 -presumable/19 1 -presume/6 1 -presumed 1 -presumption/1 1 -presumptive/8 1 -presumptuous/16 1 -presuppose/6 1 -presupposition/1 1 -pretax 1 -preteen/1 1 -pretend/233 1 -pretended 1 -pretender/1 1 -pretense/1 1 -pretension/18 1 -pretentious/16 1 -preterit/1 1 -preterite/1 1 -preterit 1 -preterm 1 -preternatural/8 1 -pretest/11 1 -pretext/18 1 -Pretoria/2 1 -pretreated -pretreatment/10 1 -pretrial/10 1 -prettify/31 1 -pretzel/1 1 -pretty/275 1 -prevail/11 1 -prevailing 1 -prevalence/2 1 -prevalent/8 1 -prevaricate/6 1 -prevarication/1 1 -prevaricator/1 1 -prevent/11 1 -preventable -preventative/1 1 -preventible -prevention/1 1 -preventive/1 1 -preview/23 1 -previewer/10 1 -previous/8 1 -prevision/18 1 -prevue/18 1 -prewar 1 -prey/23 1236 -prezzie/10 1 -Priam/2 1 -priapic 1 -Pribilof/3 -Price -price/28 1 -priceless 1 -prices 1237 -pricey 1238 -pricier 1239 -priciest 1239 -prick/23 1 -pricker/1 1 -pricking 1 -prickle/28 1 -prickliness/3 -prickling 1 -prickly/34 1 -pricy/34 1 -pride/28 1 -prideful/8 1 -prier/1 1240 -priest/18 1 -priestess/4 1 -priesthood/1 1 -Priestley -priestly/49 1 -priest 1241 -prig/18 1 -priggish/16 1 -prim/324 1 -primacy/2 1 -primaeval -primal 1 -primary/206 1 -primate/1 1 -prime/460 1 -primer/1 1 -primeval 1 -priming/2 1 -primitive/36 1 -primogenitor/1 1 -primogeniture/2 1 -primordial/8 1 -primp/11 1 -primrose/18 1 -prim 1 -primula/10 1 -Prince/3 -prince/1 1 -princedom/1 1 -princely/49 1 -princes/9 1 -princess/4 1 -Princeton/2 1 -Principal -principal/30 1 -principality/15 1 -Principe/2 1 -principle/77 1 -print/78 1 -printable 1 -printer/1 1 -printing/1 1 -printmaking 1 -printout/1 1 -prion/10 1 -prior/1 1 -prioress/4 1 -prioritization 1 -prioritize/6 1 -priority/15 1 -prior 1 -priory/15 1 -Priscilla/3 -prism/1 1 -prismatic 1 -prison/18 1 -prisoner/1 1 -prissy/50 1 -pristine 1 -prithee 1 -Prius/3 -privacy/2 1 -Private -private/255 1 -privateer/18 1 -privation/1 1 -privatization/1 1 -privatize/6 1 -privet/1 1 -privilege/28 1 -privy/461 1 -prize/28 1 -prizefight/86 1 -prizefighter/1 1 -prizefighting/2 1 -prize 1 -prizewinner/1 1 -prizewinning -PRO -pro/1 1 -proactively -proactive 1 -prob -probabilistic/39 1 -probabilist 1 -probability/15 1 -probable/82 1 -probate/28 1 -probation/2 1 -probational -probationary 1 -probationer/1 1 -probative 1 -probe/28 1 -probings -probity/2 1 -problem/1 1 -problematical/8 1 -problematic 1 -problem 1 -probosces -proboscis/4 1 -procaine/2 1 -procedural 1 -procedurally -procedure/1 1 -proceed/11 1 -proceeding/1 1 -proceeds's -process/22 1 -processable -procession/23 1 -processional/1 1 -processioning 1 -processor/1 1 -proclaim/11 1 -proclaimers -proclamation/1 1 -proclivity/15 1 -proconsul/1 1 -proconsular 1 -procrastinate/6 1 -procrastination/1 1 -procrastinator/1 1 -procreate/6 1 -procreation/2 1 -procreational -procreative 1 -procreatory -Procrustean -Procrustes/2 1 -Procter/3 -proctor/23 1 -proctorial -procurable -procurator/1 1 -procure/6 1 -procurement/1 1 -procurer/1 1 -procures 1 -Procyon/2 1 -prod/113 1 -prodigal/30 1 -prodigality/2 1 -prodigious/8 1 -prodigy/15 1 -produce/28 1 -producer/1 1 -producible -product/1 1 -production/1 1 -productive/16 1 -productivity/2 1 -Prof -prof/123 1 -profanation/1 1 -profane/67 1 -profanity/15 1 -profess/7 1 -professed/8 1 -profession/1 1 -professional/30 1 -professionalism/2 1 -professionalization 1 -professionalize/6 1 -professor/1 1 -professorial/8 1 -professorship/1 1 -proffer/23 1 -proficiency/15 1 -proficient/30 1 -profile/28 1 -profit/23 1 -profitability/2 1 -profitable/19 1 -profiteer/23 1 -profiteering/2 1 -profiterole/1 1 -profiting 1 -profitless 1 -profligacy/2 1 -profligate/30 1 -proforma -proformas -profound/21 1 -profundity/15 1 -profuse/16 1 -profusion/1 1 -progenitor/1 1 -progeny/2 1 -progesterone/2 1 -prognathous -prognoses 1242 -prognosis/2 1243 -prognostic/1 1 -prognosticate/6 1 -prognostication/1 1 -prognosticator/1 1 -prognostic 1 -program/462 1 -programer/1 1 -programing 1 -programmable/1 1 -programmatic -programmer/1 1 -programming/1 1 -progress/22 1 -progression/1 1 -progressive/36 1 -prohibit/11 1 -prohibition/1 1 -prohibitionist/1 1 -Prohibition 1 -prohibitive/8 1 -prohibitory 1 -project/23 1 -projectile/1 1 -projecting 1 -projection/1 1 -projectionist/1 1 -projective/8 1 -projector/1 1 -Prokofiev -prolapse/28 1 -prole/10 1 -proletarian/1 1 -proletariat/2 1 -proliferate/6 1 -proliferation/2 1 -prolific -prolifically -prolix/8 1 -prolixity/2 1 -prolog/18 1 -prologize 1 -prologue/18 1 -prologuize 1 -prolong/11 1 -prolongation/1 1 -prom/1 1 -promenade/28 1 -promenader/10 1 -Promethean 1 -Prometheus/2 1 -promethium/2 1 -prominence/1 1 -prominent/8 1 -promiscuity/2 1 -promiscuous/8 1 -promise/28 1 -promising/8 1 -promissory 1 -promo/1 1 -promontory/15 1 -promotable -promote/6 1 -promoter/1 1 -promotion/1 1 -promotional -prompt/52 1 -prompter/1 1 -prompting/1 1 -promptitude/2 1 -promulgate/6 1 -promulgation/1 1 -promulgator/1 1 -pron -prone/33 1 -prong/62 1 -pronghorn/1 1 -pronominal/2 1 -pronoun/1 1 -pronounce/6 1 -pronounceable 1 -pronounced/8 1 -pronouncement/1 1 -pronto 1 -pronuclear -pronunciation/1 1 -proof/23 1 -proofing 1 -proofread/121 1 -proofreader/1 1 -proof 1 -prop/47 1 -propaganda/2 1 -propagandist/1 1 -propagandize/6 1 -propagate/6 1 -propagation/2 1 -propagator/1 1 -propane/2 1 -propel/61 1 -propellant/1 1 -propellent/1 1 -propeller/1 1 -propelling 1 -propensity/15 1 -proper/225 1 -propertied -property/15 1 -prophecy/15 1 -prophesier/1 1 -prophesy/31 1 -prophesy's -prophet/1 1 -prophetess/4 1 -prophetic -prophetical/8 1 -Prophets -prophylactic/1 1 -prophylaxes 1244 -prophylaxis/2 1245 -propinquity/2 1 -propitiate/6 1 -propitiation/2 1 -propitiatory 1 -propitious/8 1 -proponent/1 1 -proportion/23 1 -proportional/191 1 -proportionality 1 -proportionate/8 1 -proportioning 1 -proposal/1 1 -propose/6 1 -proposer/1 1 -proposition/23 1 -propositional 1 -propound/11 1 -proprietary/15 1 -proprietor/1 1 -proprietorial/8 1 -proprietorship/2 1 -proprietress/4 1 -propriety/344 1 -proprioceptive -propulsion/2 1 -propulsive -propylene 1 -prorate/6 1 -prorogation/2 1 -prorogue/6 1 -pros/205 1 -prosaic/39 1 -proscenium/1 1 -prosciutto/2 1 -proscribe/6 1 -proscription/1 1 -proscriptive -prose/18 1 -prosecutable -prosecute/6 1 -prosecution/1 1 -prosecutor/1 1 -proselyte/28 1 -proselytism/2 1 -proselytize/6 1 -proselytizer/1 1 -Proserpina/2 1 -Proserpine/2 1 -prose 1 -prosodic -prosody/15 1 -prospect/23 1 -prospectively -prospective 1 -prospector/1 1 -prospectus/4 1 -prosper/11 1 -prosperity/2 1 -prosperous/8 1 -prostate/1 1 -prostheses 1246 -prosthesis/2 1247 -prosthetic 1 -prostitute/28 1 -prostitution/2 1 -prostrate/6 1 -prostration/1 1 -prosy/34 1 -protactinium/2 1 -protagonist/1 1 -Protagoras -protean 1 -protease 1 -protect/11 1 -protecting 1 -protection/1 1 -protectionism/2 1 -protectionist/1 1 -protective/16 1 -protector/1 1 -protectorate/1 1 -protege/1 1 -protegee/10 1 -protein/1 1 -Proterozoic/2 1 -protest/23 1 -Protestant/1 1 -protestant/10 1 -protestantism -Protestantism/1 1 -protestation/1 1 -protester/1 1 -protesting 1 -protestor/1 1 -Proteus/2 1 -protists -protocol/18 1 -proton/1 1 -protoplasm/2 1 -protoplasmic -prototype/28 1 -prototypical 1 -protozoan/463 1 -protozoa 1248 -protozoic -protozoon/2 1249 -protract/11 1 -protracted 1 -protraction/2 1 -protractor/1 1 -protrude/6 1 -protrusile -protrusion/1 1 -protrusive -pro 1 -protuberance/1 1 -protuberant 1 -proud/75 1 -Proudhon -Proust/2 1 -prov -provability/2 1 -provable/19 1 -prove/376 1 -provenance/1 1 -Provencal/1 1 -Provence/2 1 -provender/2 1 -provenience/2 1 -proven 1 -prover/10 1 -proverb/18 1 -proverbial/8 1 -Proverbs -providable -provide/6 1 -Providence/1 1 -providence/2 1 -provident/8 1 -providential/8 1 -provider/1 1 -province/1 1 -provincial/30 1 -provincialism/2 1 -provision/23 1 -provisional/8 1 -proviso/1 1 -provocateur/10 1 -provocation/1 1 -provocative/16 1 -provoke/6 1 -provoker/1 1 -provoking/8 1 -provolone/2 1 -provost/1 1 -Provo 1 -prow/1 1 -prowess/2 1 -prowl/23 1 -prowler/1 1 -prowling 1 -prow 1 -proximal 1 -proximate/8 1 -proximity/2 1 -proxy/15 1 -Prozac/1 1 -prude/1 1 -Prudence/3 -prudence/2 1 -prudent/8 1 -Prudential/3 -prudential 1 -prudentially -prudery/2 1 -prudish/16 1 -Pruitt/3 -prune/28 1 -pruner/1 1 -pruning 1 -prurience/2 1 -prurient/8 1 -Prussia/2 1 -Prussian/1 1 -prussic -Prut -pry/87 1 -pryer/1 1 -prying 1 -Pryor/3 -PS/2 1 -psalm/18 1 -psalmist/1 1 -Psalms -Psalter/1 1 -psalter 1 -psaltery/15 1 -psephologist/10 1 -psephology 1 -pseud/10 1 -pseudo/10 1 -pseudonym/1 1 -pseudonymous 1 -pseudopodia 1250 -pseudopod 1 -pseudoscience/1 1 -pseudo 1 -pseudy -pshaw/18 1 -psi/1 1 -psittacosis/2 1 -psoriasis/2 1 -psst 1 -PST/2 1 -psych/464 1 -psyche/1 1 -Psyche/2 1 -psyche/6 1 -psychedelia 1 -psychedelic/1 1 -psychedelically -psychiatric 1 -psychiatrist/1 1 -psychiatry/2 1 -psychic/1 1 -psychical/8 1 -psychic 1 -psycho/1 1 -psychoactive 1 -psychoanalysis/2 1 -psychoanalyst/1 1 -psychoanalytic -psychoanalytical/8 1 -psychoanalyze/6 1 -psychobabble/2 1 -psychodrama/1 1 -psychogenic -psychokinesis 1 -psychokinetic -psycholinguistic/10 1 -psycholinguists -psychological/8 1 -psychologist/1 1 -psychology/15 1 -psychometric 1 -psychoneuroses 1251 -psychoneurosis/2 1252 -psychopath/1 1 -psychopathic 1 -psychopathology 1 -psychopathy/2 1 -psychos/89 1 -psychoses 1253 -psychosis/2 1254 -psychosocial -psychosomatic 1 -psychotherapist/1 1 -psychotherapy/15 1 -psychotic/1 1 -psychotically -psychotic 1 -psychotropic/1 1 -psycho 1 -psych's -pt -PT -Pt/2 1 -PTA -Ptah/2 1 -ptarmigan/1 1 -pterodactyl/1 1 -pterosaurs -PTO -Ptolemaic -Ptolemy/15 1 -ptomaine/1 1 -Pu/2 1 -pub/18 1 -pubertal -puberty/2 1 -pubes/2 1 -pubescence/2 1 -pubescent -pubes's 1255 -pubes 1256 -pubic 1 -pubis/2 1257 -public/37 1 -publican/1 1 -publication/1 1 -publicist/1 1 -publicity/2 1 -publicize/6 1 -publish/7 1 -publishable -publisher/1 1 -publishing/2 1 -Puccini -puce/2 1 -Puck -puck/18 1 -pucker/23 1 -Puckett/3 -puckish/16 1 -pud/10 1 -pudding/1 1 -puddle/28 1 -puddling/2 1 -pudenda 1258 -pudendum/2 1259 -pudgy/49 1 -Puebla -pueblo/1 1 -Pueblo 1 -puerile 1 -puerility/2 1 -puerperal -puff/78 1 -puffball/1 1 -puffer/1 1 -puffin/1 1 -puffing 1 -puffy/49 1 -pug/18 1 -Puget/3 -Pugh/3 -pugilism/2 1 -pugilist/1 1 -pugilistic -pugnacious/16 1 -pugnacity/2 1 -puissant 1 -puke/28 1 -pukka 1 -Pulaski 1 -pulchritude/2 1 -pulchritudinous -pule/6 1 -pules 1260 -puling 1 -Pulitzer 1 -pull/23 1 -pullback/1 1 -puller/1 1 -pullet/1 1 -pulley/1 1 -pulling 1 -Pullman/1 1 -pullout/1 1 -pullover/1 1 -pullup/1 1 -pulmonary -pulp/23 1 -pulpiness/3 -pulpit/1 1 -pulp 1 -pulpwood/2 1 -pulpy/34 1 -pulsar/1 1 -pulsate/6 1 -pulsation/1 1 -pulse/28 1 -pulverization/2 1 -pulverize/6 1 -puma/1 1 -pumice/18 1 -pummel/11 1 -pump/23 1 -pumper/1 1 -pumpernickel/2 1 -pumpkin/1 1 -pun/133 1 -Punch -punch/22 1 -punchable -punchbag/10 1 -punchbowl -puncheon/1 1 -puncher/1 1 -punchline -punchlines -punchy/34 1 -punctilio/2 1 -punctilious/16 1 -punctual/8 1 -punctuality/2 1 -punctuate/6 1 -punctuation/1 1 -punctuational -puncture/28 1 -pundit/1 1 -punditry/2 1 -pungency/2 1 -pungent/8 1 -Punic/2 1 -punish/7 1 -punishable -punishing/8 1 -punishment/1 1 -punitive/8 1 -Punjab/2 1 -Punjabi/2 1 -punk/188 1 -punker 1 -punkin/1 1 -punnet/10 1 -punning 1 -punster/1 1 -punt/23 1 -punter/1 1 -puny/49 1 -pup/47 1 -pupa/53 1 -pupal 1 -pupate/6 1 -pupil/1 1 -pupillage 1 -puppet/1 1 -puppeteer/1 1 -puppetry/2 1 -puppet 1 -puppy/167 1 -Purana 1 -purblind 1 -Purcell -purchasable -purchase/28 1 -purchaser/1 1 -purdah/2 1 -Purdue/3 -pure/465 1 -purebred/1 1 -puree/63 1 -purgative/1 1 -purgatorial -Purgatory -purgatory/15 1 -purge/28 1 -purger/1 1 -purging 1 -purification/2 1 -purifier/1 1 -purify/31 1 -Purim/1 1 -Purina/3 -purine/1 1 -purism/2 1 -purist/1 1 -puristic -puritan/1 1 -puritanical/8 1 -Puritanism/1 1 -puritanism/2 1 -Puritan 1 -purity/15 1 -purl/23 1 -purlieu/1 1 -purling 1 -purloin/11 1 -purple/466 1 -purplish 1 -purport/23 1 -purported/8 1 -purpose/28 1 -purposeful/16 1 -purposeless/83 1 -purposely -purposive 1 -purr/23 1 -purring 1 -purse/28 1 -purser/1 1 -pursuance/2 1 -pursuant 1 -pursue/6 1 -pursuer/1 1 -pursuing 1 -pursuit/1 1 -purulence/2 1 -purulent 1 -Purus/2 1 -purvey/11 1 -purveyance/2 1 -purveyor/1 1 -purview/2 1 -pus/228 1261 -Pusan/2 1 -Pusey -push/22 1 -pushable -pushbike -pushbikes -pushcart/1 1 -pushchair/10 1 -pusher/1 1 -pushily 1 -pushing 1 -Pushkin -pushover/1 1 -pushpin/10 1 -Pushtu/3 -pushup/1 1 -pushy/49 1 -pusillanimity/2 1 -pusillanimous/8 1 -puss/4 1 -pussy/42 1 -pussycat/1 1 -pussyfoot/5 1 -pustular -pustule/1 1 -put/128 1 -putative/8 1 -putdown/1 1 -Putin/3 -Putnam -putout/1 1 -putrefaction/2 1 -putrefactive -putrefy/31 1 -putrescence/2 1 -putrescent -putridity 1 -putrid 1 -putsch/4 1 -putt/23 1 -puttee/1 1 -putter/23 1 -putterer/1 1 -putting 1 -putz/205 1 -putty/56 1 -puttying 1262 -Puzo/3 -puzzle/28 1 -puzzled 1 -puzzlement/2 1 -puzzler/1 1 -puzzling/8 1 -PVC/2 1 -pvt -Pvt -PW -PX -Pygmalion/2 1 -pygmy/15 1 -Pygmy/15 1 -pygmy 1 -Pyle/3 -pylon/1 1 -pyloric 1 -pylori 1263 -pylorus/2 1264 -Pym -Pynchon/3 -Pyongyang/2 1 -pyorrhea/2 1 -Pyotr/3 -pyramid/23 1 -pyramidal 1 -pyre/1 1 -Pyrenees/2 1 -Pyrex/4 1 -pyridine 1 -pyrimidine/1 1 -pyrite/130 1 -pyrolysis 1 -pyrolyze 1 -pyromania/2 1 -pyromaniac/1 1 -pyrotechnic/32 1 -pyrotechnical 1 -pyroxene/10 1 -Pyrrhic -Pythagoras/2 1 -Pythagorean 1 -Pythias -python/1 1 -Python/2 1 -pyx/40 1 -pyxes 1265 -pzazz -q -Q -Qaddafi/3 -Qantas/3 -Qatar/2 1 -Qatari/1 1 -QB -QC -QED -Qingdao -Qiqihar/3 -QM -Qom/3 -qr -qt -qty -Quaalude/2 1 -quack/23 1 -quackery/2 1 -quackish -quack 1 -quad/18 1 -quadrangle/1 1 -quadrangular -quadrant/1 1 -quadraphonic 1 -quadratic/51 1 -quadrature/10 1 -quadrennial 1 -quadrennium/1 1 -quadriceps/4 1 -quadrilateral/1 1 -quadrille/18 1 -quadrillion/1 1 -quadripartite 1 -quadriplegia/2 1 -quadriplegic/1 1 -quadrivium/2 1 -quadrophonic 1 -quadruped/1 1 -quadrupedal -quadruple/467 1 -quadruplet/1 1 -quadruplicate/28 1 -quadruplication/2 1 -quadrupole 1 -quad 1 -quaff/23 1 -quagmire/18 1 -quahaug/1 1 -quahog/1 1 -quail/23 1 -quailing 1 -quaint/21 1 -quake/28 1 -Quaker/1 1 -Quakerism/1 1 -Quaker 1 -quaking 1 -quaky/34 1 -qualification/1 1 -qualified 1 -qualifier/1 1 -qualify/31 1 -qualifying 1 -qualitative/8 1 -quality/15 1 -qualm/1 1 -qualmish 1 -quandary/15 1 -quango/10 1 -quanta 1266 -quantifiable -quantification/2 1 -quantifier/1 1 -quantify/31 1 -quantitative/8 1 -quantity/15 1 -quantization 1 -quantize/214 1 -quantum/2 1267 -Quaoar/3 -quarantine/28 1 -quark/1 1 -quarrel/23 1 -quarreler/1 1 -quarrelsome/33 1 -quarry/56 1 -quarrying 1 -quarrymen 1268 -quart/1 1 -quarter/210 1 -quarterback/23 1 -quarterdeck/1 1 -quarterfinal/1 1 -quartering 1 -quarterlies -quarterly's -quartermaster/1 1 -quarterstaff/2 1269 -quarterstaves 1270 -quartet/1 1 -quartette/1 1 -quartic/10 1 -quartile/10 1 -quarto/1 1 -quartz/2 1 -quartzite 1 -quasar/1 1 -quash/7 1 -quasilinear -Quasimodo 1 -quasi 1 -Quaternary/2 1 -quaternary 1 -quaternion/10 1 -quatrain/1 1 -qua 1 -quaver/23 1 -quavering 1 -quavery 1 -quay/1 1 -Quayle/3 -quayside/10 1 -Que -queasy/50 1 -Quebec/2 1 -Quebecker 1 -Quebecois -Quechua/2 1 -Queen -queen/23 1 -queening 1 -queenly/34 1 -Queens/2 1 -Queensland/2 1 -queer/52 1 -quell/11 1 -quench/7 1 -quenchable 1 -quencher/1 1 -quenching 1 -quenchless 1 -Quentin/3 -quern 1 -querulous/16 1 -query/56 1 -querying 1 -ques/89 1 -quest/23 1 -questing 1 -question/23 1 -questionable/19 1 -questioner/1 1 -questioning/30 1 -questionnaire/1 1 -Quetzalcoatl/2 1 -queue/28 1 -queuing 1 -Quezon/3 -quibble/28 1 -quibbler/1 1 -quibbling 1 -quiche/1 1 -quick/410 1 -quicken/11 1 -quickening 1 -quickfire -quickie/1 1 -quicklime/2 1 -quicksand/1 1 -quicksilver/2 1 -quickstep/18 1 -quid/1 1 -quiesce/214 1 -quiescence/2 1 -quiescent/8 1 -quiet/52 1 -quieten/11 1 -quietening 1 -quieter 1 -quieting 1 -quietism 1 -quietude/2 1 -quietus/4 1 -quiff/10 1 -quill/18 1 -quilt/23 1 -quilter/1 1 -quilting/2 1 -quin/10 1 -quince/1 1 -quincentenary 1 -Quincy/3 -quine/10 1 -quinine/2 1 -Quinn -quinquennial 1 -quinsy/2 1 -quint/1 1 -quintessence/1 1 -quintessential/8 1 -quintet/1 1 -quintette/1 1 -quintic 1 -Quintilian/3 -quintillion 1 -Quinton/3 -quintuple/28 1 -quintuplet/1 1 -quintuple 1 -quip/47 1 -quipper 1 -quipster/1 1 -quire/18 1 -Quirinal 1 -quirk/23 1 -quirky/49 1 -quirt/18 1 -Quisling/3 -quisling/1 1 -quit/88 1 -quitclaim/18 1 -quite 1 -Quito/2 1 -quittance/2 1 -quitter/1 1 -quiver/23 1 -quivering/8 1 -quivery 1 -Quixote 1 -quixotic/39 1 -Quixotism/3 -quiz/306 1 -quizzer/1 1 -quizzical/8 1 -quizzing 1 -Qumran -quoin/18 1 -quoit/23 1 -quondam 1 -Quonset 1 -quorate -quorum/1 1 -quot -quota/1 1 -quotability/2 1 -quotable 1 -quota's 1271 -quota 1272 -quotation/1 1 -quote/28 1 -quoter 1 -quoth 1 -quotidian 1 -quotient/1 1 -Qur'an -QWERTY -qwerty 1 -R/2 1 -r/10 1 -Ra/468 1 -Rabat/2 1 -rabbet/23 1 -rabbi/1 1 -rabbinate/2 1 -rabbinic -rabbinical -rabbit/23 1 -rabble/18 1 -Rabelais/2 1 -Rabelaisian -rabid/16 1 -rabies/2 1 -Rabin/3 -raccoon/1 1 -race/139 1 -racecourse/1 1 -racegoer/10 1 -racehorse/1 1 -raceme/1 1 -racer/1 1 -racetrack/1 1 -raceway/1 1 -Rachael/3 -Rachel/3 -Rachelle/3 -Rachmaninoff -racial/8 1 -racialism/2 1 -racialist/1 1 -Racine/2 1 -racing/2 1 -racism/2 1 -racist/1 1 -rack/23 1 -racket/23 1 -racketeer/23 1 -racketeering/2 1 -racking 1 -raconteur/1 1 -racoons -racoon's -racquet/18 1 -racquetball/1 1 -racy/50 1 -rad/469 1 -radar/1 1 -radarscope/1 1 -Radcliffe/3 -raddled -radial/30 1 -radian/10 1 -radiance/2 1 -radiant/8 1 -radiate/6 1 -radiation/1 1 -radiative -radiatively -radiator/1 1 -radical/30 1 -radicalism/2 1 -radicalization/2 1 -radicalize/6 1 -radicchio/2 1 -radii 1273 -radio/417 1 -radioactive/8 1 -radioactivity/2 1 -radioastronomical -radiocarbon/2 1 -radiogalaxies -radiogalaxy -radiogram/1 1 -radiographer/1 1 -radiography/2 1 -radioisotope/1 1 -radiological 1 -radiologist/1 1 -radiology/2 1 -radioman/2 1274 -radiomen 1275 -radiometer/1 1 -radiometric -radiometry/2 1 -radionuclide 1 -radiophone/1 1 -radioscopy/2 1 -radiosonde/1 1 -radiotelegraph/18 1 -radiotelegraphy/2 1 -radiotelephone/18 1 -radiotherapist/1 1 -radiotherapy/2 1 -radio 1 -radish/4 1 -radium/2 1 -radius/2 1276 -radix 1 -radon/2 1 -RAF/2 1 -Rafael/3 -raffia/2 1 -raffish/16 1 -raffle/28 1 -Raffles/3 -raffling 1 -raft/23 1 -rafter/18 1 -rafting/2 1 -rag/92 1 -raga/1 1 -ragamuffin/1 1 -ragbag/2 1 -rage/28 1 -rages 1277 -ragga -ragged/21 1 -raggedy/34 1 -ragging 1 -ragingly 1 -raglan/1 1 -Ragnarok/2 1 -ragout/18 1 -ragtag/10 1 -ragtime/2 1 -ragweed/2 1 -ragwort 1 -rah 1 -raid/23 1 -raider/1 1 -rail/23 1 -railcard/10 1 -railing/1 1 -raillery/15 1 -railroad/23 1 -railroader/1 1 -railroading/2 1 -railway/1 1 -railwayman 1278 -railwaymen 1279 -raiment/2 1 -rain/23 1 -rainbow/1 1 -raincloud -rainclouds -raincoat/1 1 -raindrop/1 1 -rainfall/1 1 -rainforest/10 1 -Rainier -rainless 1 -rainmaker/1 1 -rainmaking/2 1 -rainproof 1 -rainstorm/1 1 -rainswept -rainwater/2 1 -rainy/34 1 -raise/28 1 -raiser/1 1 -raisin/1 1 -raising 1 -raja/1 1 -rajah/1 1 -raj 1 -rake/28 1 -rakes 1280 -raking 1 -rakish/16 1 -Raleigh/2 1 -Ralph/3 -rally/56 1 -rallying 1 -ram/1 1 -RAM/1 1 -ram/114 1 -Rama/2 1 -Ramada/3 -Ramadan/1 1 -Ramakrishna -Ramanujan/3 -Ramayana 1 -ramble/28 1 -rambler/1 1 -rambling/10 1 -Rambo/3 -rambunctious -rambunctiously -rambunctiousness/3 -ramekin/1 1 -ramequin/1 1 -ramie/2 1 -ramification/1 1 -ramify/31 1 -Ramirez/3 -Ramiro/3 -ramjet/1 1 -Ramon/3 -Ramona/3 -Ramos -ramp/62 1 -rampage/28 1 -rampancy/2 1 -rampant/8 1 -rampart/18 1 -ramrod/113 1 -Ramsay -Ramses -Ramsey/3 -ramshackle 1 -ranch/22 1 -rancher/1 1 -ranching/2 1 -rancid/33 1 -rancidity/2 1 -rancor/2 1 -rancorous/8 1 -Rand -rand/18 1 -Randal/3 -Randall/3 -Randell/3 -Randi/3 -randiness/3 -Randolph/3 -random/470 1 -randomization/2 1 -randomize/6 1 -Randy/3 -randy/34 1 -ranee/1 1 -range/28 1 -rangefinder/10 1 -ranger/1 1 -ranginess/3 -Rangoon/2 1 -rang 1281 -rangy/34 1 -rani/1 1 -rank/52 1 -ranker 1 -Rankin -Rankine/2 1 -ranking/1 1 -rankle/6 1 -rankling 1 -ransack/11 1 -ransom/23 1 -ransomer/1 1 -ran 1282 -rant/23 1 -ranter/1 1 -ranting/10 1 -Raoul/3 -rap/47 1 -rapacious/16 1 -rapacity/2 1 -rape/28 1 -raper/1 1 -rapeseed/2 1 -Raphael -rapid/183 1 -rapidity/2 1 -rapidness/3 -rapier/1 1 -rapine/2 1 -rapist/1 1 -rappel/213 1 -rappelling 1 -rapper/1 1 -rapport/1 1 -rapporteur/10 1 -rapprochement/1 1 -rapscallion/1 1 -raptly 1 -raptness/3 -raptor/10 1 -rapt 1 -rapture/18 1 -rapturous/8 1 -Rapunzel/3 -Raquel/3 -rare/104 1 -rarebit/1 1 -rarefaction/1 1 -rarefy/31 1 -rarity/15 1 -Rasalgethi/3 -Rasalhague/3 -rascal/30 1 -rash/471 1 -rasher/1 1 -Rasmussen/3 -rasp/23 1 -raspberry/15 1 -rasper 1 -rasping 1 -Rasputin -raspy/34 1 -Ra's 1283 -Rastaban/3 -Rastafarian/2 1 -raster 1 -Ra 1284 -rat/109 1 -ratable 1 -ratatouille/2 1 -ratbag/10 1 -ratchet/23 1 -rate/28 1 -rateable 1 -ratepayer/10 1 -rater/1 1 -rather -Rather/3 -rathskeller/1 1 -ratification/1 1 -ratifier/1 1 -ratify/31 1 -rating/1 1 -ratio/1 1 -ratiocinate/6 1 -ratiocination/2 1 -ration/23 1 -rational/30 1 -rationale/1 1 -rationalism/2 1 -rationalist/1 1 -rationalistic -rationality/15 1 -rationalization/1 1 -rationalize/6 1 -Ratliff/3 -ratlike 1 -ratlin/1 1 -ratline/1 1 -rattan/1 1 -ratter/1 1 -rattle/28 1 -rattlebrain/1 1 -rattlebrained -rattler/1 1 -rattlesnake/1 1 -rattletrap/1 1 -rattling/10 1 -rattly/34 1 -rattrap/1 1 -ratty/34 1 -raucous/16 1 -Raul/3 -raunchily 1 -raunchiness/3 -raunchy/34 1 -ravage/232 1 -ravager/1 1 -rave/139 1 -Ravel -ravel/23 1 -raveling/10 1 -raven/23 1 -ravening 1 -ravenous/8 1 -raven 1 -raver/10 1 -ravine/18 1 -raving/30 1 -ravioli/1 1 -ravish/7 1 -ravisher/1 1 -ravishing/8 1 -ravishment/2 1 -raw/187 1 -Rawalpindi -rawboned -rawhide/2 1 -Ray -ray/18 1 -RayBan/3 -Rayburn/3 -Rayleigh -Raymond/3 -Raymundo/3 -rayon/2 1 -raze/6 1 -razor/86 1 -razorback/1 1 -razorbills -razorblades -razz/22 1 -razzamatazz 1 -razzmatazz/2 1 -Rb/2 1 -RBI 1 -RC -RCA/3 -RCMP -rcpt -rd -Rd -RD -RDA -re/1 1 -Re/2 1 -reabsorb/11 1 -reaccessed -reach/22 1 -reachable 1 -reachieved -reacquaint/11 1 -reacquire/6 1 -reacquisition 1 -react/11 1 -reactant/1 1 -reaction/1 1 -reactionary/15 1 -reactivate/6 1 -reactivation/2 1 -reactive 1 -reactivity/60 1 -reactor/1 1 -read/86 1 -readability/15 1 -readable 1 -readdress/7 1 -reader/1 1 -readership/1 1 -reading/1 1 -Reading/2 1 -readjust/11 1 -readjustment/1 1 -readmission/2 1 -readmit/12 1 -readopt/11 1 -readout/1 1 -ready/472 1 -reaffirm/11 1 -reaffirmation/1 1 -reafforestation 1 -Reagan/2 1 -Reaganomics/3 -reagent/1 1 -real/38 1 -realign/11 1 -realignment/1 1 -realism/2 1 -realist/1 1 -realistic/39 1 -realist 1 -reality/15 1 -realizable 1 -realization/1 1 -realize/6 1 -reallocate/6 1 -reallocation/2 1 -realm/1 1 -realpolitik/2 1 -realtor/1 1 -Realtor 1 -realty/2 1 -really 1 -ream/23 1 -reamer/1 1 -reanalysis/2 1 -reanalyze/6 1 -reanimate/6 1 -reanimation/2 1 -reap/11 1 -reaper/1 1 -reappear/11 1 -reappearance/1 1 -reapplication/1 1 -reapply/31 1 -reappoint/11 1 -reappointment/2 1 -reapportion/11 1 -reapportionment/2 1 -reappraisal/1 1 -reappraise/6 1 -rear/473 1 -rearguard/1 1 -rearm/11 1 -rearmament/2 1 -rearmost 1 -rearrange/6 1 -rearrangement/1 1 -rearrest/23 1 -rearward/10 1 -reascend/11 1 -reason/23 1 -reasonable/29 1 -reasoned 1 -Reasoner/3 -reasoner/1 1 -reasoning/2 1 -reasonless 1 -reassemble/6 1 -reassembly/3 -reassert/11 1 -reassertion/2 1 -reassess/7 1 -reassessment/1 1 -reassign/11 1 -reassignment/1 1 -reassuming -reassurance/1 1 -reassure/6 1 -reassured 1 -reassuring/8 1 -reattach/7 1 -reattachment/2 1 -reattain/11 1 -reattempt/11 1 -reauthorize/6 1 -reawaken/11 1 -reawakening 1 -Reba/3 -rebalanced -rebate/28 1 -Rebecca -Rebekah -rebel/213 1 -rebelling 1 -rebellion/1 1 -rebellious/16 1 -rebel 1 -rebid/474 1 -rebind/121 1285 -rebirth/1 1 -reboil/11 1 -rebook 1 -reboot/11 1 -reborn 1 -rebound/23 1286 -rebroadcast/86 1 -rebuff/23 1 -rebuild/382 1 -rebuke/28 1 -rebukingly -reburial/1 1 -rebury/31 1 -rebus/4 1 -rebut/12 1 -rebuttal/1 1 -rec/2 1 -recalcitrance/2 1 -recalcitrant 1 -recalculate/6 1 -recalculation/1 1 -recalibrate/475 1 -recalibration 1 -recall/23 1 -recant/11 1 -recantation/1 1 -recap/47 1 -recapitalization 1 -recapitalize/6 1 -recapitulate/6 1 -recapitulation/1 1 -recapture/28 1 -recast/86 1 -recasting/2 1 -recce/70 1 -recd -rec'd -recede/6 1 -receipt/23 1 -receivable/32 1 -receive/6 1 -receiver/1 1 -receivership/2 1 -recension 1 -recent/21 1 -receptacle/1 1 -reception/1 1 -receptionist/1 1 -receptive/16 1 -receptivity/2 1 -receptor/1 1 -recess/22 1 -recession/1 1 -recessional/1 1 -recessionary -recessive/1 1 -recharge/6 1 -rechargeable -recharger 1 -recharge's -recharter/11 1 -recheck/23 1 -recherche 1 -rechristen/11 1 -recidivism/2 1 -recidivist/1 1 -Recife/2 1 -recipe/1 1 -recipient/1 1 -reciprocal/30 1 -reciprocate/6 1 -reciprocation/2 1 -reciprocity/2 1 -recirculate/6 1 -recirculation 1 -recital/1 1 -recitalist/1 1 -recitation/1 1 -recitative/1 1 -recite/6 1 -reciter/1 1 -reckless/16 1 -reckon/11 1 -reckoner 1 -reckoning/1 1 -reclaim/5 1 -reclaimable -reclaimer 1 -reclamation/1 1 -reclassification/2 1 -reclassify/31 1 -recline/6 1 -recliner/1 1 -recluse/1 1 -reclusive 1 -recode/6 1 -recognition/1 1 -recognizable/19 1 -recognizance/1 1 -recognize/6 1 -recognizer/10 1 -recoil/23 1 -recollect/11 1 -recollected 1 -recollection/1 1 -recolonization/2 1 -recolonize/6 1 -recolor/11 1 -recombinant 1 -recombination 1 -recombine/6 1 -recommence/6 1 -recommencement/2 1 -recommend/11 1 -recommendable -recommendation/1 1 -recommission/5 1 -recommit/12 1 -recompense/28 1 -recompilation/10 1 -recompile/251 1 -recompose/6 1 -recomputable -recompute/6 1 -recon/58 1 -reconcilable 1 -reconcile/6 1 -reconcilement 1 -reconciliation/1 1 -recondite 1 -recondition/11 1 -reconfigurable -reconfiguration/10 1 -reconfigure/6 1 -reconfirm/11 1 -reconfirmation/1 1 -reconnaissance/1 1 -reconnect/11 1 -reconnection 1 -reconnoiter/11 1 -reconquer/11 1 -reconquest/2 1 -reconsecrate/6 1 -reconsecration/2 1 -reconsider/11 1 -reconsideration/2 1 -reconsign/11 1 -reconstitute/6 1 -reconstitution/2 1 -reconstruct/11 1 -reconstruction/1 1 -Reconstruction/2 1 -reconstructive 1 -reconsult -reconsulted -reconsulting -recontact/5 1 -recontaminate/6 1 -recontribute -reconvene/6 1 -reconversion 1 -reconvert/11 1 -recook/11 1 -recopy/31 1 -record/78 1 -recordable -recorder/1 1 -recording/1 1 -recordists -recount/23 1 -recoup/5 1 -recouple 1 -recourse/2 1 -recover/11 1 -recoverable 1 -recovery/15 1 -recreant/1 1 -recreate/6 1 -recreation/1 1 -recreational -recriminate/6 1 -recrimination/1 1 -recriminatory -recross/7 1 -recrudesce/6 1 -recrudescence/2 1 -recrudescent -recruit/23 1 -recruiter/1 1 -recruitment/2 1 -recrystallization 1 -recrystallize/6 1 -rectal 1 -rectally 1 -rectangle/1 1 -rectangular 1 -rectifiable -rectification/1 1 -rectifier/1 1 -rectify/31 1 -rectilinear -rectitude/2 1 -recto/1 1 -rector/1 1 -rectory/15 1 -rec 1 -rectum/1 1 -recumbent -recuperate/6 1 -recuperation/2 1 -recuperative 1 -recur/13 1 -recurrence/1 1 -recurrent/8 1 -recursion/10 1 -recursive -recursively -recyclable/1 1 -recycle/28 1 -recyclers -recycling/2 1 -red/1 1 -Red/1 1 -red/476 1 -redact/11 1 -redaction/2 1 -redactor/1 1 -redbird/1 1 -redbreast/1 1 -redbrick 1 -redcap/1 1 -redcoat/1 1 -redcurrant/10 1 -redden/11 1 -redder 1 -reddish 1 -redeclaration -redecorate/6 1 -redecoration/2 1 -rededicate/6 1 -redeem/11 1 -redeemable 1 -redeemer/1 1 -Redeemer/2 1 -redefine/6 1 -redefiner -redefinition/1 1 -redeliver/11 1 -redelivery 1 -redemption/2 1 -redemptive -redeploy/11 1 -redeployment/2 1 -redeposit/23 1 -redeposition 1 -redesign/11 1 -redetermine/6 1 -redevelop/11 1 -redevelopment/1 1 -Redford/3 -Redgrave/3 -redhead/1 1 -redheaded -redial/23 1 -redialing 1 -redirect/11 1 -redirection 1 -rediscover/11 1 -rediscovery/15 1 -rediscussed -redisplay/195 1 -redissolve/6 1 -redistributable -redistribute/6 1 -redistribution/2 1 -redistributive -redistrict/11 1 -redivide/6 1 -redlining/2 1 -Redmond -redneck/1 1 -redo/413 1 -redolence/2 1 -redolent 1 -redouble/43 1 -redoubt/18 1 -redoubtable/19 1 -redound/11 1 -redounding 1 -redraft/5 1 -redraw/301 1287 -redress/22 1 -redrew 1288 -redshift/10 1 -redskin/1 1 -reduce/6 1 -reducer/1 1 -reducibility 1 -reducible 1 -reduction/1 1 -reductionism 1 -reductionist/10 1 -reductive 1 -redundancy/15 1 -redundant/8 1 -reduplicate/6 1 -reduplication/2 1 -redwood/1 1 -redye/46 1 -Reebok/3 -reecho/7 1 -reed/1 1 -Reed/2 1 -reed/58 1 -reedit/11 1 -reeducate/6 1 -reeducation/2 1 -reedy/49 1 -reef/115 1 -reefer/1 1 -reefing 1 -reek/23 1 -reeking 1 -reel/23 1 -reelect/11 1 -reelection/1 1 -reeling 1 -reembark/11 1 -reembody/31 1 -reemerge/6 1 -reemergence/2 1 -reemphasize/6 1 -reemploy/11 1 -reemployment/2 1 -reenact/11 1 -reenactment/1 1 -reenforce/6 1 -reengage/6 1 -reenlist/11 1 -reenlistment/2 1 -reenter/11 1 -reentry/15 1 -reequip/105 1 -Reese/3 -reestablish/7 1 -reestablishment/2 1 -reevaluate/6 1 -reevaluation/1 1 -reeve/73 1289 -Reeves -reexamination/1 1 -reexamine/6 1 -reexplain/11 1 -reexport/11 1 -ref/203 1 -reface/6 1 -refashion/11 1 -refasten/11 1 -refection/2 1 -refectory/15 1 -refer/13 1 -referable -referee/63 1 -reference/28 1 -referencer -referendum/1 1 -referent/1 1 -referential -referentially -referral/1 1 -referrer/1 1 -refile/6 1 -refill/23 1 -refillable -refillings -refinance/6 1 -refine/6 1 -refined 1 -refinement/1 1 -refiner/1 1 -refinery/15 1 -refining 1 -refinish/7 1 -refit/109 1 -refitting 1 -reflate/6 1 -reflation/10 1 -reflationary -reflect/11 1 -reflectance 1 -reflecting 1 -reflection/1 1 -reflectional -reflective/83 1 -reflectivity 1 -reflector/1 1 -reflex/40 1 -reflexion/1 1 -reflexive/209 1 -reflexivity 1 -reflexology 1 -reflex 1 -reflooring -reflux/241 1 -refocus/7 1 -refold/11 1 -reforest/11 1 -reforestation/2 1 -reforge/6 1 -reform/23 1 -reformable 1 -reformat/477 1 -reformation/1 1 -Reformation/1 1 -reformative 1 -reformatory/15 1 -reformed 1 -reformer/1 1 -reformist/10 1 -reformulate/6 1 -reformulation/1 1 -refortify/31 1 -refract/11 1 -refraction/1 1 -refractive 1 -refractors -refractory/15 1 -refrain/23 1 -refreeze/14 1290 -refresh/7 1 -refreshable -refresher/1 1 -refreshing/8 1 -refreshment/130 1 -refrigerant/1 1 -refrigerate/6 1 -refrigeration/2 1 -refrigerator/1 1 -refrozen 1291 -refroze 1291 -refuel/11 1 -refuge/18 1 -refugee/1 1 -Refugio/3 -refulgence/2 1 -refulgent 1 -refund/23 1 -refundable -refurbish/7 1 -refurbishment/1 1 -refurnish/7 1 -refusal/1 1 -refuse/28 1 -refuseniks -refuse 1 -refutable 1 -refutation/1 1 -refute/6 1 -refuter/1 1 -regain/11 1 -regal/8 1 -regale/43 1 -regalement/2 1 -regalia/2 1 -regal 1 -regard/185 1 -regardless 1 -regather/11 1 -regatta/1 1 -regency/15 1 -regeneracy/2 1 -regenerate/6 1 -regeneration/1 1 -regenerative 1 -regent/1 1 -regexp -regexps -reggae/2 1 -Reggie/3 -regicide/1 1 -regime/1 1 -regimen/1 1 -regiment/23 1 -regimental 1 -regimentation/2 1 -Regina/53 1 -Reginald/3 -region/1 1 -regional/8 1 -regionalism/1 1 -regional 1 -register/23 1 -registrable -registrant/1 1 -registrar/1 1 -registration/1 1 -registry/15 1 -regnant 1 -Regor/3 -regrade/6 1 -regress/22 1 -regression/1 1 -regressive 1 -regret/109 1 -regretful/8 1 -regrettable/19 1 -regrew 1292 -regrind/121 1293 -reground 1294 -regroup/11 1 -regrow/301 1295 -regrowth/2 1 -reg 1 -regular/30 1 -regularity/15 1 -regularization/2 1 -regularize/6 1 -regulate/6 1 -regulation/1 1 -regulative 1 -regulator/1 1 -regulatory -Regulus/2 1 -regurgitate/6 1 -regurgitation/2 1 -rehab/136 1 -rehabilitate/6 1 -rehabilitation/2 1 -rehabilitative -rehang/11 1296 -rehash/22 1 -rehear/46 1 -rehearing/1 1 -rehears/7 1 -rehearsal/1 1 -rehearse/6 1 -rehearsing 1 -reheat/11 1 -rehi -rehire/6 1 -Rehnquist -rehouse/6 1 -rehousing 1 -rehung 1297 -rehydrate 1 -Reich/2 1 -Reid -reign/23 1 -reignite/6 1 -Reilly/3 -reimbursable -reimburse/6 1 -reimbursement/1 1 -reimplementation -reimplemented -reimplementing -reimporting -reimpose/6 1 -rein/23 1 -Reinaldo/3 -reincarnate/6 1 -reincarnation/1 1 -reincorporate/6 1 -reincorporation/2 1 -reindeer/2 1 -reinfect/11 1 -reinfection/1 1 -reinforce/6 1 -reinforcement/1 1 -Reinhardt -Reinhold/3 -reinitialization -reinitialize -reinitialized -reinitializing -reinoculate/6 1 -reinsert/11 1 -reinsertion/2 1 -reinspect/11 1 -reinstall/241 1 -reinstate/6 1 -reinstatement/2 1 -reinsurance 1 -reintegrate/6 1 -reintegration/2 1 -reinterpret/11 1 -reinterpretation/1 1 -reintroduce/6 1 -reintroduction/1 1 -reinvent/11 1 -reinvention/1 1 -reinvest/11 1 -reinvestigation 1 -reinvestment/2 1 -reinvigorate/6 1 -reissue/28 1 -REIT -reiterate/6 1 -reiteration/1 1 -reiterative 1 -reject/23 1 -rejection/1 1 -rejig/117 1 -rejigger/11 1 -rejoice/6 1 -rejoicing/1 1 -rejoin/11 1 -rejoinder/1 1 -rejudge/6 1 -rejustified -rejuvenate/6 1 -rejuvenation/1 1 -rejuvenatory -rekindle/6 1 -rel -relabel/11 1 -relabellings -relapse/28 1 -relate/6 1 -related/33 1 -relater/1 1 -relation/1 1 -relational -relationally -relationship/1 1 -relative/30 1 -relativism/2 1 -relativist/10 1 -relativistic/39 1 -relativity/2 1 -relator 1 -relaunch/7 1 -relaunch's -relax/7 1 -relaxant/1 1 -relaxation/1 1 -relaxed 1 -relaxer/1 1 -relaxingly -relay/478 1 -relearn/11 1 -releasable -release/28 1 -relegate/6 1 -relegation/2 1 -relent/11 1 -relenting 1 -relentless/16 1 -relevance/2 1 -relevancy/2 1 -relevant/8 1 -reliability/15 1 -reliable/19 1 -reliance/2 1 -reliant 1 -relic/1 1 -relict 1 -relief/123 1 -relieve/6 1 -relieved 1 -reliever/1 1 -relight/11 1 -religion/1 1 -religiosity 1 -religious/239 1 -reline/6 1 -relink/241 1 -relinquish/7 1 -relinquishment/2 1 -reliquary/15 1 -relish/22 1 -relivable -relive/6 1 -reload/5 1 -relocatable -relocate/6 1 -relocation/2 1 -relocked -reluctance/2 1 -reluctant/8 1 -rely/31 1 -rem/1 1 -REM/1 1 -remade 1298 -remain/11 1 -remainder/23 1 -remake/73 1299 -remand/5 1 -remap/105 1 -remark/23 1 -remarkable/19 1 -remarkableness/3 -Remarque -remarriage/1 1 -remarry/31 1 -remaster/11 1 -rematch/182 1 -rematerialized -Rembrandt/2 1 -remeasure/6 1 -remediable 1 -remedial -remedially -remediation/2 1 -remedy/56 1 -remelt/11 1 -remember/11 1 -remembrance/1 1 -remigrate/6 1 -remind/11 1 -reminder/1 1 -Remington -reminisce/6 1 -reminiscence/1 1 -reminiscent/8 1 -remiss/16 1 -remission/1 1 -remit/479 1 -remittance/1 1 -remix/156 1 -remnant/1 1 -remodel/11 1 -remold/11 1 -remonstrance/1 1 -remonstrant/1 1 -remonstrate/6 1 -remonstration/10 1 -remorse/2 1 -remorseful/8 1 -remorseless/16 1 -remortgage/6 1 -remote/25 1 -remould/11 1 -remount/23 1 -removable 1 -removal/1 1 -remove/28 1 -removed 1 -remover/1 1 -remunerate/6 1 -remuneration/1 1 -remunerative 1 -Remus/2 1 -Rena/3 -renaissance/1 1 -Renaissance/1 1 -renal 1 -rename/6 1 -renascence/1 1 -Renascence 1 -renascent -renationalisation -renationalized -Renault/3 -rend/382 1 -render/23 1 -rendering/1 1 -rendezvous/22 1 -rendition/18 1 -Rene/3 -Renee/3 -renegade/28 1 -renege/43 1 -reneger/1 1 -renegotiable -renegotiate/6 1 -renegotiation/2 1 -renew/11 1 -renewable 1 -renewal/1 1 -rennet/2 1 -rennin/2 1 -Reno/2 1 -Renoir -renominate/6 1 -renomination/2 1 -renormalization 1 -renounce/43 1 -renouncement/2 1 -renovate/6 1 -renovation/1 1 -renovator/1 1 -renown/173 1 -renowned 1 -rent/23 1 -rental/1 1 -renter/1 1 -renucleated -renumber/11 1 -renunciation/1 1 -reoccupation/2 1 -reoccupy/31 1 -reoccur/13 1 -reopen/11 1 -reopening 1 -reorder/23 1 -reorganization/1 1 -reorganize/6 1 -reorient/11 1 -reorientated -reorientates -reorientation/2 1 -reorient 1 -Rep -rep/1 1 -repack/11 1 -repackage/6 1 -repaint/5 1 -repainting 1 -repair/23 1 -repairable 1 -repairer/1 1 -repairman/2 1300 -repairmen 1301 -repaper 1 -reparable 1 -reparation/130 1 -repartee/2 1 -repartition/241 1 -repast/18 1 -repatriate/28 1 -repatriation/1 1 -repave/6 1 -repay/312 1 -repayable -repayment/1 1 -repeal/23 1 -repeat/23 1 -repeatability 1 -repeatable -repeatably -repeated/8 1 -repeater/1 1 -repeating/2 1 -repel/61 1 -repellant/1 1 -repellent/1 1 -repellingly -repelling 1 -repent/11 1 -repentance/2 1 -repentant/8 1 -repent 1 -repercussion/1 1 -repertoire/1 1 -repertory/15 1 -repetition/1 1 -repetitious/33 1 -repetitiously -repetitive/16 1 -rephotograph/5 1 -rephrase/6 1 -repine/6 1 -repining 1 -replace/6 1 -replaceable -replacement/1 1 -replant/11 1 -replay/23 1 -replenish/7 1 -replenishment/2 1 -replete/480 1 -repletion/2 1 -replica/1 1 -replicable -replica's 1302 -replica 1303 -replicas 1 -replicate/6 1 -replication/1 1 -replicator/10 1 -replier/10 1 -replotted -replug -replugged -replugging -reply/31 1 -reply's -repopulate/6 1 -report/23 1 -reportable -reportage/2 1 -reported/8 1 -reporter/1 1 -reporting 1 -reportorial 1 -repose/28 1 -reposeful 1 -reposition/5 1 -repository/15 1 -repossess/7 1 -repossession/1 1 -reprehend/11 1 -reprehensibility/2 1 -reprehensible/19 1 -reprehension/2 1 -represent/11 1 -representable -representation/1 1 -representational -representative/437 1 -Representative 1 -repress/7 1 -repression/1 1 -repressive/83 1 -reprice/6 1 -reprieve/28 1 -reprimand/23 1 -reprint/23 1 -reprisal/1 1 -reprise/73 1 -reprized -reproach/22 1 -reproachable 1 -reproachful/83 1 -reprobate/18 1 -reprocess/7 1 -reproduce/6 1 -reproducer/1 1 -reproducibility 1 -reproducible/19 1 -reproduction/1 1 -reproductive/8 1 -reprogram/114 1 -reprogrammable -reprojected -reproof/23 1 -reprove/6 1 -reproving/8 1 -reps 1 -reptile/1 1 -reptilian/1 1 -republic/1 1 -republican/1 1 -Republican/1 1 -republicanism/2 1 -Republicanism 1 -republication/1 1 -republish/7 1 -repudiate/6 1 -repudiation/1 1 -repudiator/1 1 -repugnance/2 1 -repugnant -repulse/28 1 -repulsion/1 1 -repulsive/16 1 -repurchase/43 1 -reputability/2 1 -reputable/19 1 -reputation/1 1 -repute/28 1 -reputed/8 1 -request/23 1 -requester 1 -requiem/1 1 -Requiem/1 1 -require/6 1 -requirement/1 1 -requiring 1 -requisite/1 1 -requisition/23 1 -requital/2 1 -requite/6 1 -requiter/1 1 -reran 1304 -reread/121 1 -rereading 1 -rerecord/11 1 -reredos 1 -reregistration 1 -rerolled -reroute/6 1 -rerouteing -rerun/442 1305 -resalable -resale/1 1 -resat 1306 -rescale/6 1 -rescan -rescanned -rescanning -rescans -reschedule/6 1 -rescind/11 1 -rescission/2 1 -rescue/28 1 -rescuer/1 1 -reseal/11 1 -resealable -research/22 1 -researcher/1 1 -reseated -resection/1 1 -reseed/11 1 -reselect/195 1 -reselection 1 -resell/121 1307 -reseller/10 1 -resemblance/1 1 -resemble/6 1 -resend/481 1 -resent/11 1 -resentful/16 1 -resentment/1 1 -reserpine/2 1 -reservation/1 1 -reserve/28 1 -reserved/16 1 -reserve 1 -reservist/1 1 -reservoir/1 1 -reset/128 1 -resettable -resettle/6 1 -resettlement/2 1 -resew/11 1 -reshape/6 1 -resharpen/11 1 -reship/105 1 -reshipment/2 1 -reshow/142 1 -reshuffle/28 1 -reside/6 1 -residence/1 1 -residency/15 1 -resident/1 1 -residential 1 -residual/1 1 -residuary -residua 1308 -residue/1 1 -residuum/2 1309 -resign/11 1 -resignal -resignation/1 1 -resigned/8 1 -resilience/2 1 -resiliency/2 1 -resilient/8 1 -resin/18 1 -resinous 1 -resiny 1 -resist/23 1 -resistance/1 1 -Resistance 1 -resistant 1 -resister/1 1 -resistible 1 -resistive/8 1 -resistivity 1 -resistless 1 -resistor/1 1 -resit/88 1310 -resiting -resitting 1 -resizing -resold 1311 -resole/6 1 -resolute/27 1 -resolution/1 1 -resolvability 1 -resolvable 1 -resolve/28 1 -resolved 1 -resolvent 1 -resolver/10 1 -resonance/1 1 -resonant/8 1 -resonate/6 1 -resonator/1 1 -resorption/2 1 -resort/23 1 -resound/11 1 -resounding/8 1 -resource/1 1 -resourced -resourceful/16 1 -resourcing -resow/126 1 -resp -respecified -respecify -respect/23 1 -respectability/2 1 -respectable/19 1 -respecter/1 1 -respectful/16 1 -respective/8 1 -respell/11 1 -respelling 1 -respiration/2 1 -respirator/1 1 -respiratory -respire/6 1 -respite/18 1 -resplendence/2 1 -resplendent/8 1 -respond/5 1 -respondent/1 1 -responder/10 1 -response/1 1 -responsibility/15 1 -responsible/19 1 -responsive/16 1 -respray/11 1 -rest/23 1 -restaff/11 1 -restart/23 1 -restartable -restate/6 1 -restatement/1 1 -restaurant/1 1 -restauranteur/1 1 -restaurateur/1 1 -restful/85 1 -resting 1 -restitch/7 1 -restitution/2 1 -restive/16 1 -restless/16 1 -restock/11 1 -restoration/1 1 -Restoration/2 1 -restorative/1 1 -restore/6 1 -restorer/1 1 -restrain/11 1 -restrained 1 -restrainer/1 1 -restraint/1 1 -restrengthen/11 1 -restrict/11 1 -restricted 1 -restriction/1 1 -restrictive/16 1 -restring/121 1312 -restroom/1 1 -restructure/6 1 -restructuring/1 1 -restrung 1313 -restudy/362 1 -restyle/6 1 -restyling 1 -resubmission/10 1 -resubmit/12 1 -resubscribe/6 1 -resubstitute -result/23 1 -resultant/1 1 -resulting 1 -resume/28 1 -resumption/1 1 -resupply/31 1 -resurface/6 1 -resurgence/1 1 -resurgent -resurrect/11 1 -resurrection/1 1 -Resurrection 1 -resurvey/5 1 -resuscitate/6 1 -resuscitation/2 1 -resuscitator/1 1 -resynchronization -resynchronize/6 1 -retail/78 1 -retailer/1 1 -retailing 1 -retain/11 1 -retainer/1 1 -retake/263 1314 -retaking 1 -retaliate/6 1 -retaliation/1 1 -retaliative -retaliatory -retard/23 1 -retardant/1 1 -retardation/2 1 -retarder/1 1 -retaught 1315 -retch/156 1 -reteach/125 1316 -retell/121 1317 -retelling 1 -retention/1 1 -retentive/16 1 -retentivity 1 -retest/23 1 -rethink/86 1318 -rethought 1319 -reticence/2 1 -reticent/8 1 -reticular 1 -reticulated -reticulation/1 1 -reticule/10 1 -reticulum 1 -retie/122 1320 -retina/1 1 -retinal 1 -retinitis 1 -retinue/1 1 -retire/6 1 -retired 1 -retiree/1 1 -retirement/1 1 -retiring 1 -retitled -retitling -retold 1321 -retook 1322 -retool/11 1 -retort/23 1 -retouch/22 1 -retrace/6 1 -retract/11 1 -retractable -retractile -retraction/1 1 -retrain/11 1 -retransmission/10 1 -retransmit/12 1 -retread/23 1323 -retreat/23 1 -retreating 1 -retrench/7 1 -retrenchment/1 1 -retrial/1 1 -retribution/1 1 -retributive 1 -retrievable -retrieval/1 1 -retrieve/28 1 -retriever/1 1 -retrieving 1 -retro/1 1 -retroactive/8 1 -retrodden 1324 -retrod 1324 -retrofire/6 1 -retrofit/12 1 -retrofit's -retrofitting 1 -retrograde/6 1 -retrogress/7 1 -retrogression/2 1 -retrogressive -retrorocket/1 1 -retrospect/23 1 -retrospection/2 1 -retrospective/30 1 -retro 1 -retrovirus/4 1 -retry/31 1 -retsina/2 1 -retuning -return/78 1 -returnable/1 1 -returnee/1 1 -returner/1 1 -retying 1325 -retype/6 1 -Reuben 1 -reunification/2 1 -reunify/31 1 -Reunion -reunion/1 1 -reunite/6 1 -reupholster/11 1 -reusable 1 -reuse/6 1 -reuse's -Reuters -Reuther/3 -Rev -rev/482 1 -Reva/3 -revaluation/1 1 -revalue/6 1 -revamp/23 1 -revamping's -revanchist 1 -reveal/5 1 -revealable 1 -revealed 1 -revealing/191 1 -reveille/2 1 -revel/23 1 -revelation/1 1 -Revelation/1 1 -revelatory -reveler/1 1 -revelings -revelry/15 1 -revenge/28 1 -revengeful/8 1 -revenging 1 -revenue/1 1 -revenuer/1 1 -reverberant 1 -reverberate/6 1 -reverberation/1 1 -Revere -revere/43 1 -reverence/28 1 -reverend/1 1 -Reverend/2 1 -reverent/8 1 -reverential/8 1 -reverie/1 1 -revers/22 1 -reversal/1 1 -reverse/483 1 -reversed 1 -reverser 1 -reverses 1326 -reversibility 1 -reversible/19 1 -reversing 1 -reversion/1 1 -revert/5 1 -revertible -revery/15 1 -revetment/1 1 -review/78 1 -reviewable -reviewer/1 1 -revile/6 1 -revilement/2 1 -reviler/1 1 -reviling 1 -revisable -revise/28 1 -reviser/1 1 -revision/1 1 -revisionary -revisionism/2 1 -revisionist/1 1 -revisit/11 1 -revitalization/2 1 -revitalize/6 1 -revival/1 1 -revivalism/2 1 -revivalist/1 1 -revive/6 1 -reviver 1 -revivification/2 1 -revivify/31 1 -reviving 1 -Revlon/3 -revocable 1 -revocation/1 1 -revokable -revoke/43 1 -revoker/10 1 -revolt/23 1 -revolting/8 1 -revolution/1 1 -revolutionary/15 1 -revolutionist/1 1 -revolutionize/6 1 -revolvable -revolve/6 1 -revolver/1 1 -revolving 1 -revue/1 1 -revulsion/2 1 -reward/23 1 -rewarm/11 1 -rewash/7 1 -reweave/14 1327 -rewed/274 1 -reweigh/11 1 -rewind/86 1328 -rewindable -rewire/6 1 -reword/11 1 -rewordings -rework/11 1 -reworkings -rewound 1329 -rewoven 1330 -rewove 1330 -rewritable -rewrite/484 1331 -rewritings -rewrote 1332 -Rex 1 -Reyes -Reykjavik/2 1 -Reyna/3 -Reynaldo/3 -Reynolds -rezone/6 1 -RF -Rf/2 1 -RFC/10 1 -RFD -Rh/2 1 -rhapsodical -rhapsodic 1 -rhapsodize/6 1 -rhapsody/15 1 -rhea/1 1 -rhea's 1333 -rhea 1334 -Rhea 1335 -Rhee -Rheingau/3 -Rhenish 1 -rhenium/2 1 -rheological -rheology 1 -rheostat/1 1 -rhesus/4 1 -rhetoric/2 1 -rhetorical/8 1 -rhetorician/1 1 -rheum/2 1336 -rheumatic/51 1 -rheumatism/2 1 -rheumatoid 1 -rheumy/34 1 -Rhiannon/3 -Rhine/2 1 -Rhineland/2 1 -rhinestone/1 1 -rhinitis/2 1 -rhino/1 1 -rhinoceros/4 1 -rhizome/1 1 -rho/1 1 -Rhoda/3 -Rhodes -Rhodesia/2 1 -Rhodesian 1 -rhodium/2 1 -rhododendron/1 1 -rhomboid/1 1 -rhomboidal 1 -rhomboid 1 -rhombus/4 1 -Rhonda/3 -Rhone/2 1 -rhubarb/1 1 -rhyme/28 1 -rhymer/1 1 -rhymester/1 1 -rhythm/1 1 -rhythmical/8 1 -rhythmic 1 -RI -rial/1 1 -rib/136 1 -ribaldry/2 1 -ribald 1 -Ribbentrop -ribber/1 1 -ribbing 1 -ribbon/18 1 -ribcage 1 -riboflavin/2 1 -ribonucleic -ribosomes -Ricardo -Rice -rice/28 1 -ricer/1 1 -rices 1337 -Rich/3 -rich/471 1 -Richard/10 1 -Richardson -Richelieu/2 1 -Richie/3 -Richmond/2 1 -Richter -Richthofen -Rick/3 -rick/23 1 -Rickenbacker/3 -rickets/2 1 -rickety/34 1 -Rickey/3 -Rickie/3 -Rickover -rickrack/2 1 -ricksha/1 1 -rickshaw/1 1 -Ricky/3 -Rico/3 -ricochet/23 1 -ricotta/2 1 -rid/439 1 -riddance/2 1 -Riddle/3 -riddle/28 1 -riddling 1 -Ride -ride/366 1338 -rider/1 1 -riderless 1 -ridership/2 1 -ridge/28 1 -ridgepole/1 1 -ridging 1 -ridgy/34 1 -ridicule/28 1 -ridiculous/16 1 -riding/2 1 -Riefenstahl/3 -Riel/3 -Riemann/2 1 -Riesling/1 1 -RIF -rife/150 1339 -riff/23 1 -riffle/28 1 -riffling 1 -riffraff/2 1 -rifle/28 1 -rifleman/2 1340 -riflemen 1341 -rifler/1 1 -rifling/2 1 -rift/23 1 -rig/92 1 -Riga/2 1 -rigamarole/1 1 -rigatoni/2 1 -Rigel/2 1 -rigger/1 1 -rigging/2 1 -Riggs/3 -right/52 1 -righteous/16 1 -righter 1 -rightful/16 1 -righting 1 -rightism/2 1 -rightist/1 1 -rightmost 1 -righto 1 -rightsize/6 1 -Right 1 -rightward/10 1 -rigid/16 1 -rigidify/258 1 -rigidity/15 1 -rigmarole/1 1 -Rigoberto/3 -Rigoletto/3 -rigor/1 1 -rigorous/16 1 -rile/6 1 -Riley -Rilke -rill/18 1 -rim/160 1 -Rimbaud -rime/28 1 -rimless 1 -rind/18 1 -ring/23 1342 -ringed 1 -ringer/1 1 -ringgit/1 1 -ringing/191 1 -ringleader/1 1 -ringlet/1 1 -ringlike 1 -Ringling/3 -ringmaster/1 1 -Ringo/3 -ringside/2 1 -ringworm/2 1 -rink/18 1 -rinse/28 1 -rinsing 1 -Rio/1 1 -riot/23 1 -rioter/1 1 -rioting/2 1 -riotous/83 1 -RIP -rip/296 1 -riparian 1 -ripcord/1 1 -ripe/27 1 -ripen/11 1 -ripening 1 -riper 1 -ripe 1 -Ripley -ripoff/1 1 -ripost/23 1 -riposte/28 1 -ripper/1 1 -ripping 1 -ripple/485 1 -rippling 1 -ripsaw/18 1 -ripstop 1 -riptide/1 1 -rise/263 1343 -riser/1 1 -risibility/2 1 -risible 1 -rising/1 1 -risk/23 1 -risky/50 1 -Risorgimento -risotto/1 1 -risque 1 -rissole/10 1 -Rita/3 -Ritalin/2 1 -rite/1 1 -ritual/30 1 -ritualism/2 1 -ritualistic/39 1 -ritualized -Ritz/2 1 -ritzy/34 1 -riv -rival/23 1 -rivaling 1 -rivalry/15 1 -rival 1 -Rivas -rive/376 1 -river/1 1 -Rivera -riverbank/1 1 -riverbed/1 1 -riverboat/1 1 -riverfront 1 -Rivers -Riverside -riverside/1 1 -rives 1344 -rivet/23 1 -riveter/1 1 -rivetingly -Riviera/1 1 -riviera/10 1 -rivulet/1 1 -Riyadh/2 1 -riyal/1 1 -Rizal -rm -Rn/2 1 -RN/2 1 -RNA/2 1 -Roach/3 -roach/22 1 -road/1 1 -roadbed/1 1 -roadblock/23 1 -roadhouse/1 1 -roadie/1 1 -roadkill/2 1 -roadrunner/1 1 -roadshow/1 1 -roadside/1 1 -roadsigns -roadster/1 1 -roadsweepers -road 1 -roadway/1 1 -roadwork/1 1 -roadworthy 1 -roam/5 1 -roamer/1 1 -roaming's -roan/1 1 -Roanoke/2 1 -roan 1 -roar/23 1 -roarer/1 1 -roaring/2 1 -roast/78 1 -roaster/1 1 -roasting/1 1 -Rob/3 -rob/145 1 -robber/1 1 -robbery/15 1 -Robbie/3 -Robbin/3 -Robbins -Robby/3 -robe/28 1 -Roberson/3 -Robert/1 1 -Roberta/3 -Roberto/3 -Robertson/3 -Robeson -Robespierre -Robin/3 -robin/1 1 -robing 1 -Robinson -Robitussin/3 -Robles/3 -robot/1 1 -robotic/32 1 -robotize/6 1 -Robson -Robt/3 -robust/21 1 -Robyn/3 -Rocco/3 -Rocha/3 -Rochambeau/3 -Roche/3 -Rochelle/3 -Rochester/2 1 -Rock -rock/78 1 -rockabilly/3 -rockbound 1 -Rockefeller -rocker/1 1 -rockery/60 1 -rocket/23 1 -rocketry/2 1 -rockfall/1 1 -Rockford -rockier 1 -Rockies/2 1 -rocking 1 -Rockne/3 -Rockwell -Rocky/3 -rocky/49 1 -rococo/2 1 -Rod/3 -rod/18 1 -Roddenberry/3 -rodent/1 1 -rodeo/18 1 -Roderick/3 -rode 1345 -Rodger/3 -Rodgers -Rodin -Rodney -Rodolfo/3 -Rodrick/3 -Rodrigo/3 -Rodriguez/3 -Rodriquez/3 -roe/1 1 -roebuck/1 1 -Roeg/3 -Roentgen -roentgen/1 1 -ROFL -Rogelio/3 -Roger/10 1 -roger/11 1 -Roget/3 -rogue/18 1 -roguery/2 1 -rogue 1 -roguish/16 1 -roil/11 1 -roister/11 1 -roisterer/1 1 -Rojas/3 -Rolaids/2 1 -Roland -Rolando/3 -role/1 1 -Rolex/3 -roll/23 1 -Rolland -rollback/1 1 -roller/1 1 -Rollerblade 1 -rollerblading -rollerskating/2 1 -rollick/11 1 -rollicking/2 1 -rolling/10 1 -Rollins -rollmop/10 1 -rollover/1 1 -Rolodex 1 -Rolvaag/3 -ROM/2 1 -romaine/1 1 -Roman/1 1 -roman/2 1 -romance/28 1 -romancer/1 1 -romancing 1 -Romanesque/1 1 -Romania/2 1 -Romanian/1 1 -Romano 1 -Romanov/2 1 -Romansh -romantic/51 1 -romanticism/2 1 -Romanticism 1 -romanticist/1 1 -romanticize/6 1 -Romantic 1 -roman 1 -Roman 1 -Romany/15 1 -Rome/1 1 -romeo/1 1 -Romeo 1 -Romero/3 -Rommel/2 1 -Romney 1 -romp/23 1 -romper/1 1 -Rom 1 -Romulus/2 1 -Ron/2 1346 -Ronald/3 -Ronda/3 -rondo/1 1 -Ronnie/3 -Ronstadt/3 -Rontgen -rontgen/10 1 -Ronny/3 -rood/1 1 -roof/23 1 -roofer/1 1 -roofgarden -roofing/2 1 -roofless 1 -rooftop/1 1 -rook/23 1 -rookery/15 1 -rookie/1 1 -room/23 1 -roomer/1 1 -roomette/1 1 -roomful/1 1 -roommate/1 1 -roomy/49 1 -Rooney/3 -Roosevelt/2 1 -roost/23 1 -rooster/1 1 -Root/3 -root/78 1 -rooter/1 1 -rooting 1 -rootless/153 1 -rootlet/1 1 -rootstock 1 -rope/28 1 -roper/1 1 -ropey 1347 -ropier 1348 -ropiest 1348 -roping 1 -ropy/34 1 -Roquefort/1 1 -Rorschach 1 -Rory/3 -Rosa/2 1 -Rosales/2 1 -Rosalie/3 -Rosalind/3 -Rosalinda/3 -Rosalyn/3 -Rosanna/3 -Rosanne/3 -Rosario -rosary/15 1 -Roscoe/3 -Rose/3 -rose/18 1 -Roseann/3 -roseate 1 -Roseau/2 1 -rosebud/1 1 -rosebush/4 1 -Rosecrans/3 -Rosella/3 -Rosemarie/3 -Rosemary/3 -rosemary/2 1 -Rosenberg/3 -Rosendo/3 -Rosenzweig/3 -rose 1349 -Rosetta -rosette/18 1 -rosewater/2 1 -rosewood/1 1 -Rosicrucian 1 -Rosie/3 -rosier 1 -rosin/23 1 -Roslyn/3 -Ross/2 1 -Rossetti/2 1 -Rossini/2 1 -Rostand -roster/86 1 -rostering 1 -Rostov/2 1 -Rostropovich/3 -rostrum/1 1 -Roswell/3 -rosy/50 1 -rot/109 1 -rota/10 1 -Rotarian/2 1 -rotary/15 1 -rotatable 1 -rotate/6 1 -rotation/1 1 -rotational/8 1 -rotators -rotatory -ROTC/2 1 -rote/2 1 -rotgut/2 1 -Roth/3 -Rothko -Rothschild -rotisserie/1 1 -rotogravure/1 1 -rotor/1 1 -rototiller/1 1 -rotten/21 1 -rotter/10 1 -Rotterdam/2 1 -Rottweiler/2 1 -rottweiler/10 1 -rotunda/1 1 -rotundity/2 1 -rotundness/3 -rotund 1 -Rouault -roue/1 1 -rouge/28 1 -rough/52 1 -roughage/2 1 -roughcast 1 -roughen/11 1 -rougher 1 -roughhouse/28 1 -roughneck/23 1 -roughshod 1 -roulette/2 1 -round/52 1 -roundabout/1 1 -rounded 1 -roundel/10 1 -roundelay/1 1 -rounder/10 1 -roundhouse/1 1 -rounding 1 -roundish 1 -roundtable/1 1 -roundup/1 1 -roundworm/1 1 -Rourke/3 -rouse/6 1 -rousing 1 -Rousseau/2 1 -roust/11 1 -roustabout/1 1 -rout/23 1 -route/28 1 -router/1 1 -routine/30 1 -routing 1 -routinize/6 1 -roux 1 -Rove/3 -rove/43 1 -Rover -rover/1 1 -rove 1350 -roving 1 -row/23 1 -rowan/10 1 -rowboat/1 1 -rowdy/221 1 -rowdyism/2 1 -Rowe -rowel/23 1 -Rowena/3 -rower/1 1 -rowing/2 1 -Rowland/3 -Rowling/3 -rowlock/10 1 -Roxanne/3 -Roxie/3 -Roxy/3 -Roy/3 -royal/30 1 -royalist/1 1 -Royal 1 -royalty/344 1 -Royce -Rozelle/3 -RP -rpm 1 -rps -RR -RSFSR -RSI -RSV -RSVP -rt -rte -Rte -RTFM/11 1 -Ru/2 1 -rub/136 1 -Rubaiyat/3 -rubato/1 1 -rubber/18 1 -rubberize/6 1 -Rubbermaid/3 -rubberneck/23 1 -rubbernecker/1 1 -rubber 1 -rubbery/34 1 -rubbing/10 1 -rubbish/22 1 -rubbishy 1 -rubble/2 1 -rubdown/1 1 -rube/1 1 -rubella/2 1 -Ruben/3 -Rubens -Rubicon/1 1 -rubicund -rubidium/2 1 -Rubik/3 -Rubin/3 -Rubinstein -ruble/1 1 -rubric/18 1 -Ruby/3 -ruby/486 1 -Ruchbah/3 -ruched -ruck/5 1 -rucksack/1 1 -ruckus/4 1 -ruction/10 1 -rudder/1 1 -rudderless 1 -ruddy/49 1 -rude/27 1 -rudiment/1 1 -rudimentary 1 -Rudolf -Rudolph/3 -Rudy/3 -Rudyard/3 -rue/28 1 -rueful/16 1 -ruff/23 1 -ruffian/18 1 -ruffianly 1 -ruffle/28 1 -ruffling 1 -ruffly/34 1 -Rufus/3 -rug/361 1 -rugby/2 1 -Rugby 1 -rugged/21 1 -rugger 1 -Ruhr/2 1 -ruin/23 1 -ruination/1 1 -ruing 1 -ruining 1 -ruinous/8 1 -Ruiz/3 -Rukeyser/3 -rule/28 1 -rulebook -rulebooks -ruler/18 1 -ruling/1 1 -rum/487 1 -Rumania/2 1 -Rumanian/1 1 -rumba/23 1 -rumble/28 1 -rumbling/1 1 -rumbustious -ruminant/1 1 -ruminate/6 1 -rumination/1 1 -ruminative -ruminatively -rummage/28 1 -rummer 1 -rummy/2 1 -rumor/23 1 -rumormonger/18 1 -rump/18 1 -Rumpelstiltskin/2 1 -rumple/28 1 -rumpling 1 -rumply/34 1 -rump 1 -rumpus/40 1 -Rumsfeld/3 -run/442 1351 -runabout/1 1 -runaround/1 1 -runaway/1 1 -rundown/1 1 -rune/1 1 -rung/1 1352 -runic 1 -runlet/1 1 -runnable -runnel/1 1 -runner/1 1 -running/2 1 -runoff/1 1 -runt/1 1 -runty/34 1 -runway/1 1 -runny/34 1 -Runnymede -Runyon -rupee/1 1 -Rupert/2 1 -rupiah/1 1 -rupture/28 1 -rural/8 1 -ruse/1 1 -Rush/3 -rush/147 1 -Rushdie/3 -rusher/1 1 -rushing 1 -Rushmore/2 1 -rushy/34 1 -rusk/1 1 -Ruskin -Russel/3 -Russell/2 1 -russet/18 1 -Russia/2 1 -Russian/1 1 -Russo/3 -Russ 1 -rust/23 1 -Rustbelt/2 1 -rustic/51 1 -rusticate/6 1 -rustication/2 1 -rusticity/2 1 -rusting 1 -rustle/28 1 -rustler/1 1 -rustling/10 1 -rustproof/11 1 -rust 1 -Rusty/3 -rusty/49 1 -rut/109 1 -rutabaga/1 1 -Rutan/3 -Rutgers -Ruth/2 1 -ruthenium/2 1 -Rutherford -rutherfordium/2 1 -Ruthie/3 -ruthless/16 1 -Rutledge/3 -rutting 1 -rutty/34 1 -RV/1 1 -Rwanda/1 1 -Rwandan/1 1 -Rwy -Rx -Ry -Ryan/3 -Rydberg/3 -Ryder -rye/2 1 -Ryukyu/3 -S/2 1 -SA -Saab/3 -Saar -Saarinen -Saatchi/3 -Sabbath/1 1 -sabbath 1 -sabbatical/1 1 -saber/18 1 -Sabik/3 -Sabin -Sabina/3 -Sabine/2 1 -sable/18 1 -sabot/1 1 -sabotage/28 1 -saboteur/1 1 -sabra/1 1 -Sabre/3 -Sabrina/3 -SAC -sac/64 1 -Sacajawea -saccharides -saccharin/2 1 -saccharine 1 -Sacco/3 -sacerdotal -sachem/1 1 -sachet/1 1 -Sachs/3 -sack/23 1 -sackcloth/2 1 -sackful/1 1 -sacking/1 1 -sacral 1 -sacrament/18 1 -sacramental 1 -Sacramento/2 1 -sacra 1353 -sacred/16 1 -sacrifice/28 1 -sacrificial -sacrificially -sacrilege/1 1 -sacrilegious/8 1 -sacristan/1 1 -sacristy/15 1 -sacroiliac/1 1 -sacrosanct/33 1 -sacrum/2 1354 -sad/488 1 -Sadat -Saddam/3 -sadden/11 1 -saddening 1 -saddle/28 1 -saddlebag/1 1 -saddler/10 1 -saddlery 1 -Sadducee -Sade/2 1 -sades 1355 -sadhu/10 1 -Sadie/3 -sadism/2 1 -sadist/1 1 -sadistic/39 1 -sadist 1 -sadomasochism/2 1 -sadomasochist/1 1 -sadomasochistic -Sadr/3 -safari/23 1 -Safavid -safe/25 1356 -safeguard/23 1 -safeguarding 1 -safekeeping/1 1 -safety/167 1 -Safeway/3 -safflower/1 1 -saffron/1 1 -sag/92 1 -saga/1 1 -sagacious/8 1 -sagacity/2 1 -Sagan/3 -saga's 1357 -saga 1358 -sage/255 1 -sagebrush/2 1 -sagging 1 -Saginaw/3 -Sagittarius/4 1 -sago/2 1 -sag 1 -saguaro/1 1 -saggy/34 1 -Sahara/2 1 -Saharan/2 1 -Sahel -sahib/1 1 -said 1 -Saigon/2 1 -sail/23 1 -sailboard/86 1 -sailboarder/1 1 -sailboarding/2 1 -sailboat/1 1 -sailcloth/2 1 -sailfish/4 1 -sailing/1 1 -sailor/1 1 -sailplane/18 1 -saint/62 1 -sainthood/2 1 -saintlike 1 -saintly/49 1 -saint 1 -Saiph/3 -saith 1 -Sakai -sake/1 1 -sakes 1359 -Sakha/3 -Sakhalin/3 -Sakharov -Saki/3 -saki/2 1 -Saks -Sal -salaam/23 1 -salable 1 -salacious/16 1 -salacity/2 1 -salad/1 1 -Saladin -Salado -salamander/1 1 -salami/1 1 -Salamis -salary/148 1 -Salas/3 -Salazar/3 -sale/1 1 -saleability -Salem/2 1 -Salerno/2 1 -saleroom/10 1 -salesclerk/1 1 -salesgirl/1 1 -saleslady/15 1 -salesman/2 1360 -salesmanship/2 1 -salesmen 1361 -salespeople's 1362 -salespeople 1363 -salesperson/1 1364 -salesroom/10 1 -saleswoman/2 1365 -saleswomen 1366 -salicylic -salience/2 1 -salient/30 1 -Salinas -saline/1 1 -Salinger -salinity/2 1 -Salisbury/2 1 -Salish/2 1 -saliva/2 1 -salivary -salivate/6 1 -salivation/1 1 -Salk -Sallie/3 -sallow/178 1 -Sallust -salmon/1 1 -salmonella/53 1 -Salome/2 1 -salon/1 1 -Salonika/2 1 -saloon/1 1 -salsa/18 1 -salt/188 1 -SALT/2 1 -salt/11 1 -saltbox/4 1 -saltcellar/1 1 -salter 1 -saltier 1 -saltine/1 1 -saltines 1 -salting 1 -Salton/3 -saltpeter/2 1 -saltshaker/1 1 -saltwater/2 1 -salty/49 1 -salubrious 1 -salubrity 1 -salutary 1 -salutation/1 1 -salutatorian/1 1 -salutatory 1 -salute/28 1 -Salvador/2 1 -Salvadoran/1 1 -Salvadorean/1 1 -Salvadorian/1 1 -salvage/28 1 -salvageable -salvation/2 1 -Salvatore/3 -salve/28 1 -salver/1 1 -salving 1 -salvo/18 1 -Salween/3 -Sally/3 -sally/31 1 -sally's -Salyut/2 1 -Sam -SAM/2 1 -Samantha/3 -Samar/3 -Samara -Samaritan/1 1 -samarium/2 1 -Samarkand/2 1 -samba/23 1 -same/489 1 -samey -samizdat/10 1 -Sammie/3 -Sammy/3 -Samoa/2 1 -Samoan/1 1 -samosa/10 1 -Samoset/3 -samovar/1 1 -Samoyed/2 1 -sampan/1 1 -sample/139 1 -sampler/1 1 -sampling/10 1 -Sampson/3 -Samson -Samsonite/3 -Samsung/3 -Samuel -Samuelson/3 -samurai/1 1 -San -San'a -Sana/2 1 -Sanaa/2 1 -sanatorium/1 1 -Sanchez/3 -Sancho/3 -sanctification/2 1 -sanctify/31 1 -sanctifying 1 -sanctimonious/16 1 -sanctimony/2 1 -sanction/23 1 -sanctity/2 1 -sanctuary/15 1 -sanctum/1 1 -Sand -sand/23 1 -sandal/18 1 -sandalwood/2 1 -sandbag/92 1 -sandbank/1 1 -sandbar/1 1 -sandblast/23 1 -sandblaster/1 1 -sandbox/4 1 -Sandburg -sandcastle/1 1 -sander/1 1 -Sanders -sanders 1 -sandhog/1 1 -sanding 1 -Sandinista 1 -sandlot/490 1 -sandlotter/1 1 -sandman/2 1367 -sandmen 1368 -Sandoval/3 -sandpaper/23 1 -sandpiper/1 1 -sandpit/10 1 -Sandra/3 -sandstone/1 1 -sandstorm/1 1 -sandwich/22 1 -Sandy/3 -sandy/49 1 -sane/27 1 -Sanford/3 -Sanforized -Sang/3 -sang/10 1 -Sanger -sangfroid/2 1 -sangria/2 1 -sang 1369 -sanguinary 1 -sanguine/8 1 -Sanhedrin 1 -sanitarian/1 1 -sanitarium/1 1 -sanitary 1 -sanitation/2 1 -sanitize/6 1 -sanitizer/10 1 -sanity/2 1 -Sanka/3 -Sankara/3 -sank 1370 -sans -sanserif 1 -Sanskrit/2 1 -Santa -Santana/3 -Santayana -Santeria 1 -Santiago/2 1 -Santos -SAP/3 -sap/47 1 -sapience/2 1 -sapient 1 -sapless 1 -sapling/1 1 -sapper/10 1 -sapphire/1 1 -Sappho/2 1 -Sapporo/2 1 -sappy/49 1 -saprophyte/1 1 -saprophytic 1 -sapsucker/1 1 -sapwood/2 1 -Saracen/1 1 -Saragossa/2 1 -Sarah -Sarajevo/2 1 -Saran/3 -saran/2 1 -sarape/1 1 -Sarasota/3 -Sara's 1371 -Sara 1372 -Saratov/2 1 -Sarawak/2 1 -sarcasm/1 1 -sarcastic/39 1 -sarcoma/1 1 -sarcophagi 1373 -sarcophagus/2 1374 -sardine/18 1 -Sardinia/2 1 -sardonic/39 1 -saree/1 1 -Sargasso/3 -sarge/1 1 -Sargent -Sargon/3 -sari/1 1 -sari's 1375 -sari 1376 -sarky 1 -sarnie/10 1 -Sarnoff/3 -sarong/1 1 -Saroyan/3 -SARS/3 -sarsaparilla/1 1 -Sarto -sartorial/8 1 -Sartre -SASE -sash/40 1 -Sasha/3 -sashay/23 1 -Sask -Saskatchewan/2 1 -Saskatoon/2 1 -Sasquatch/4 1 -sass/22 1 -sassafras/4 1 -Sassanian 1 -Sassoon -sassy/34 1 -SAT -Sat/2 1 -Satan/2 1 -satanic/39 1 -satanical -satanism/2 1 -Satanism/2 1 -satanist/1 1 -Satanist/2 1 -satay 1 -satchel/1 1 -sate/6 1 -sateen/2 1 -satellite/28 1 -sates 1377 -satiable 1 -satiate/6 1 -satiation/2 1 -satiety/2 1 -satin/18 1 -satinwood/1 1 -satiny 1 -satire/1 1 -satiric -satirical/8 1 -satirist/1 1 -satirize/6 1 -satisfaction/1 1 -satisfactory/211 1 -satisfiable -satisfy/31 1 -satisfying/8 1 -satori/2 1 -satrap/1 1 -sat 1378 -satsuma/10 1 -saturate/6 1 -saturation/2 1 -Saturday/1 1 -Saturn/2 1 -Saturnalia/2 1 -saturnalia 1 -saturnine -satyr/1 1 -satyriasis/2 1 -satyric 1 -sauce/28 1 -saucepan/1 1 -saucer/1 1 -saucier 1 -saucy/50 1 -Saudi/1 1 -sauerkraut/2 1 -Saul/2 1 -sauna/23 1 -Saunders -Saundra/3 -saunter/23 1 -sauntering 1 -saurian 1 -sauropod/1 1 -sausage/1 1 -Saussure -saute/23 1 -sauterne/130 1 -Sauterne/1 1 -saute 1 -savable 1 -Savage -savage/107 1 -savagery/15 1 -savanna/1 1 -savannah/1 1 -Savannah/2 1 -savant/1 1 -save/28 1 -saveable 1 -saveloy 1 -saver/1 1 -saves 1379 -saving/130 1 -savior/1 1 -Savior/2 1 -Savonarola -savor/23 1 -savory/286 1 -Savoy -savoy/1 1 -Savoyard/2 1 -savvy/87 1 -saw/23 1 -sawbones/2 1 -sawbuck/1 1 -sawdust/2 1 -sawflies -sawfly/3 -sawhorse/1 1 -sawing 1 -sawmill/1 1 -saw 1380 -sawtooth 1 -Sawyer/3 -sawyer/1 1 -sax/4 1 -saxifrage/1 1 -Saxon/1 1 -Saxony/2 1 -saxophone/1 1 -saxophonist/1 1 -say/491 1 -Sayers -saying/1 1 -say 1 -Sb/2 1 -SBA -Sc/2 1 -SC/2 1 -scab/136 1 -scabbard/18 1 -scabby/49 1 -scabies/2 1 -scabrous 1 -scad/1 1 -scaffold/86 1 -scaffolding/2 1 -scag/118 1 -scalability -scalable 1 -scalar/10 1 -scalawag/1 1 -scald/23 1 -scalding 1 -scald 1 -scale/28 1 -scaleless 1 -scalene 1 -scalier 1381 -scaliest 1381 -scaling 1 -scallion/1 1 -scallop/23 1 -scalp/23 1 -scalpel/1 1 -scalper/1 1 -scaly/49 1 -scallywag/10 1 -scam/160 1 -scamp/18 1 -scamper/23 1 -scampi/2 1 -Scan -scan/133 1 -scandal/18 1 -scandalize/6 1 -scandalmonger/1 1 -scandalous/8 1 -Scandinavia/2 1 -Scandinavian/1 1 -scandium/2 1 -scanner/1 1 -scanning 1 -scansion/2 1 -scant/98 1 -scanty/97 1 -scapegoat/23 1 -scapegoating 1 -scapegrace/1 1 -scape 1 -scapula/53 1 -scapular/1 1 -scar/103 1 -scarab/1 1 -Scaramouch -Scarborough -scarce/27 1 -scarcity/15 1 -scare/28 1 -scarecrow/1 1 -scared 1 -scaremonger/1 1 -scaremongering 1 -scarey 1382 -scarf/115 1 -scarfing 1 -scarier 1383 -scariest 1383 -scarification/2 1 -scarify/31 1 -scariness/3 -scarlatina/2 1 -Scarlatti -scarlet/2 1 -scarp/23 1 -scarper/11 1 -scarping 1 -scarring 1 -scary/59 1 -scat/403 1 -scathe/251 1 -scathing/8 1 -scatological -scatology/2 1 -scatter/23 1 -scatterbrain/1 1 -scatterbrained -scattered 1 -scatterer/10 1 -scattering/1 1 -scatty 1 -scavenge/6 1 -scavenger/1 1 -scenario/1 1 -scenarist/1 1 -scene/18 1 -scenery/2 1 -scenic/39 1 -scent/23 1 -scenting 1 -scentless 1 -scepter/62 1 -sceptically -sch -schadenfreude 1 -Scheat/3 -Schedar/3 -schedule/28 1 -scheduler/10 1 -Scheherazade/3 -Schelling -schema/492 1 -schematic/51 1 -schematize/6 1 -scheme/28 1 -schemer/1 1 -scheming 1 -Schenectady/2 1 -scherzo/1 1 -Schiaparelli/3 -Schick/3 -Schiller -schilling/1 1 -Schindler/3 -schism/1 1 -schismatic/1 1 -schist/2 1 -schizo/1 1 -schizoid/1 1 -schizophrenia/2 1 -schizophrenic/1 1 -schizophrenically -schizo 1 -schlemiel/1 1 -schlep/47 1 -schlepp/23 1 -Schlesinger/3 -Schliemann -Schlitz/3 -schlock/2 1 -schlocky/34 1 -schmaltz/2 1 -schmaltzy/34 1 -schmalz/2 1 -Schmidt -schmo/4 1 -schmoe/1 1 -schmooze/43 1 -schmoozer/10 1 -schmuck/1 1 -Schnabel -schnapps/2 1 -schnaps's -Schnauzer/3 -schnauzer/1 1 -Schneider/3 -schnitzel/1 1 -schnook/1 1 -schnoz/4 1 -schnozzle/1 1 -Schoenberg/3 -scholar/1 1 -scholarly 1 -scholarship/1 1 -scholastic/39 1 -scholasticism 1 -scholastic 1 -school/23 1 -schoolbag/1 1 -schoolbook/1 1 -schoolboy/1 1 -schoolchild/155 1 -schooldays -schoolfellow/1 1 -schoolfriend 1 -schoolgirl/1 1 -schoolhouse/1 1 -schooling/2 1 -schoolkid/10 1 -schoolmarm/1 1 -schoolmarmish -schoolmaster/18 1 -schoolmate/1 1 -schoolmistress/4 1 -schoolroom/1 1 -schoolteacher/1 1 -school 1 -schoolwork/2 1 -schoolyard/1 1 -schooner/1 1 -Schopenhauer -Schrieffer/3 -Schrodinger/2 1 -schrod's -Schroeder/3 -schtick 1 -Schubert -Schultz/3 -Schulz/3 -Schumann -Schumpeter/3 -schuss/22 1 -schussboomer/1 1 -Schuyler/3 -Schuylkill/3 -schwa/1 1 -Schwartz/3 -Schwarzenegger/3 -Schwarzkopf/3 -Schweitzer -Schweppes/3 -Schwinger/3 -Schwinn/3 -sci -sciatica/2 1 -sciatic 1 -science/1 1 -scientific/39 1 -scientist/1 1 -Scientology/3 -scimitar/1 1 -scintilla/1 1 -scintillate/6 1 -scintillating 1 -scintillation/1 1 -scintillator/10 1 -scion/1 1 -Scipio/2 1 -scissor/11 1 -scleroses 1384 -sclerosis/2 1385 -sclerotic 1 -scoff/23 1 -scoffer/1 1 -scoffing 1 -scofflaw/1 1 -scold/23 1 -scolder 1 -scolding/1 1 -scoliosis/2 1 -scollop/23 1 -sconce/18 1 -scone/1 1 -scoop/23 1 -scooper 1 -scoopful/1 1 -scooping 1 -scoot/5 1 -scooter/1 1 -scope/28 1 -Scopes/3 -scorbutic 1 -scorch/22 1 -scorcher/1 1 -scorching 1 -score/139 1 -scoreboard/1 1 -scorecard/1 1 -scorekeeper/1 1 -scoreless 1 -scoreline/10 1 -scorer/1 1 -scoring 1 -scorn/23 1 -scorner/1 1 -scornful/8 1 -scorning 1 -Scorpio/1 1 -scorpion/1 1 -Scorpius/2 1 -Scorsese/3 -Scot/1 1 -scotch/4 1 -Scotch/4 1 -scotch/7 1 -Scotchman/2 1386 -Scotchmen 1387 -scotchs -scotch 1 -Scotch 1 -Scotchwoman/2 1388 -Scotchwomen 1389 -Scotland/2 1 -Scotsman/2 1390 -Scotsmen 1391 -Scotswoman/2 1392 -Scotswomen 1393 -Scott -Scottie/1 1 -Scottish/2 1 -Scottsdale -Scotty/60 1 -scoundrel/1 1 -scour/5 1 -scourer/1 1 -scourge/28 1 -scouring 1 -scout/23 1 -scouter/10 1 -scouting/2 1 -scoutmaster/1 1 -Scout 1 -scow/18 1 -scowl/23 1 -scowling 1 -scrabble/1 1 -Scrabble/1 1 -scrabble/6 1 -scrabbler/1 1 -scrag/18 1 -scraggly/34 1 -scraggy/34 1 -scram/114 1 -scramble/28 1 -scrambler/1 1 -scrambling 1 -Scranton -scrap/296 1 -scrapbook/1 1 -scrape/28 1 -scraper/1 1 -scrapheap/1 1 -scrapie 1 -scraping/10 1 -scrapper/1 1 -scrappy/34 1 -scrapyard/1 1 -scratch/22 1 -scratchcard/10 1 -scratchily 1 -scratching/10 1 -scratchpad/10 1 -scratch 1 -scratchy/49 1 -scrawl/23 1 -scrawling 1 -scrawly/34 1 -scrawny/49 1 -scream/23 1 -screamer/1 1 -screaming/8 1 -scree/1 1 -screech/22 1 -screechy/34 1 -screed/70 1 -screen/23 1 -screening/1 1 -screenplay/1 1 -screenwriter/1 1 -screenwriting/2 1 -screw/23 1 -screwball/1 1 -screwdriver/1 1 -screwiness/3 -screwing 1 -screwworm/1 1 -screwy/34 1 -Scriabin -scribal 1 -scribble/28 1 -scribbler/1 1 -scribbling/10 1 -scribe/28 1 -scribing 1 -Scribner/3 -scrim/1 1 -scrimmage/28 1 -scrimp/11 1 -scrimshaw/23 1 -scrip/1 1 -script/23 1 -scriptorium 1 -scriptural 1 -scripture/1 1 -Scripture/1 1 -scriptwriter/1 1 -scriptwriting 1 -scrivener/1 1 -scrod/2 1 -scrofula/2 1 -scrofulous 1 -scrog/117 1 -scroll/23 1 -scrollable -scrooge/18 1 -Scrooge 1 -scrotal 1 -scrota 1394 -scrotum/2 1395 -scrounge/6 1 -scrounger/1 1 -scrounging 1 -scroungy/34 1 -scrub/327 1 -scrubber/1 1 -scrubby/34 1 -scruff/1 1 -scruffily 1 -scruffiness/3 -scruffy/34 1 -Scruggs/3 -scrum/217 1 -scrumhalf -scrumhalves -scrummage/357 1 -scrump/11 1 -scrumptious/8 1 -scrumpy 1 -scrunch/22 1 -scrunchie/1 1 -scrunchy/15 1 -scruple/28 1 -scrupulosity/2 1 -scrupulous/16 1 -scrutineer/10 1 -scrutinize/6 1 -scrutiny/15 1 -scuba/23 1 -Scud -scud/113 1 -scuff/23 1 -scuffle/28 1 -scuffling 1 -scull/23 1 -sculler/1 1 -scullery/15 1 -Sculley/3 -sculling 1 -scullion/1 1 -sculpt/11 1 -sculptor/1 1 -sculptress/4 1 -sculptural -sculpture/28 1 -sculpturing 1 -scum/160 1 -scumbag/1 1 -scumming 1 -scummy/34 1 -scupper/23 1 -scurf/2 1 -scurfy/34 1 -scurrility/2 1 -scurrilous/16 1 -scurry/56 1 -scurryings -scurvy/493 1 -scutcheon/1 1 -scuttle/28 1 -scuttlebutt/2 1 -scuzzy/34 1 -Scylla/2 1 -scythe/28 1 -Scythia -Scythian 1 -SCSI/2 1 -SD -SDI -Se/2 1 -SE/2 1 -sea/1 1 -seabed/1 1 -seabird/1 1 -seaboard/1 1 -Seaborg -seaborne 1 -seacoast/1 1 -seafarer/1 1 -seafaring/2 1 -seafloor/1 1 -seafood/2 1 -seafront/1 1 -seagoing 1 -Seagram/3 -seagull/1 1 -seahorse/1 1 -seal/23 1 -sealant/1 1 -sealer/1 1 -sealing 1 -sealskin/2 1 -seam/23 1 -seamail -seaman/2 1396 -seamanship/2 1 -seamen 1397 -seamless/8 1 -seamstress/4 1 -seamy/34 1 -Sean/3 -seance/1 1 -seaplane/18 1 -seaport/1 1 -sear/23 1 -search/22 1 -searcher/1 1 -searching/8 1 -searchlight/1 1 -searingly -searing 1 -Sears/3 -sear 1 -seascape/1 1 -seashell/1 1 -seashore/1 1 -seasick/33 1 -seaside/1 1 -season/23 1 -seasonable/19 1 -seasonal/8 1 -seasonality 1 -seasoned 1 -seasoning/1 1 -seat/23 1 -seating/2 1 -seatmate/1 1 -SEATO -sea 1 -Seattle/2 1 -seawall/1 1 -seaward/1 1 -seawater/2 1 -seaway/1 1 -seaweed/1 1 -seaworthy/49 1 -sebaceous -Sebastian/3 -seborrhea/2 1 -sebum 1 -Sec -SEC -sec/1 1 -secant/1 1 -secateurs -secede/6 1 -secession/1 1 -secessionist/1 1 -seclude/6 1 -secluded 1 -seclusion/2 1 -seclusive 1 -Seconal/2 1 -second/459 1 -secondary/206 1 -seconder/1 1 -secondhand -secondment/10 1 -secrecy/2 1 -secret/494 1 -secretarial -Secretariat/3 -secretariat/1 1 -secretary/15 1 -secretaryship/2 1 -Secretary 1 -secrete/257 1 -secreter 1 -secretion/1 1 -secretive/16 1 -secretory -sect/1 1 -sectarian/1 1 -sectarianism/2 1 -sectarian 1 -sectary/15 1 -section/23 1 -sectional/1 1 -sectionalism/2 1 -sectional 1 -sector/62 1 -sectoral -sec 1 -secularism/2 1 -secularist/1 1 -secularization/2 1 -secularize/6 1 -secular 1 -secure/404 1 -securer 1 -security/15 1 -secy -sec'y -sedan/1 1 -sedate/104 1 -sedation/2 1 -sedative/1 1 -sedentary 1 -Seder/1 1 -sedge/1 1 -sedgy/34 1 -sediment/18 1 -sedimentary 1 -sedimentation/2 1 -sedition/2 1 -seditious 1 -Sedna/3 -seduce/6 1 -seducer/1 1 -seducing 1 -seduction/1 1 -seductive/16 1 -seductress/4 1 -sedulous/8 1 -see/495 1398 -Seebeck/3 -seed/78 1 -seedbed/1 1 -seedcase/1 1 -seeder/1 1 -seeding 1 -seedless 1 -seedling/1 1 -seedpod/1 1 -seedy/49 1 -seeing/10 1 -seek/141 1399 -seeker/1 1 -seem/11 1 -seeming/8 1 -seemly/49 1 -seep/5 1 -seepage/2 1 -seer/1 1 -seersucker/2 1 -seesaw/23 1 -seethe/43 1400 -seething 1 -Sega/3 -segfault/10 1 -segment/23 1 -segmental 1 -segmentation/2 1 -Segovia/3 -Segre/3 -segregate/6 1 -segregated 1 -segregation/2 1 -segregationist/1 1 -segue/63 1 -Segundo/3 -seigneur/1 1 -seignior/1 1 -seigniorial -Seiko/3 -seine/1 1 -Seine/2 1 -seine/6 1 -seiner/1 1 -Seinfeld/3 -seining 1 -seismically -seismic 1 -seismogram 1 -seismograph/1 1 -seismographer/1 1 -seismographic -seismography/2 1 -seismologic -seismological 1 -seismologist/1 1 -seismology/2 1 -seismometer/10 1 -seize/6 1 -seizing 1 -seizure/1 1 -Sejong/3 -Selassie/3 -seldom 1 -select/496 1 -selectable -selection/1 1 -selective/8 1 -selectivity/2 1 -selectman/2 1401 -selectmen 1402 -selector/1 1 -Selectric/3 -Selena/3 -selenium/2 1 -selenographer/1 1 -selenography/2 1 -selenology 1 -Seleucid 1 -Seleucus/2 1 -self/120 1 -selfish/16 1 -selfless/16 1 -selfsame 1 -self 1 -Selim/3 -Seljuk 1 -Selkirk/3 -sell/86 1403 -seller/1 1 -Sellers/3 -selling 1 -sellotape -sellotaped -sellotapes -sellotaping -sellout/1 1 -Selma/2 1 -seltzer/1 1 -selvage/18 1 -selvedge/18 1 -Selznick/3 -semantic/35 1 -semanticist/1 1 -semaphore/28 1 -Semarang -semblance/1 1 -semen/2 1 -semester/1 1 -semi/1 1 -semiannual/8 1 -semiarid -semiautomatic/1 1 -semibreve/10 1 -semicircle/1 1 -semicircular 1 -semicolon/1 1 -semiconducting -semiconductor/1 1 -semiconscious 1 -semidarkness/3 -semidetached -semifinal/1 1 -semifinalist/1 1 -semigloss/89 1 -semimonthlies -semimonthly/3 -seminal -seminar/1 1 -seminarian/1 1 -seminary/15 1 -Seminole/1 1 -semiofficial 1 -semiotic/32 1 -semioticians -semipermeable -semiprecious -semiprivate -semipro/10 1 -semiprofessional/1 1 -semiquaver/10 1 -Semiramis -semiretired -semiskilled -semisolid 1 -semis 1 -semisweet -Semite/1 1 -Semitic/1 1 -semitone/1 1 -semitrailer/1 1 -semitransparent 1 -semitropical 1 -semi 1 -semivowel/1 1 -semiweeklies -semiweekly/3 -semiyearly -semolina/2 1 -sempiternal -sempstress/4 1 -Semtex -Sen -sen/10 1 -senate/1 1 -Senate/1 1 -Senator -senator/1 1 -senatorial 1 -send/497 1 -Sendai -sender/1 1 -sending 1 -sendoff/1 1 -Seneca/1 1 -Senegal/2 1 -Senegalese/2 1 -senescence/2 1 -senescent -Senghor -senile 1 -senility/2 1 -senior/1 1 -seniority/2 1 -senior 1 -Senior 1 -senna/2 1 -Sennacherib -Sennett/3 -senor/1 1 -senora/1 1 -senorita/1 1 -sens/156 1 -sensation/1 1 -sensational/8 1 -sensationalism/2 1 -sensationalist/1 1 -sensationalistic -sensationalize/6 1 -sense/28 1 -senseless/16 1 -sensibility/15 1 -sensible/289 1 -sensing 1 -sensitive/36 1 -sensitivity/15 1 -sensitization/2 1 -sensitize/6 1 -sensitizers -sensor/1 1 -sensory 1 -sensual/8 1 -sensualist/1 1 -sensuality/2 1 -sensuous/16 1 -Sensurround/3 -sentence/28 1 -sentencing 1 -sentential 1 -sententious/8 1 -sentience/2 1 -sentient 1 -sentiment/1 1 -sentimental/8 1 -sentimentalism/2 1 -sentimentalist/1 1 -sentimentality/2 1 -sentimentalization/2 1 -sentimentalize/6 1 -sentinel/18 1 -sentry/15 1 -Seoul/2 1 -sepal/1 1 -separability/2 1 -separable/19 1 -separate/207 1 -separation/1 1 -separatism/2 1 -separatist/1 1 -separative 1 -separator/1 1 -Sephardi -sepia/2 1 -sepia's 1404 -sepia 1405 -Sepoy/3 -sepsis/2 1 -Sept/2 1 -septa 1406 -September/1 1 -septet/1 1 -septette/1 1 -septicemia/2 1 -septicemic -septic 1 -septuagenarian/1 1 -Septuagint/1 1 -septum/2 1407 -sepulcher/23 1 -sepulchral 1 -seq -sequel/1 1 -sequence/28 1 -sequencer/10 1 -sequencing/2 1 -sequential/8 1 -sequent 1 -sequester/11 1 -sequestrate/6 1 -sequestration/1 1 -sequin/62 1 -sequoia/1 1 -Sequoya -seraglio/1 1 -serape/1 1 -seraph/498 1 -seraphic -seraphically -Serb/1 1 -Serbia/2 1 -Serbian/1 1 -sere/150 1 -Serena/3 -serenade/28 1 -serenader 1 -serendipitous -serendipitously -serendipity/2 1 -serene/27 1 -Serengeti/3 -serenity/2 1 -sere 1 -serf/123 1 -serfdom/2 1 -serge/2 1 -sergeant/1 1 -Sergei/3 -serge 1 -Sergio/3 -serial/30 1 -serialization/1 1 -serialize/6 1 -series/2 1 -serif/1 1 -serifed -serigraph/1 1 -serious/16 1 -sermon/18 1 -sermonize/6 1 -serology/2 1 -serotonin 1 -serous 1 -Serpens -serpent/18 1 -serpentine/2 1 -Serra/3 -Serrano/3 -serrate/214 1 -serration/1 1 -serried 1 -serum/1 1 -servant/18 1 -serve/28 1 -server/1 1 -servery/60 1 -service/28 1 -serviceability/2 1 -serviceable 1 -serviceman/2 1408 -servicemen 1409 -service 1 -servicewoman/2 1410 -servicewomen 1411 -serviette/1 1 -servile/8 1 -servility/2 1 -serving/1 1 -servitor/1 1 -servitude/2 1 -servo/18 1 -servomechanism/1 1 -servomotor/1 1 -servo 1 -sesame/1 1 -sesquicentennial/1 1 -sessile 1 -session/1 1 -set/1 1 -Set/2 1 -set/88 1 -setback/1 1 -Seth/2 1 -Seton -setscrew/1 1 -setsquare -setsquares -sett/141 1 -settable -settee/1 1 -setter/1 1 -setting/1 1 -settle/28 1 -settled 1 -settlement/1 1 -settler/1 1 -settling 1 -setup/1 1 -Seurat -Seuss -Sevastopol/2 1 -seven/1 1 -sevenfold -sevenpence 1 -seventeen/1 1 -seventeenth/1 1 -seventh/1 1 -seventieth/1 1 -seven 1 -seventy/15 1 -sever/11 1 -several/37 1 -severance/1 1 -severe/27 1 -severity/2 1 -Severn -sever 1 -Severus -Seville/2 1 -Sevres -sew/126 1 -sewage/2 1 -Seward -sewer/18 1 -sewerage/2 1 -sewing/2 1 -sex/22 1 -sexagenarian/1 1 -sexism/2 1 -sexist/1 1 -sexless 1 -sexologist/1 1 -sexology/2 1 -sexpot/1 1 -Sextans -sextant/1 1 -sextet/1 1 -sextette/1 1 -Sexton/3 -sexton/1 1 -sextuplet/1 1 -sexual/8 1 -sexuality/15 1 -sexy/50 1 -Seychelles/2 1 -Seyfert 1 -Seymour/2 1 -sf -SF -SGML/2 1 -Sgt -sh -shabby/50 1 -shack/23 1 -shackle/28 1 -Shackleton -shackling 1 -shad/18 1 -shade/28 1 -shadeless 1 -shading/1 1 -shadow/23 1 -shadowbox/7 1 -shadowboxing 1 -shadowing 1 -shadowless 1 -shadow 1 -shadowy/34 1 -shady/50 1 -Shaffer/3 -shaft/23 1 -shafting 1 -shag/92 1 -shaggy/49 1 -shah/1 1 -shaikh/10 1 -Shaka/3 -shakable 1 -shake/263 1412 -shakeable 1 -shakedown/1 1 -shakeout/1 1 -shaker/1 1 -Shaker 1 -Shakespeare/2 1 -Shakespearean 1 -shakeup/1 1 -shaking 1 -shaky/50 1 -shale/2 1 -shall/499 1413 -shallot/1 1 -shallow/455 1 -shalom 1 -sham/160 1 -shaman/1 1 -shamanic -shamanism 1 -shamanistic -shamble/232 1 -shambling 1 -shambolic -shame/28 1 -shamefaced/8 1 -shameful/16 1 -shameless/16 1 -shammy/167 1 -shampoo/23 1 -shampooer/1 1 -shamrock/1 1 -sham 1 -Shana/3 -shandy/60 1 -Shane/3 -Shanghai/2 1 -shanghai/11 1 -shank/18 1 -Shankara/3 -Shanna/3 -Shannon -shan't -shantung/2 1 -Shantung 1 -shanty/167 1 -shantytown/1 1 -shape/28 1 -shapeless/16 1 -shapely/49 1 -shaping 1 -Shapiro/3 -sharable -shard/1 1 -share/28 1 -shareable -sharecrop/105 1 -sharecropper/1 1 -shareholder/1 1 -shareholding/10 1 -sharer/1 1 -shareware/1 1 -Shari -Shari'a -sharia/2 1 -shariah -Sharif/3 -sharing 1 -shark/23 1 -sharking 1 -sharkskin/2 1 -Sharlene/3 -Sharon -Sharp/3 -sharp/52 1 -Sharpe/3 -sharpen/11 1 -sharpener/1 1 -sharper/1 1 -sharpie/1 1 -sharping 1 -sharpish -sharpshooter/1 1 -sharpshooting/2 1 -sharpy/15 1 -Sharron/3 -Shasta/2 1 -shat 1414 -shatter/23 1 -shattering/8 1 -shatterproof -Shaula/3 -Shaun/3 -Shauna/3 -shave/500 1 -shaven 1 -shaver/1 1 -Shavian/2 1 -shaving/1 1 -Shavuot/2 1 -Shaw/2 1 -shawl/18 1 -Shawn/3 -Shawna/3 -Shawnee/1 1 -shay/1 1 -Shcharansky/3 -she/1 1 -Shea/3 -sheaf/120 1 -shear/23 1 -shearer/1 1 -shearing 1 -sheath/23 1 -sheathe/6 1 -sheathing/1 1 -sheave/18 1 -Sheba -shebang/1 1 -shebeen/70 1 -Shebeli/3 -she'd -shed/440 1 -shedding 1 -sheen/2 1 -Sheena/3 -sheenier 1415 -sheeniest 1415 -sheen 1 -sheeny/34 1 -sheep/2 1 -sheepdog/1 1 -sheepfold/1 1 -sheepherder/1 1 -sheepish/16 1 -sheepskin/1 1 -sheer/179 1 -sheerness/3 -sheet/23 1 -sheeting/2 1 -sheetlike 1 -Sheetrock/2 1 -Sheffield/2 1 -sheik/1 1 -sheikdom/1 1 -sheikhdom/1 1 -Sheila/3 -sheila/10 1 -shekel/1 1 -Shelby/3 -Sheldon/3 -shelf/120 1 -Shelia/3 -she'll -Shell/3 -shell/78 1 -shellac/64 1 -shellack/23 1 -shellacking/1 1 -sheller 1 -Shelley -shellfire/2 1 -shellfish/4 1 -shelling 1 -shelter/23 1 -sheltering 1 -Shelton/3 -shelve/6 1 -shelving/2 1 -Shelly/3 -Shenandoah -shenanigan/1 1 -Shenyang/2 1 -Sheol -Shepard/2 1 -Shepherd/3 -shepherd/23 1 -shepherdess/4 1 -Sheppard/3 -Sheratan/3 -Sheraton/2 1 -sherbert/1 1 -sherbet/1 1 -sherd/1 1 -Sheree/3 -Sheri/3 -Sheridan -sheriff/1 1 -Sherlock 1 -Sherman -Sherpa 1 -Sherri/3 -Sherrie/3 -Sherry/3 -sherry/15 1 -Sherwood -Sheryl/3 -Shetland/1 1 -Shevardnadze/3 -Shevat/2 1 -shew/126 1 -shh -shiatsu/2 1 -shibboleth/1 1 -shield/23 1 -Shields/3 -shier 1 -shift/23 1 -shifter/10 1 -shifting 1 -shiftless/33 1 -shiftlessly 1 -shiftless 1 -shifty/50 1 -Shi'ite -Shiite/1 1 -Shijiazhuang -Shikoku/2 1 -shill/23 1 -shillalah/1 1 -shillelagh/1 1 -shilling/1 1 -Shillong -Shiloh/2 1 -shim/160 1 -shimmer/23 1 -shimmering 1 -shimmery 1 -shimmy/56 1 -shin/133 1 -shinbone/1 1 -shindig/1 1 -shine/28 1416 -shiner/1 1 -shingle/28 1 -shingling 1 -shinguard/2 1 -shining 1 -shinsplints/2 1 -Shinto/1 1 -Shintoism/1 1 -Shintoist/1 1 -Shinto 1 -shiny/49 1 -shinny/362 1 -ship/47 1 -shipboard/1 1 -shipborne -shipbuilder/1 1 -shipbuilding/2 1 -shipload/1 1 -shipmate/1 1 -shipment/1 1 -shipowner/1 1 -shippable -shipper/1 1 -shipping/2 1 -shipshape 1 -shipwreck/23 1 -shipwright/1 1 -shipyard/1 1 -Shiraz/2 1 -shire/1 1 -shirk/5 1 -shirker/1 1 -Shirley/3 -shirr/23 1 -shirring/1 1 -shirt/23 1 -shirtfront/1 1 -shirting/2 1 -shirtless 1 -shirtsleeve/1 1 -shirttail/1 1 -shirtwaist/1 1 -shirty 1 -shit/501 1417 -shite/189 1 -shitfaced/309 -shithead/189 1 -shitload/309 1 -shitted/309 -shitty/502 1 -shiv/18 1 -Shiva/2 1 -shiver/23 1 -shiveringly -shivering 1 -shivery 1 -shlemiel/1 1 -shlep/47 1 -shlepp/23 1 -shlock/2 1 -shmaltz/2 1 -shoal/23 1 -shoaling 1 -shoal 1 -shoat/1 1 -shock/78 1 -shocker/1 1 -shocking/8 1 -Shockley/3 -shockproof 1 -shoddy/363 1 -shoe/503 1 -shoebox 1 -shoehorn/23 1 -shoeing 1 -shoelace/1 1 -shoeless 1 -shoemaker/1 1 -shoeshine/1 1 -shoestring/1 1 -shoetree/1 1 -shogun/1 1 -shogunate/2 1 -shone 1418 -shoo/11 1 -shook 1419 -shoot/86 1420 -shooter/1 1 -shooting/1 1 -shootout/1 1 -shop/47 1 -shopaholic/10 1 -shopfitter -shopfitters -shopfitting -shopfront/10 1 -shopkeeper/1 1 -shopkeeping 1 -shoplift/11 1 -shoplifter/1 1 -shoplifting/2 1 -shoppe/28 1 -shopper/1 1 -shopping/2 1 -shoptalk/2 1 -shopworn 1 -shore/28 1 -shorebird/1 1 -shoreline/1 1 -shore 1 -shoreward 1 -shoring/2 1 -Short/3 -short/52 1 -shortage/1 1 -shortbread/2 1 -shortcake/1 1 -shortchange/6 1 -shortcoming/1 1 -shortcrust -shortcut/18 1 -shorten/11 1 -shortening/1 1 -shortfall/1 1 -shorthand/1 1 -shorthanded -shorthand 1 -shorthorn/1 1 -Shorthorn 1 -shortie/1 1 -shortish 1 -shortlist/11 1 -shortsighted/16 1 -shortstop/1 1 -shortwave/18 1 -shorty/15 1 -Shoshone/1 1 -Shoshones 1421 -Shoshoni/1 1 -Shoshonis 1422 -Shostakovitch/3 -shot/18 1 -shotgun/133 1 -shot 1423 -should/44 1 -shoulder/23 1 -shouldering 1 -shouldn't -should 1424 -shout/23 1 -shouter/1 1 -shouting 1 -shove/28 1 -shovel/23 1 -shoveler 1 -shovelful/1 1 -shoveling 1 -show/504 1 -showbiz/2 1 -showboat/23 1 -showcase/28 1 -showdown/1 1 -shower/23 1 -showering 1 -showerproof -showery/34 1 -showgirl/1 1 -showground/10 1 -showing/1 1 -showjumping 1 -showman/2 1425 -showmanship/2 1 -showmen 1426 -showoff/1 1 -showpiece/1 1 -showplace/1 1 -showroom/1 1 -showstopper/1 1 -showstopping -showtime 1 -showy/50 1 -shpt -shrank 1427 -shrapnel/2 1 -shred/113 1 -shredder/1 1 -shredding 1 -Shrek/3 -Shreveport -shrew/18 1 -shrewd/21 1 -shrewish 1 -shriek/23 1 -shrieker/10 1 -shrieking 1 -shrift/2 1 -shrike/1 1 -shrill/266 1 -shrilling 1 -shrilly 1 -shrimp/23 1 -shrimper/10 1 -shrimping 1 -shrine/18 1 -Shriner 1 -shrink/86 1428 -shrinkable 1 -shrinkage/2 1 -shrinkingly -shrive/376 1 -shrivel/11 1 -shriveling 1 -Shropshire 1 -shroud/23 1 -shrouding 1 -shrub/18 1 -shrubbery/15 1 -shrubby/34 1 -shrug/92 1 -shrunken 1427 -shrunk 1427 -shtick/1 1 -shuck/23 1 -shucking 1 -shucks/89 1 -shudder/23 1 -shuddering 1 -shuffle/28 1 -shuffleboard/1 1 -shuffler/1 1 -shuffling 1 -Shula/3 -shun/192 1 -shunt/23 1 -shunting 1 -shush/7 1 -shut/505 1 -shutdown/1 1 -shuteye/2 1 -shutoff/1 1 -shutout/1 1 -shutter/23 1 -shutterbug/1 1 -shuttle/28 1 -shuttlecock/23 1 -shy/506 1 -shyer 1 -Shylockian/3 -Shylock 1 -shyster/1 1 -Siam/2 1 -Siamese/2 1 -Sian/2 1 -Sibelius -Siberia/2 1 -Siberian/1 1 -sibilance 1 -sibilancy 1 -sibilant/1 1 -sibling/1 1 -sibyl/1 1 -sibylline 1 -Sibyl 1 -sic/332 1 -Sicilian/1 1 -Sicily/2 1 -sick/507 1 -sickbay/10 1 -sickbed/1 1 -sicken/11 1 -sickening/8 1 -sickie/1 1 -sickish 1 -sickle/18 1 -sickly 1 -sicko/1 1 -sickout/1 1 -sickroom/1 1 -sic 1 -Sid/3 -Siddhartha/2 1 -side/28 1 -sidearm/1 1 -sideband/10 1 -sidebar/1 1 -sideboard/1 1 -sideburns -sideburns's -sidecar/1 1 -sidekick/1 1 -sidelight/1 1 -sideline/28 1 -sidelong -sideman/2 1429 -sidemen 1430 -sidepiece/1 1 -sidereal 1 -sidesaddle/1 1 -sideshow/1 1 -sidesplitting 1 -sidestep/47 1 -sidestroke/28 1 -sideswipe/28 1 -sidetrack/23 1 -side 1 -sidewalk/1 1 -sidewall/1 1 -sidewards -sideways -sidewinder/1 1 -sidewise -siding/1 1 -sidle/28 1 -Sidney -SIDS/2 1 -siege/18 1 -Siegfried -Siemens -sienna/2 1 -Sierpinski/3 -sierra/1 1 -Sierras -siesta/1 1 -sieve/28 1 -sift/11 1 -sifter/1 1 -sifting 1 -sigh/23 1 -sight/23 1 -sighted/153 1 -sighting/1 1 -sightless/8 1 -sightly/34 1 -sightread 1 -sightseeing/2 1 -sightseer/1 1 -Sigismund -sigma/1 1 -sigmoid 1 -Sigmund -sign/78 1 -signage/2 1 -signal/459 1 -signaler/1 1 -signalization/2 1 -signalize/6 1 -signalman/2 1431 -signalmen 1432 -signatory/15 1 -signature/1 1 -signboard/1 1 -signer/1 1 -signet/18 1 -significance/1 1 -significant/8 1 -signification/1 1 -signified 1 -signifier 1 -signify/31 1 -signifying 1 -signing/1 1 -signor/508 1 -signora/509 1 -signore/510 1 -signorina/509 1 -signori 1 -signpost/23 1 -Sigurd -Sihanouk/3 -Sikh/1 1 -Sikhism 1 -Sikkim -Sikkimese -Sikorsky -silage/2 1 -Silas/3 -silence/28 1 -silencer/1 1 -silent/183 1 -Silesia/2 1 -silhouette/28 1 -silica/2 1 -silica's 1433 -silica 1434 -silicate/1 1 -siliceous -silicious -silicon/1 1435 -silicone/2 1 -silicosis/2 1 -silk/18 1 -silken 1 -silkscreen/18 1 -silk 1 -silkworm/1 1 -silky/50 1 -sill/1 1 -sillies -silo/18 1 -silt/23 1 -siltstone 1 -silty/34 1 -Silurian/1 1 -Silva/3 -silvan 1 -silver/23 1 -silverfish/4 1 -silvering 1 -silversmith/1 1 -silver 1 -silverware/2 1 -silvery/34 1 -Silvia/2 1 -silly/49 1 -silly's -Simenon/3 -simian/1 1 -similar/8 1 -similarity/15 1 -simile/1 1 -similitude/2 1 -Simmental 1 -simmer/23 1 -Simmons/3 -Simon -Simone/3 -simonize/6 1 -simony/2 1 -simpatico -simper/23 1 -simperingly -simple/289 1 -simpleminded -simpler 1 -simpleton/1 1 -simple 1 -simplex/89 1 -simplicity/15 1 -simplification/1 1 -simplifier 1 -simplify/31 1 -simplistic/39 1 -Simpson/1 1 -Sims -simulacra 1436 -simulacrum/10 1437 -simulate/6 1 -simulation/1 1 -simulator/1 1 -simulcast/23 1 -simultaneity/2 1 -simultaneous/8 1 -sin/133 1 -Sinai/2 1 -Sinatra -sincere/45 1 -sincerity/2 1 -since 1 -Sinclair -Sindbad/3 -Sindhi/2 1 -sine/1 1 -sinecure/1 1 -sinecurist 1 -sinew/18 1 -sinewy 1 -sinful/16 1 -sing/86 1438 -singable 1 -singalong/10 1 -Singapore/2 1 -Singaporean/1 1 -singe/270 1 -Singer -singer/1 1 -Singh/3 -singing/2 1 -single/511 1 -singlet/10 1 -Singleton/3 -singleton/1 1 -singletree/1 1 -singling 1 -singsong/23 1 -singular/30 1 -singularity/15 1 -singularization 1 -Sinhalese/2 1 -sinister/8 1 -sinistral 1 -sink/86 1439 -sinkable 1 -sinker/1 1 -sinkhole/1 1 -Sinkiang/3 -sinking 1 -sinless 1 -sinner/1 1 -sinning 1 -sinology 1 -sinuosity/2 1 -sinuous/8 1 -sinus/4 1 -sinusitis/2 1 -sinusoidal/8 1 -sinusoid 1 -Sioux/2 1 -sip/47 1 -siphon/23 1 -sipper/1 1 -sir/1 1 -Sir/1 1 -sir/58 1 -sire/28 1 -siree/2 1 -siren/1 1 -sires 1440 -Sirius/2 1 -sirloin/1 1 -sirocco/1 1 -sirrah 1 -sirree/2 1 -sirup/18 1 -sis/4 1 -sisal/2 1 -sissified -sissy/42 1 -sister/30 1 -Sister/1 1 -sister/58 1 -sisterhood/1 1 -sisterly/140 1 -Sistine -Si 1441 -Sisyphean -Sisyphus/2 1 -sit/88 1442 -sitar/1 1 -sitarist/1 1 -sitcom/1 1 -site/28 1 -sitings -sitter/1 1 -sitting/1 1 -situate/6 1 -situation/1 1 -situational 1 -situationist -situp/1 1 -Siva/2 1 -Sivan/2 1 -six/4 1 -sixfold 1 -sixpence/1 1 -sixpenny 1 -sixshooter/2 1 -sixteen/1 1 -sixteenth/1 1 -sixteen 1 -sixth/30 1 -sixtieth/1 1 -six 1 -sixty/15 1 -sizable 1 -size/139 1 -sizer 1 -sizing/2 1 -sizzle/28 1 -sizzler/10 1 -sizzling 1 -SJ -Sjaelland/2 1 -SK -ska/2 1 -skate/28 1 -skateboard/23 1 -skateboarder/1 1 -skateboarding/2 1 -skater/1 1 -skating/2 1 -skedaddle/28 1 -skeet/2 1 -skeeter/10 1 -skein/18 1 -skeletal -skeleton/1 1 -skeptic/1 1 -skeptical/8 1 -skepticism/2 1 -skeptic 1 -skerries -sketch/22 1 -sketchbook/10 1 -sketcher/1 1 -sketchpad/10 1 -sketchy/50 1 -skew/512 1 -skewbald/10 1 -skewer/23 1 -ski/272 1 -skibob/10 1 -skid/113 1 -skidpan/10 1 -skier/1 1 -skiff/18 1 -skiffle 1 -skiing/2 1 -skilful/8 1 -skill/62 1 -skillet/1 1 -skillful/16 1 -skim/335 1 -skimmer/1 1 -skimming 1 -skimp/11 1 -skimpy/50 1 -skin/513 1 -skincare/2 1 -skinflick/1 1 -skinflint/1 1 -skinful 1 -skinhead/1 1 -skinless 1 -Skinner/2 1 -skinner/10 1 -skintight 1 -skint 1 -skinny/111 1 -skip/47 1 -skipper/23 1 -Skippy/3 -skirmish/22 1 -skirmisher/10 1 -skirmishing 1 -skirt/23 1 -skirting 1 -skit/18 1 -skitter/11 1 -skittish/16 1 -skittle/70 1 -skive/6 1 -skiver/58 1 -skiving 1 -skivvy/56 1 -skoal/18 1 -Skopje -skua/10 1 -skulduggery/2 1 -skulk/5 1 -skulker/1 1 -skulking 1 -skull/1 1 -skullcap/1 1 -skullduggery/2 1 -skunk/23 1 -sky/56 1 -skycap/1 1 -skydive/6 1 -skydiver/1 1 -skydiving/2 1 -Skye -skyjack/11 1 -skyjacker/1 1 -skyjacking/1 1 -Skylab/2 1 -skylark/23 1 -skylight/1 1 -skyline/18 1 -Skype/3 -skyrocket/23 1 -skyscraper/1 1 -skyward/10 1 -skywriter/1 1 -skywriting/2 1 -slab/136 1 -slabbing 1 -slack/514 1 -slacken/11 1 -slackening 1 -slacker/1 1 -Slackware/3 -slag/92 1 -slagheap/10 1 -slain -slake/6 1 -slalom/23 1 -slam/160 1 -slammer/1 1 -slamming 1 -slander/23 1 -slanderer/1 1 -slanderous 1 -slang/334 1 -slanging 1 -slangy/34 1 -slant/23 1 -slanting/8 1 -slant 1 -slantwise 1 -slap/296 1 -slapdash 1 -slaphappy/34 1 -slapper/10 1 -slapstick/2 1 -slash/22 1 -Slashdot/3 -slasher/1 1 -slashing 1 -slat/515 1 -slate/28 1 -Slater/3 -slather/11 1 -slating 1 -slattern/1 1 -slatternly 1 -slaughter/23 1 -slaughterer/1 1 -slaughterhouse/1 1 -slaughterings -Slav/1 1 -slave/139 1 -slaveholder/1 1 -slaver/23 1 -slavery/2 1 -Slavic/2 1 -slavish/16 1 -Slavonic/2 1 -Slav 1 -slaw/2 1 -slay/121 1443 -slayed -slayer/1 1 -slaying/1 1 -sleaze/1 1 -sleazebag/10 1 -sleazeball/10 1 -sleazy/50 1 -sled/113 1 -sledder/1 1 -sledding 1 -sledge/28 1 -sledgehammer/23 1 -sledging 1 -sleek/98 1 -sleeker 1 -sleeking 1 -sleep/86 1444 -sleeper/1 1 -sleeping 1 -sleepless/16 1 -sleepover/1 1 -sleepwalk/11 1 -sleepwalker/1 1 -sleepwalking/2 1 -sleepwear/2 1 -sleepy/50 1 -sleepyhead/1 1 -sleet/23 1 -sleety/34 1 -sleeve/77 1 -sleeveless 1 -sleigh/23 1 -sleighing 1 -sleight/1 1 -slender/21 1 -slenderize/6 1 -slept 1445 -sleuth/86 1 -slew/23 1446 -slice/28 1 -slicer/1 1 -slicing 1 -slick/52 1 -slicker/1 1 -slicking 1 -slide/377 1 -slider/1 1 -sliding 1 -slid 1 -slier 1447 -sliest 1447 -slight/52 1 -slighter 1 -slighting/8 1 -slily -slim/516 1 -slime/18 1 -slimline -slimmer/10 1 -slimming/2 1 -slimy/49 1 -sling/86 1448 -slingback/10 1 -slingshot/1 1 -slink/141 1449 -Slinky/3 -slinky/34 1 -slip/47 1 -slipcase/1 1 -slipcover/18 1 -slipknot/1 1 -slippage/1 1 -slipper/18 1 -slippery/49 1 -slipping 1 -slippy 1 -slipshod 1 -slipstream/18 1 -slipway/1 1 -slit/403 1 -slither/23 1 -slithery 1 -slitted 1 -slitter 1 -sliver/23 1 -Sloan -Sloane/2 1 -slob/1 1 -slobbed -slobber/23 1 -slobbery 1 -slobbing -Slocum/3 -sloe/1 1 -slog/92 1 -slogan/1 1 -sloganeering -sloop/1 1 -slop/218 1 -slope/28 1 -sloping 1 -sloppy/50 1 -slosh/156 1 -slot/109 1 -sloth/18 1 -slothful/16 1 -slouch/22 1 -sloucher/1 1 -slouching 1 -slouchy/34 1 -slough/23 1 -Slovak/1 1 -Slovakia -Slovakian 1 -sloven/1 1 -Slovene/1 1 -Slovenia/2 1 -Slovenian/1 1 -slovenly/49 1 -slow/98 1 -slowcoach/89 1 -slowdown/1 1 -slowing 1 -slowish -slowpoke/1 1 -SLR -sludge/2 1 -sludgy/34 1 -slue/28 1 -slug/92 1 -sluggard/1 1 -slugger/1 1 -sluggish/16 1 -sluice/28 1 -slum/335 1 -slumber/23 1 -slumbering 1 -slumberous 1 -slumbrous 1 -slumlord/1 1 -slummer 1 -slumming 1 -slummy/34 1 -slump/23 1 -slung 1450 -slunk 1451 -slur/103 1 -slurp/23 1 -Slurpee/3 -slurry/2 1 -slush/2 1 -slushy/49 1 -slut/1 1 -sluttish 1 -slutty/34 1 -sly/517 1 -slyly -Sm/2 1 -smack/78 1 -smacker/1 1 -smacking 1 -Small/3 -small/518 1 -smallholder/10 1 -smallholding/10 1 -smallish 1 -smallpox/2 1 -smalltalk -smarmy/34 1 -smart/514 1 -smarten/11 1 -smarting 1 -smarty/15 1 -smartypants/2 1 -smash/147 1 -smasher/1 1 -smashing 1 -smashup/1 1 -smattering/1 1 -smear/23 1 -smeary/34 1 -smegma 1 -smell/519 1 -smellable -smelling 1 -smelt/23 1 -smelter/1 1 -smelting 1 -smelly/49 1 -Smetana -smidgen/1 1 -smidgeon/1 1 -smidgin/1 1 -smilax/2 1 -smile/28 1 -smiler 1 -smiley/1 1 -smiling/8 1 -smirch/22 1 -smirk/23 1 -Smirnoff/3 -smite/317 1452 -Smith -smith/18 1 -smithereens/2 1 -Smithson -Smithsonian/3 -smithy/15 1 -smock/23 1 -smocking/2 1 -smog/1 1 -smoggy/34 1 -smoke/28 1 -smokehouse/1 1 -smokeless 1 -smoker/1 1 -smokescreen/1 1 -smokestack/1 1 -Smokey/3 -smokey 1453 -smokier 1454 -smokiest 1454 -smokiness/3 -smoking/2 1 -smoky/34 1 -smolder/23 1 -smoldering 1 -Smolensk -Smollett -smooch/22 1 -smoochy -smooth/520 1 -smoother 1 -smoothie/1 1 -smoothing 1 -smoothy/60 1 -smorgasbord/1 1 -smote 1455 -smother/23 1 -smouldered -smoulders -smoulder's -smudge/28 1 -smudged 1 -smudgy/34 1 -smug/521 1 -smuggle/6 1 -smuggler/1 1 -smuggling/2 1 -smug 1 -smurf/58 1 -smut/18 1 -Smuts -smutty/49 1 -Smyrna -Sn/2 1 -snack/23 1 -snaffle/28 1 -snafu/18 1 -snag/92 1 -snail/23 1 -snake/1 1 -Snake/2 1 -snake/6 1 -snakebite/1 1 -snakelike -snakeskin 1 -snakier 1456 -snakiest 1456 -snaky/34 1 -snap/296 1 -snapdragon/1 1 -snapper/1 1 -snapping 1 -snappish/16 1 -Snapple/3 -snappy/50 1 -snapshot/18 1 -snare/28 1 -snarf/11 1 -snaring 1 -snark/10 1 -snarl/23 1 -snarlingly 1 -snarling 1 -snarly/34 1 -snatch/22 1 -snatcher/1 1 -snazzily 1 -snazzy/34 1 -Snead/3 -sneak/78 1 -sneaker/1 1 -sneaking/8 1 -sneaky/50 1 -sneer/23 1 -sneering/191 1 -sneeze/28 1 -sneezing 1 -Snell/3 -snick/5 1 -snicker/23 1 -Snickers/3 -snide/45 1 -Snider/3 -snide 1 -sniff/23 1 -sniffer/1 1 -sniffing 1 -sniffle/28 1 -sniffling 1 -sniffy/34 1 -snifter/18 1 -snigger/23 1 -sniggering 1 -snip/218 1 -snipe/28 1 -sniper/1 1 -sniping 1 -snippet/1 1 -snipping 1 -snippy/34 1 -snit/1 1 -snitch/22 1 -snivel/23 1 -sniveler/1 1 -snob/1 1 -snobbery/2 1 -snobbish/16 1 -snobby/34 1 -snog/117 1 -snood/18 1 -snooker/23 1 -snoop/23 1 -snooper/1 1 -Snoopy/3 -snoopy/34 1 -snoot/18 1 -snooty/50 1 -snooze/28 1 -snore/28 1 -snorer/1 1 -snoring 1 -snorkel/23 1 -snorkeler/1 1 -snorkeling/2 1 -snort/23 1 -snorter/1 1 -snorting 1 -snot/18 1 -snotty/50 1 -snout/18 1 -Snow -snow/23 1 -snowball/23 1 -snowbank/1 1 -Snowbelt 1 -snowbird/1 1 -snowboard/23 1 -snowboarder/1 1 -snowboarding/2 1 -snowbound 1 -snowdrift/1 1 -snowdrop/1 1 -snowfall/1 1 -snowfield/1 1 -snowflake/1 1 -snowline 1 -snowman/2 1457 -snowmen 1458 -snowmobile/28 1 -snowmobiling 1 -snowplough/10 1 -snowplow/23 1 -snowshed 1 -snowshoe/86 1 -snowstorm/1 1 -snowsuit/1 1 -snowy/49 1 -snub/136 1 -snubbing 1 -snub 1 -snuff/216 1 -snuffbox/4 1 -snuffer/1 1 -snuffing 1 -snuffle/28 1 -snuffling 1 -snug/522 1 -snuggle/28 1 -Snyder/3 -SO -so/2 1 -soak/23 1 -soaking/1 1 -soap/23 1 -soapbox/40 1 -soapiness/3 -soapstone/2 1 -soapsuds/2 1 -soapy/34 1 -soar/23 1 -soaring/8 1 -Soave/2 1 -sob/1 1 -SOB/2 1 -sob/145 1 -sobbingly 1 -sobbing 1 -sober/98 1 -sobering 1 -sobriety/2 1 -sobriquet/1 1 -Soc -soc/523 1 -soccer/2 1 -sociability/2 1 -sociable/82 1 -social/30 1 -socialism/2 1 -socialist/1 1 -socialistic 1 -socialite/1 1 -socialization/2 1 -socialize/6 1 -societal -society/15 1 -sociobiology 1 -sociocultural 1 -socioeconomic/39 1 -sociolinguistic/10 1 -sociolinguists -sociological/8 1 -sociologist/1 1 -sociology/2 1 -sociopath/1 1 -sociopolitical -sock/23 1 -socket/18 1 -sockeye/1 1 -Socorro/3 -Socrates/2 1 -Socratic 1 -sod/113 1 -soda/1 1 -sodden/8 1459 -Soddy -sodium/2 1 -Sodom/2 1 -sodomite/1 1 -sodomize/6 1 -sodomy/2 1 -sod 1460 -soever 1 -sofa/1 1 -sofabed/1 1 -Sofia/2 1 -soft/21 1 -softback 1 -softball/1 1 -softbound 1 -softcover 1 -soften/11 1 -softener/1 1 -softening 1 -softhearted 1 -softie/1 1 -soft 1 -software/2 1 -softwood/1 1 -softy/15 1 -soggily 1 -soggy/49 1 -Soho -soh 1 -soignee 1 -soigne 1 -soil/23 1 -soiling 1 -soiree/1 1 -sojourn/23 1 -sojourner/1 1 -sojourning 1 -sol/1 1 -Sol/2 1 -sol/58 1 -solace/28 1 -solaria 1461 -solarium/2 1462 -solar 1 -solder/23 1 -solderer/1 1 -soldering 1 -soldier/23 1 -soldiering 1 -soldierly 1 -soldiery/2 1 -sold 1463 -sole/54 1 -solecism/1 1 -solemn/21 1 -solemness/3 -solemnify/31 1 -solemnity/15 1 -solemnization/2 1 -solemnize/6 1 -solenoid/1 1 -solenoidal 1 -solicit/11 1 -solicitation/1 1 -soliciting 1 -solicitor/1 1 -solicitous/16 1 -solicitude/2 1 -solid/38 1 -solidarity/2 1 -solidification/2 1 -solidify/31 1 -solidi 1464 -solidity/2 1 -solidus/2 1465 -soliloquize/6 1 -soliloquy/15 1 -soling 1 -solipsism/1 1 -solipsist/10 1 -solipsistic -Solis/3 -solitaire/1 1 -solitary/524 1 -solitude/1 1 -solo/23 1 -soloist/1 1 -Solomon 1 -Solon -solo 1 -solstice/1 1 -solubility/2 1 -soluble/1 1 -solute/1 1 -solution/1 1 -solvable 1 -solve/6 1 -solvency/2 1 -solvent/1 1 -solver/1 1 -Solzhenitsyn -Somali/1 1 -Somalia/2 1 -Somalian/1 1 -somatic -somber/16 1 -sombrero/1 1 -sombre 1 -somebody/15 1 -someday -somehow -someone/1 1 -someplace -somersault/23 1 -somerset/109 1 -something/1 1 -sometime/10 1 -some 1 -someway/10 1 -somewhat/10 1 -somewhere 1 -Somme/2 1 -somnambulism/2 1 -somnambulist/1 1 -somnolence/2 1 -somnolent 1 -Somoza/3 -son/1 1 -Son/2 1 -sonar/1 1 -sonata/1 1 -sonatina/1 1 -Sondheim -Sondra/3 -song/1 1 -songbird/1 1 -songbook/1 1 -songfest/1 1 -Songhai/2 1 -Songhua/3 -songster/1 1 -songstress/4 1 -songwriter/1 1 -songwriting 1 -Sonia/3 -sonically -sonic 1 -Sonja/3 -sonnet/18 1 -sonofabitch -sonogram/1 1 -Sonora/2 1 -sonority/15 1 -sonorous/16 1 -sonsofbitches -Sontag/3 -Sony/3 -Sonya/3 -Sonny/3 -sonny/15 1 -soon/166 1 -sooner 1 -soonish -soot/2 1 -sooth/525 1 -soothe/253 1 -soother/1 1 -soothing/8 1 -soothsayer/1 1 -soothsaying/2 1 -soot 1 -sooty/34 1 -sop/1 1 -SOP/2 1 -sop/105 1 -Sophia -Sophie/3 -sophism/2 1 -sophist/1 1 -sophistical 1 -sophisticate/28 1 -sophistication/2 1 -sophistic 1 -sophistry/15 1 -Sophoclean -Sophocles -sophomore/1 1 -sophomoric -soporific/1 1 -soporifically -sopping 1 -soppy/34 1 -soprano/1 1 -Sopwith/3 -sorbet/1 1 -Sorbonne/3 -sorcerer/1 1 -sorceress/4 1 -sorcery/2 1 -sordid/16 1 -sore/526 1 -sorehead/1 1 -sorghum/2 1 -sorority/15 1 -sorrel/1 1 -sorrow/23 1 -sorrowful/16 1 -sorrowing 1 -sorry/50 1 -sort/23 1 -sorta -sortable 1 -sorter/1 1 -sortie/63 1 -sorting 1 -SOs -SOS/4 1 -Sosa/3 -sot/1 1 -Soto/3 -so 1 -sottish 1 -sou/1 1 -soubriquet/1 1 -souffle/1 1 -sough/23 1 -soughing 1 -sought 1466 -souk/10 1 -soul/1 1 -souled -soulful/16 1 -soulless/8 1 -soullessness -soulless 1 -soul 1 -sound/52 1 -soundbite/10 1 -soundboard/1 1 -sounder/1 1 -sounding/1 1 -soundless/8 1 -soundproof/11 1 -soundproofing/2 1 -soundproof 1 -soundtrack/1 1 -soup/23 1 -soupcon/1 1 -Souphanouvong/3 -soupy/34 1 -sour/52 1 -source/28 1 -sourceless 1 -sourdough/1 1 -souring 1 -sourish 1 -sourpuss/4 1 -sous/7 1 -Sousa/2 1 -sousaphone/1 1 -souse/28 1 -sousing 1 -South/1 1 -south/2 1 -Southampton -southbound 1 -southeast/44 1 -Southeast/1 1 -southeast/2 1 -southeaster/1 1 -southeasterly -southeastern -southeastward/10 1 -southerlies -southerly's -southerly 1 -southern/129 1 -southerner/1 1 -Southerner/1 1 -southernmost -Southern 1 -Southey -southpaw/1 1 -south 1 -South 1 -south 1 -southward/1 1 -southwest/44 1 -Southwest/1 1 -southwest/2 1 -southwester/1 1 -southwesterly -southwestern -southwestward/10 1 -souvenir/1 1 -sou'wester -sovereign/1 1 -sovereignty/2 1 -soviet/1 1 -Soviet 1 -sow/504 1 -sower/1 1 -Soweto/2 1 -sowing 1 -soy/2 1 -soya/2 1 -soybean/1 1 -Soyinka/3 -Soyuz -sozzled -Sp -spa/1 1 -Spaatz/3 -space/139 1 -spacecraft/1 1 -spaceflight/1 1 -spaceman/2 1467 -spacemen 1468 -spaceport/1 1 -spacer/1 1 -spaceship/1 1 -spacesuit/1 1 -spacewalk/23 1 -spacewoman/2 1469 -spacewomen 1470 -spacey 1471 -spacial 1 -spacier 1472 -spaciest 1472 -spaciness/3 -spacing/1 1 -spacious/16 1 -Spackle 1 -spacy/34 1 -spade/28 1 -spadeful/1 1 -spadework/2 1 -spadix/184 1 -spaghetti/2 1 -Spahn/3 -Spain/2 1 -spake 1473 -Spam/2 1 -spam/114 1 -spamblock -spamblocks -spammer/1 1 -Span -span/133 1 -spandex/2 1 -spandrels -spangle/28 1 -spangling 1 -Spanglish 1 -spangly 1 -Spaniard/1 1 -spaniel/18 1 -Spanish/2 1 -spank/23 1 -spanker 1 -spanking/1 1 -spanner/1 1 -spar/103 1 -spare/107 1 -spareribs -spareribs's -sparer 1 -sparing/8 1 -spark/23 1 -sparkle/28 1 -sparkler/1 1 -sparklingly -sparkling 1 -sparkly 1 -Sparks -sparky/34 1 -sparring 1 -sparrow/1 1 -sparrowhawk -sparrowhawks -spars/166 1 -sparse/27 1 -sparsity/2 1 -Sparta/2 1 -Spartacus -Spartan/1 1 -spartan 1 -Spartan 1 -spar 1 -spasm/18 1 -spasmodic/39 1 -spastic/1 1 -spat/109 1 -spate/1 1 -spathe/1 1 -spatial/8 1 -spat 1474 -spatter/23 1 -spatula/1 1 -spavin/2 1 -spavined -spawn/23 1 -spawning 1 -spay/11 1 -SPCA -speak/121 1475 -speakable 1 -speakeasy/15 1 -speaker/1 1 -speakerphone/10 1 -Speaker 1 -speaking/10 1 -spear/23 1 -spearfish/22 1 -spearhead/23 1 -spearmint/2 1 -Spears -spec/451 1 -special/527 1 -specialism/10 1 -specialist/1 1 -specialization/1 1 -specialize/6 1 -specialty/15 1 -specie/130 1 -specif -specifiable -specifiably -specific/51 1 -specification/1 1 -specificity/2 1 -specificness -specifier/10 1 -specify/31 1 -specimen/1 1 -specious/16 1 -speck/23 1 -specked 1 -speckle/28 1 -speckling 1 -spectacle/130 1 -spectacular/30 1 -spectate/6 1 -spectator/1 1 -specter/1 1 -spectral 1 -spectra 1476 -spectrogram 1 -spectrograph 1 -spectrometer/1 1 -spectrometric -spectrometry 1 -spectrophotometer 1 -spectrophotometry 1 -spectroscope/1 1 -spectroscopic -spectroscopically -spectroscopy/2 1 -spectrum/2 1477 -spec 1 -specular 1 -speculate/6 1 -speculation/1 1 -speculative/8 1 -speculator/1 1 -speculum 1 -sped 1478 -speech/40 1 -speechify/31 1 -speechless/16 1 -speechwriter/10 1 -speed/86 1479 -speedboat/1 1 -speeder/1 1 -speeding/2 1 -speedometer/1 1 -speedster/1 1 -speedup/1 1 -speedway/1 1 -speedwell/2 1 -speedy/50 1 -Speer/3 -speleological -speleologist/1 1 -speleology/2 1 -spell/23 1 -spellable -spellbind/121 1480 -spellbinder/1 1 -spellbound 1481 -spellchecker/10 1 -spelldown/1 1 -speller/1 1 -spelling/1 1 -spelunker/1 1 -spelunking/2 1 -Spence -Spencer -Spencerian -spend/382 1 -spendable 1 -spender/1 1 -spending/2 1 -spendthrift/1 1 -Spengler/3 -Spenglerian 1 -Spenser/2 1 -Spenserian 1 -sperm/1 1 -spermatozoa 1482 -spermatozoon/2 1483 -spermicidal -spermicide/1 1 -Sperry/3 -spew/23 1 -spewer/1 1 -SPF -sphagnum/1 1 -sphere/18 1 -spherical/8 1 -spheroid/1 1 -spheroidal -sphincter/1 1 -Sphinx/2 1 -sphinx/4 1 -spic/5 1 -Spica/2 1 -spice/28 1 -spicier 1484 -spiciest 1484 -spic 1 -spicule/1 1 -spicy/50 1 -spider/1 1 -spiderweb/18 1 -spidery/34 1 -spiel/23 1 -Spielberg/3 -spiff/11 1 -spiffy/34 1 -spigot/1 1 -spik/70 1 -spike/28 1 -spikier 1485 -spikiest 1485 -spiky/49 1 -spill/23 1 -spillage/1 1 -Spillane/3 -spiller 1 -spilling 1 -spillover/1 1 -spillway/1 1 -spin/442 1486 -spinach/2 1 -spinal/30 1 -spindle/28 1 -spindling 1 -spindly/34 1 -spindrift 1 -spine/1 1 -spineless/83 1 -spinet/1 1 -spinnaker/1 1 -spinner/1 1 -spinneret/1 1 -spinney/10 1 -spinning/2 1 -spinoff/1 1 -Spinoza -spinster/1 1 -spinsterhood/2 1 -spinsterish -Spinx/3 -spiny/34 1 -spiracle/1 1 -spiraea/1 1 -spiral/210 1 -spire/18 1 -spirea/1 1 -spirit/23 1 -spirited/8 1 -spiriting 1 -spiritless 1 -spiritual/30 1 -spiritualism/2 1 -spiritualist/1 1 -spiritualistic 1 -spirituality/2 1 -spirituous 1 -Spiro/3 -spirochete/1 1 -Spirograph/3 -spiry/34 1 -spit/109 1487 -spitball/1 1 -spite/28 1 -spiteful/85 1 -spitfire/1 1 -Spitsbergen/2 1 -spitting 1 -spittle/2 1 -spittoon/1 1 -Spitz/3 -spiv/10 1 -splash/22 1 -splashdown/1 1 -splashily 1 -splashing 1 -splashy/49 1 -splat/109 1 -splatter/23 1 -splay/23 1 -splayfeet 1488 -splayfoot/2 1489 -splayfooted -splayfoot 1 -splay 1 -spleen/1 1 -splendid/75 1 -splendor/1 1 -splendorous -splenetic 1 -splice/28 1 -splicer/1 1 -spliff/10 1 -spline/70 1 -splint/23 1 -splinter/23 1 -splintery 1 -split/128 1 -splittable -splitter/10 1 -splitting/1 1 -splodge/70 1 -splosh/7 1 -splotch/22 1 -splotchy/34 1 -splurge/28 1 -splutter/23 1 -spluttering 1 -Spock -spoil/23 1 -spoilage/2 1 -spoiler/1 1 -spoilsport/1 1 -Spokane -spoke/18 1 -spoken 1473 -spokeshave/10 1 -spokesman/2 1490 -spokesmen 1491 -spokespeople 1492 -spokesperson/1 1493 -spoke 1473 -spokeswoman/2 1494 -spokeswomen 1495 -spoliation/2 1 -sponge/28 1 -spongecake/2 1 -sponger/1 1 -spongy/49 1 -sponsor/23 1 -sponsorship/1 1 -spontaneity/2 1 -spontaneous/8 1 -spoof/23 1 -spook/23 1 -spooky/49 1 -spool/23 1 -spooling 1 -spoon/23 1 -spoonbill/1 1 -spoonerism/1 1 -spoonful/1 1 -spoor/23 1 -sporadic/39 1 -spore/28 1 -sporran/10 1 -sport/23 1 -sporting/8 1 -sportive/8 1 -sportscast/86 1 -sportscaster/1 1 -sportscasting 1 -sportsman/2 1496 -sportsmanlike -sportsmanship/2 1 -sportsmen 1497 -sportspeople -sportsperson -sportswear/2 1 -sportswoman/2 1498 -sportswomen 1499 -sportswriter/1 1 -sport 1 -sporty/49 1 -spot/403 1 -spotless/16 1 -spotlight/23 1500 -spotlit 1501 -spotted 1 -spotter/1 1 -spotting 1 -spotty/50 1 -spousal/1 1 -spouse/18 1 -spout/23 1 -spouting 1 -sprain/23 1 -sprang 1502 -sprat/1 1 -sprawl/23 1 -spray/23 1 -sprayer/1 1 -spread/86 1 -spreadable 1 -spreadeagled -spreader/1 1 -spreading 1 -spreadsheet/1 1 -spree/63 1 -sprig/361 1 -sprightly/49 1 -spring/408 1503 -springboard/1 1 -springbok/1 1 -springer 1 -Springfield/2 1 -springing 1 -springlike 1 -Springsteen/3 -springtime/2 1 -springy/50 1 -sprinkle/28 1 -sprinkler/1 1 -sprinkling/1 1 -Sprint/3 -sprint/23 1 -sprinter/1 1 -sprinting 1 -Sprite/3 -sprite/1 1 -spritz/22 1 -spritzer/1 1 -sprocket/1 1 -sprog/10 1 -sprout/23 1 -sprouting 1 -spruce/107 1 -sprung 1502 -spry/528 1 -spryness/3 -spud/18 1 -spume/28 1 -spumone/2 1 -spumoni/2 1 -spumy/34 1 -spunk/18 1 -spunky/34 1 -spun 1504 -spur/103 1 -spurge/2 1 -spurious/16 1 -spurn/5 1 -spurning 1 -spurring 1 -spurt/23 1 -sputa 1505 -sputnik/1 1 -Sputnik 1 -sputter/23 1 -sputtering 1 -sputum/2 1506 -spy/56 1 -spyglass/4 1 -spyhole 1 -spying 1 -spymaster/10 1 -sq -Sq -sqq -squab/18 1 -squabble/28 1 -squabbler/1 1 -squab 1 -squad/18 1 -squaddie/10 1 -squadron/18 1 -squalid/21 1 -squall/23 1 -squalling 1 -squalor/2 1 -squally/34 1 -squamous 1 -squander/5 1 -squandering 1 -Squanto -square/107 1 -squarer 1 -squaring 1 -squarish 1 -squash/22 1 -squashy/34 1 -squat/529 1 -squatter/18 1 -squaw/1 1 -squawk/23 1 -squawker/1 1 -squawking 1 -squeak/23 1 -squeaker/1 1 -squeakily 1 -squeakiness/3 -squeaking 1 -squeaky/34 1 -squeal/23 1 -squealer/1 1 -squealing 1 -squeamish/16 1 -squeegee/63 1 -squeezable 1 -squeeze/28 1 -squeezebox/89 1 -squeezer/1 1 -squeezing 1 -squelch/22 1 -squelching 1 -squelchy/34 1 -squib/18 1 -Squibb/3 -squid/18 1 -squidgy -squiffy 1 -squiggle/28 1 -squiggly/34 1 -squint/179 1 -squinter 1 -squinting 1 -squire/28 1 -squires 1 -squirm/23 1 -squirming 1 -squirmy/34 1 -squirrel/23 1 -squirt/23 1 -squirting 1 -squish/22 1 -squishy/34 1 -Sr/2 1 -Srinagar -Srivijaya/3 -SRO -SS -SSA -SSE/2 1 -ssh -SSS -SST -SSW/2 1 -st -St -ST -Sta -stab/136 1 -stabber/1 1 -stabbing/1 1 -stability/2 1 -stabilizability -stabilization/2 1 -stabilize/6 1 -stabilizer/1 1 -stable/530 1 -stableman/2 1507 -stablemate/10 1 -stablemen 1508 -stabler 1 -stabling 1 -staccato/1 1 -Stacey/3 -Staci/3 -Stacie/3 -stack/23 1 -stacker 1 -stacking 1 -Stacy/3 -stadium/1 1 -Stael/3 -staff/78 1 -staffer/1 1 -staffing/2 1 -Stafford -staffroom 1 -stag/531 1 -stage/28 1 -stagecoach/4 1 -stagecraft/2 1 -stagehand/1 1 -stagestruck -stagey 1509 -stagflation/2 1 -stagger/23 1 -staggering/8 1 -stagier 1510 -stagiest 1510 -staging/1 1 -stagnancy/2 1 -stagnant/8 1 -stagnate/6 1 -stagnation/2 1 -stagy/34 1 -staid/21 1 -stain/23 1 -stainer 1 -staining 1 -stainless/2 1 -stair/1 1 -staircase/1 1 -StairMaster -stairway/1 1 -stairwell/1 1 -stake/28 1 -stakeholder/1 1 -stakeout/1 1 -stalactite/1 1 -stalagmite/1 1 -stale/532 1 -stalemate/28 1 -Stalin/2 1 -Stalingrad/2 1 -Stalinist 1 -stalk/23 1 -stalker/1 1 -stalking/1 1 -stall/23 1 -stallholder/10 1 -stalling 1 -stallion/1 1 -Stallone/3 -stalwart/30 1 -stamen/1 1 -Stamford -stamina/2 1 -stammer/23 1 -stammerer/1 1 -stammering/8 1 -stamp/23 1 -stampede/28 1 -stamped 1 -stamper/1 1 -stamping/10 1 -Stan/3 -stance/1 1 -stanch/533 1 -stancher 1 -stanching 1 -stanchion/18 1 -stand/86 1511 -standalone -standard/1 1 -standardization/1 1 -standardize/6 1 -standard 1 -standby/1 1 -standee/1 1 -stander/1 1 -standing/1 1 -Standish -standoff/1 1 -standoffish 1 -standout/1 1 -standpipe/1 1 -standpoint/1 1 -standstill/1 1 -standup/2 1 -Stanford/2 1 -Stanislavsky -stank 1512 -Stanley -Stanton -stanza/1 1 -stapes 1 -staph/2 1 -staphylococcal -staphylococci 1513 -staphylococcus/2 1514 -staple/139 1 -stapler/1 1 -Staples/3 -stapling 1 -star/445 1 -starboard/2 1 -Starbucks -starch/22 1 -starchy/50 1 -stardom/2 1 -stardust/2 1 -stare/28 1 -starer/1 1 -starfish/4 1 -starfruit 1 -stargaze/6 1 -stargazer/1 1 -stargazing 1 -staring 1 -Stark -stark/21 1 -starker/10 1 -Starkey/3 -stark 1 -starless 1 -starlet/1 1 -starlight/2 1 -starling/1 1 -starlit 1 -Starr/3 -starring 1 -starry/34 1 -starstruck -start/23 1 -starter/1 1 -starting 1 -startle/43 1 -startling/8 1 -starvation/2 1 -starve/6 1 -starved 1 -starveling/1 1 -starving/10 1 -stash/22 1 -stasis 1 -stat/18 1 -state/342 1 -statecraft/2 1 -stated 1 -statehood/2 1 -statehouse/1 1 -Statehouse/1 1 -stateless/33 1 -stately/140 1 -statement/1 1 -statemented -statementing -Staten/3 -stateroom/1 1 -stater 1 -States -stateside -Stateside -statesman/2 1515 -statesmanlike -statesmanship/2 1 -statesmen 1516 -stateswoman/2 1517 -stateswomen 1518 -statewide -static/51 1 -statical -station/23 1 -stationary 1 -stationer/1 1 -stationery/2 1 -stationmaster/10 1 -statistic/1 1 -statistical/8 1 -statistician/1 1 -stator/10 1 -statuary/2 1 -statue/18 1 -statuesque -statuette/1 1 -stature/1 1 -status/4 1 -statute/1 1 -statutory/211 1 -Staubach/3 -staunch/534 1 -stave/330 1519 -stay/478 1 -stayer/10 1 -staying 1 -std -STD -stdio -Ste -stead/18 1 -steadfast/16 1 -Steadicam -steadier 1 -steady/275 1 -steadying 1 -steak/1 1 -steakhouse/1 1 -steal/86 1520 -stealer 1 -stealing 1 -stealth/2 1 -stealthy/50 1 -steam/78 1 -steamboat/1 1 -steamer/18 1 -steamfitter/1 1 -steamfitting/2 1 -steaming 1 -steamroll/11 1 -steamroller/23 1 -steamship/1 1 -steamy/49 1 -steed/1 1 -steel/23 1 -Steele -steeling 1 -steelmaker/10 1 -steel 1 -steelwork/32 1 -steelworker/1 1 -steely/49 1 -steelyard/1 1 -steep/52 1 -steepen/11 1 -steeper 1 -steeple/1 1 -steeplechase/18 1 -steeplechaser 1 -steeplejack/1 1 -steer/23 1 -steerable 1 -steerage/2 1 -steering/2 1 -steersman/2 1521 -steersmen 1522 -Stefan/3 -Stefanie/3 -stegosauri 1523 -stegosaurus/4 1524 -Stein -stein/18 1 -Steinbeck -Steinem/3 -Steiner -Steinmetz/3 -Steinway/3 -Stella -stellar 1 -stellated -stem/160 1 -stemless 1 -stemware/2 1 -stench/40 1 -stencil/23 1 -Stendhal -Stengel/3 -steno/1 1 -stenographer/1 1 -stenographic -stenography/2 1 -stenos 1 -stentorian -step/47 1 -stepbrother/1 1 -stepchild/155 1 -stepdaughter/1 1 -stepfather/1 1 -Stephan/3 -Stephanie/3 -Stephen -Stephens -Stephenson -stepladder/1 1 -stepmother/1 1 -stepparent/1 1 -steppe/28 1 -stepper/1 1 -steppingstone/1 1 -stepsister/1 1 -stepson/1 1 -stepwise 1 -steradians -stereo/18 1 -stereographic -stereophonic 1 -stereoscope/1 1 -stereoscopic -stereoscopically -stereoscopy 1 -stereo 1 -stereotype/28 1 -stereotypical -stereotypically -stereotyping 1 -sterile 1 -sterility/2 1 -sterilization/1 1 -sterilize/6 1 -sterilizer/1 1 -Sterling/3 -sterling/2 1 -Stern -stern/455 1 -Sterne/3 -Sterno 1 -sternum/1 1 -steroid/1 1 -steroidal -stertorous 1 -stet/12 1 -stethoscope/1 1 -stetson/1 1 -Stetson/2 1 -Steuben/3 -Steve/3 -stevedore/18 1 -Steven/3 -Stevens -Stevenson -Stevie/3 -stew/23 1 -steward/23 1 -stewardess/4 1 -stewardship/2 1 -Stewart/3 -stewing 1 -stick/86 1525 -sticker/18 1 -sticking 1 -stickleback/1 1 -stickler/1 1 -stickpin/1 1 -stickup/1 1 -sticky/535 1 -sticky's -Stieglitz/3 -stiff/52 1 -stiffen/11 1 -stiffener/1 1 -stiffening/2 1 -stifle/43 1 -stifling/10 1 -stiflingly 1 -stigma/536 1 -stigmata 1 -stigmatic 1 -stigmatization/2 1 -stigmatize/6 1 -stile/18 1 -stiletto/18 1 -still/165 1 -stillbirth/1 1 -stillborn 1 -stiller 1 -stilling 1 -stilt/62 1 -stilted/8 1 -Stilton/1 1 -Stimson/3 -stimulant/1 1 -stimulate/6 1 -stimulating 1 -stimulation/2 1 -stimulative 1 -stimulator 1 -stimulatory -stimuli 1526 -stimulus/2 1527 -Stine/3 -sting/86 1528 -stinger/1 1 -stinging 1 -stingray/1 1 -stingy/50 1 -stink/86 1529 -stinkbug/1 1 -stinker/1 1 -stinking 1 -stinky/34 1 -stint/23 1 -stinting 1 -stipend/1 1 -stipendiary/60 1 -stipple/28 1 -stippling/2 1 -stipulate/6 1 -stipulation/1 1 -stir/103 1 -Stirling -stirrer/1 1 -stirring/191 1 -stirrup/1 1 -stitch/22 1 -stitchery/2 1 -stitching/2 1 -stoat/1 1 -stochastic 1 -stock/23 1 -stockade/28 1 -stockbreeder/1 1 -stockbroker/1 1 -stockbroking/2 1 -Stockhausen/3 -stockholder/1 1 -Stockholm/2 1 -stockinet/2 1 -stockinette/2 1 -stocking/1 1 -stockinged -stockist/10 1 -stockpile/28 1 -stockpiling 1 -stockpot/1 1 -stockroom/1 1 -stocktaking/2 1 -Stockton -stock 1 -stocky/50 1 -stockyard/1 1 -stodge 1 -stodgy/50 1 -stogie/1 1 -stogy/15 1 -stoic/1 1 -Stoic/1 1 -stoical/8 1 -Stoicism/1 1 -stoicism/2 1 -stoic 1 -Stoic 1 -stoke/6 1 -stoker/1 1 -Stokes/3 -STOL -stole/1 1 -stolen 1530 -stole 1530 -Stolichnaya/3 -stolid/21 1 -stolidity/2 1 -stolon/1 1 -Stolypin/3 -stoma/492 1 -stomach/23 1 -stomachache/1 1 -stomacher/1 1 -stomp/23 1 -Stone -stone/28 1 -Stonehenge -stoneless 1 -stonemason/1 1 -stone 1 -stonewall/11 1 -stonewalling 1 -stoneware/2 1 -stonewashed -stonework/2 1 -stoney 1531 -stonier 1532 -stoniest 1532 -stonkered -stonking -stony/50 1 -stood 1533 -stooge/18 1 -stool/18 1 -stoop/23 1 -stooping 1 -stop/47 1 -stopcock/1 1 -stopgap/1 1 -stoplight/1 1 -stopoff 1 -stopover/1 1 -stoppable 1 -stoppage/1 1 -Stoppard/3 -stopper/23 1 -stopping 1 -stopple/28 1 -stopwatch/4 1 -storage/2 1 -store/28 1 -storefront/1 1 -storehouse/1 1 -storekeeper/1 1 -storeroom/1 1 -store 1 -stork/1 1 -storm/23 1 -stormer -stormers -storming 1 -stormtroopers -stormy/50 1 -story/148 1 -storyboard/18 1 -storybook/1 1 -storyline 1 -storyteller/1 1 -storytelling/2 1 -stoup/1 1 -Stout -stout/38 1 -stouthearted 1 -stove/18 1 -stovepipe/1 1 -stove 1534 -stow/11 1 -stowage/2 1 -stowaway/1 1 -Stowe -stowing 1 -Strabo/3 -straddle/28 1 -straddler/1 1 -Stradivari 1 -Stradivarius 1 -strafe/28 1 -straggle/43 1 -straggler/1 1 -straggling 1 -straggly/34 1 -straight/455 1 -straightaway/1 1 -straightedge/1 1 -straighten/11 1 -straightener/1 1 -straightforward/94 1 -straightjacket/18 1 -straightway 1 -strain/23 1 -strained 1 -strainer/1 1 -straining 1 -strait/18 1 -straiten/11 1 -straitjacket/23 1 -straitlaced -strait 1 -strand/23 1 -strange/27 1 -stranger/18 1 -strangle/6 1 -stranglehold/1 1 -strangler/1 1 -strangling 1 -strangulate/6 1 -strangulation/2 1 -strap/47 1 -strapless/4 1 -strapping/2 1 -Strasbourg -stratagem/1 1 -strata 1535 -strategic/32 1 -strategical/8 1 -strategist/1 1 -strategy/15 1 -stratification/2 1 -stratify/31 1 -stratigraphic -stratigraphical -strati 1536 -stratosphere/1 1 -stratospheric -stratospherically -stratum/2 1537 -stratus/2 1538 -Strauss -Stravinsky/2 1 -straw/23 1 -strawberry/15 1 -straw 1 -stray/23 1 -straying 1 -stray 1 -streak/23 1 -streaked 1 -streaker/1 1 -streaking 1 -streaky/34 1 -stream/23 1 -streamer/1 1 -streaming 1 -streamline/43 1 -street/1 1 -streetcar/1 1 -streetlamp/10 1 -streetlight/1 1 -street 1 -streetwalker/1 1 -streetwise 1 -Streisand/3 -strength/1 1 -strengthen/11 1 -strengthener/1 1 -strengthening 1 -strenuous/16 1 -strep/2 1 -streptococcal -streptococci 1539 -streptococcus/2 1540 -streptomycin/2 1 -stress/22 1 -stressfulness -stressful 1 -stretch/147 1 -stretchability 1 -stretchable 1 -stretcher/23 1 -stretchmarks -stretchy/259 1 -strew/126 1 -strewing 1 -strewn 1 -strewth -stria/53 1 -striated -striation/1 1 -stricken 1541 -Strickland/3 -strict/21 1 -stricture/1 1 -stride/366 1542 -stridency/2 1 -strident/8 1 -strider 1 -strife/2 1543 -strike/73 1544 -strikebound -strikebreaker/1 1 -strikebreaking 1 -strikeout/1 1 -striker/1 1 -striking/191 1 -Strindberg -string/86 1545 -stringed 1 -stringency/2 1 -stringent/8 1 -stringer/1 1 -stringing 1 -stringy/49 1 -strip/296 1 -stripe/28 1 -stripey -striping 1 -stripling/1 1 -stripper/1 1 -stripping 1 -striptease/28 1 -stripteaser/1 1 -stripy/34 1 -strive/76 1546 -strives 1547 -striving 1 -strobe/1 1 -stroboscope/1 1 -stroboscopic -strode 1548 -stroke/28 1 -stroking 1 -stroll/23 1 -stroller/1 1 -strolling 1 -stromatolites -Stromboli -Strong/3 -strong/75 1 -strongbow -strongbox/4 1 -stronghold/1 1 -strongish -strongman/2 1549 -strongmen 1550 -strongroom/10 1 -strontium/2 1 -strop/47 1 -strophe/1 1 -strophic 1 -stroppily -stroppiness -stroppy/34 1 -strove 1551 -struck 1541 -structural/8 1 -structuralism 1 -structuralist/10 1 -structure/28 1 -structureless 1 -strudel/1 1 -struggle/28 1 -struggling 1 -strum/160 1 -strumpet/18 1 -strung 1552 -strut/109 1 -strutter 1 -strutting 1 -strychnine/2 1 -s 1 -Stu/3 -Stuart/1 1 -stub/136 1 -stubble/2 1 -stubbly/34 1 -stubborn/21 1 -stubby/34 1 -stucco/22 1 -stuck 1553 -stud/113 1 -studbook/1 1 -studding/2 1 -Studebaker/3 -student/1 1 -studentship/10 1 -studied/8 1 -studier/10 1 -studio/1 1 -studious/16 1 -studly/34 1 -stud 1 -study/56 1 -stuff/23 1 -stuffer 1 -stuffing/2 1 -stuffy/50 1 -stultification/2 1 -stultify/31 1 -stumble/28 1 -stumbler/1 1 -stumblingly -stump/23 1 -stumpy/34 1 -stun/537 1 -stung 1554 -stunk 1512 -stunner/10 1 -stunning/8 1 -stunt/23 1 -stunted 1 -stuntman 1555 -stuntmen 1556 -stupefaction/2 1 -stupefy/31 1 -stupefyingly -stupendous/8 1 -stupid/183 1 -stupidity/15 1 -stupor/1 1 -sturdy/50 1 -sturgeon/1 1 -stutter/23 1 -stutterer/1 1 -stuttering 1 -Stuttgart/2 1 -Stuyvesant -sty/167 1 -stye/18 1 -Stygian 1 -style/28 1 -styling 1 -stylish/16 1 -stylist/1 1 -stylistic/276 1 -styli 1557 -stylization 1 -stylize/6 1 -stylus/4 1558 -stymie/63 1 -stymy/148 1 -styptic/1 1 -styrene 1 -Styrofoam/1 1 -Styron/3 -Styx/2 1 -Suarez/3 -suasion/2 1 -suave/27 1 -suavity/2 1 -sub/136 1 -subaltern/1 1 -subaqua -subarctic 1 -subarea/1 1 -Subaru/3 -subatomic 1 -subbasement/1 1 -subbing 1 -subbranch/4 1 -subcategory/15 1 -subclass/538 1 -subclauses -subcommittee/1 1 -subcompact/1 1 -subconscious/239 1 -subcontinent/1 1 -subcontinental -subcontract/23 1 -subcontractor/1 1 -subcultural 1 -subculture/18 1 -subcutaneous/8 1 -subdivide/6 1 -subdivision/1 1 -subducted -subduction 1 -subdue/6 1 -subdued 1 -subeditor/10 1 -subfamilies -subfamily/3 -subfreezing -subgroup/1 1 -subharmonic -subharmonics -subhead/1 1 -subheading/1 1 -subhuman/1 1 -subj -subject/23 1 -subjection/2 1 -subjective/8 1 -subjectivity/2 1 -subject 1 -subjoin/11 1 -subjugate/6 1 -subjugation/2 1 -subjunctive/1 1 -sublayer -sublease/28 1 -sublet/128 1 -subletting 1 -sublieutenant/10 1 -sublimate/43 1 -sublimation/2 1 -sublime/404 1 -sublimer 1 -subliminal/8 1 -subliming 1 -sublimity/2 1 -sublunary -submarginal 1 -submarine/18 1 -submariner/1 1 -submerge/6 1 -submergence/2 1 -submerse/6 1 -submersible/1 1 -submersion/2 1 -submicroscopic 1 -submission/1 1 -submissive/16 1 -submit/12 1 -submittable -submitter/10 1 -submitting 1 -subnormal 1 -suboptimal -suborbital -suborder/1 1 -subordinate/28 1 -subordination/2 1 -suborn/11 1 -subornation/2 1 -subpena/23 1 -subplot/1 1 -subpoena/23 1 -subprofessional/1 1 -subprogram/10 1 -subroutine/1 1 -subscribe/6 1 -subscriber/1 1 -subscribing 1 -subscript/1 1 -subscription/1 1 -subscript 1 -subsection/1 1 -subsequent/8 1 -subservience/2 1 -subservient/8 1 -subset/1 1 -subside/6 1 -subsidence/2 1 -subsidiarity 1 -subsidiary/15 1 -subsidization/2 1 -subsidize/6 1 -subsidizer/1 1 -subsidy/15 1 -subsist/11 1 -subsistence/2 1 -subsoil/2 1 -subsonic -subspace/10 1 -subspecies/2 1 -substance/1 1 -substandard -substantial/8 1 -substantiate/6 1 -substantiation/1 1 -substantive/30 1 -substation/1 1 -substitutable -substitute/28 1 -substitution/1 1 -substrata 1559 -substrate/1 1 -substratum/2 1560 -substructure/1 1 -subsume/6 1 -subsurface/2 1 -subsystem/1 1 -subteen/1 1 -subtenancy/2 1 -subtenant/1 1 -subtend/11 1 -subterfuge/1 1 -subterranean 1 -subtext/1 1 -subtitle/28 1 -subtle/17 1 -subtlety/15 1 -subtopic/1 1 -subtotal/23 1 -subtract/11 1 -subtraction/1 1 -subtractive -subtractively -subtrahend/1 1 -subtropic/32 1 -subtropical -subtype/10 1 -subunit/10 1 -suburb/1 1 -suburban/1 1 -suburbanite/1 1 -suburbanization 1 -suburbia/2 1 -subvention/1 1 -subversion/2 1 -subversive/36 1 -subvert/11 1 -subway/18 1 -subzero -succeed/11 1 -succeeding 1 -success/4 1 -successful/8 1 -succession/1 1 -successive/8 1 -successor/1 1 -succinct/21 1 -succor/23 1 -succotash/2 1 -succubi 1561 -succubus 1562 -succulence/2 1 -succulency/2 1 -succulent/1 1 -succumb/11 1 -suchlike 1 -such 1 -suck/23 1 -suckable -sucker/23 1 -sucking 1 -suckle/6 1 -suckling/1 1 -Sucre -Sucrets/3 -sucrose/2 1 -suction/23 1 -sud/32 1 -Sudan/2 1 -Sudanese/2 1 -sudden/16 1 -Sudetenland/3 -Sudoku/3 -Sudra/2 1 -suds/2 1 -sudsy/34 1 -Sue -sue/6 1 -suede/2 1 -sued 1 -suet/2 1 -Suetonius -suety 1 -Suez -suffer/11 1 -sufferance/2 1 -sufferer/1 1 -suffering/1 1 -suffice/6 1 -sufficiency/2 1 -sufficient/8 1 -suffix/287 1 -suffixation/2 1 -suffocate/6 1 -suffocatingly -suffocating 1 -suffocation/2 1 -Suffolk 1 -suffragan/1 1 -suffrage/2 1 -suffragette/1 1 -suffragist/1 1 -suffuse/6 1 -suffused 1 -suffusion/2 1 -Sufism 1 -Sufi 1 -sugar/23 1 -sugarcane/2 1 -sugarcoat/11 1 -sugaring 1 -sugarless 1 -sugarplum/1 1 -sugary/34 1 -suggest/11 1 -suggested 1 -suggester/10 1 -suggestibility/2 1 -suggestible 1 -suggestion/1 1 -suggestive/16 1 -sugillate -Suharto/3 -Sui/3 -suicidal/8 1 -suicide/18 1 -suit/23 1 -suitability/15 1 -suitable/29 1 -suitcase/1 1 -suite/28 1 -suiting/2 1 -suitor/1 1 -Sukarno -sukiyaki/2 1 -Sukkoth/1 1 -Sukkot 1 -Sulawesi/2 1 -Suleiman/3 -sulfa/2 1 -sulfate/18 1 -sulfa 1 -sulfide/1 1 -sulfur/23 1 -sulfuric -sulfurous 1 -sulk/23 1 -sulky/221 1 -Sulla/2 1 -sullen/21 1 -Sullivan/2 1 -sulphate/70 1 -sulphide/10 1 -sultan/1 1 -sultana/1 1 -sultanate/1 1 -sultry/50 1 -sully/31 1 -sum/160 1 -sumac/2 1 -sumach/2 1 -Sumatra/2 1 -Sumatran/1 1 -Sumeria/3 -Sumerian/1 1 -summability 1 -summable -summarize/6 1 -summarizer/10 1 -summary/206 1 -summat -summation/1 1 -Summer/3 -summer/23 1 -summerhouse/1 1 -summering 1 -Summers -summertime/2 1 -summer 1 -summery/34 1 -summing 1 -summit/18 1 -summitry/2 1 -summon/11 1 -summoner/1 1 -summonings -summons/22 1 -Sumner/3 -sumo/2 1 -sump/1 1 -sumptuous/16 1 -Sumter -sun/1 1 -Sun/1 1 -sun/192 1 -sunbath/23 1 -sunbathe/6 1 -sunbather/1 1 -sunbathing/2 1 -Sunbeam/3 -sunbeam/1 1 -sunbed/10 1 -Sunbelt/2 1 -sunbelt 1 -sunblock/1 1 -sunbonnet/1 1 -sunburn/23 1 -sunburst/1 1 -suncream -sundae/1 1 -Sundanese/2 1 -Sundas -Sunday/18 1 -sundeck/10 1 -sunder/11 1 -sundering 1 -sundial/1 1 -sundown/18 1 -sundress/89 1 -sundry/539 1 -sunfish/4 1 -sunflower/1 1 -Sung -sunglasses -sunglasses's -sung 1369 -sunhat/10 1 -sunken 1370 -Sunkist/3 -sunk 1370 -sunlamp/1 1 -sunless 1 -sunlight/2 1 -sunlit 1 -Sunni/1 1 -Sunnite/1 1 -sunrise/18 1 -sunroof/1 1 -sunscreen/1 1 -sunset/18 1 -sunshade/1 1 -sunshine/2 1 -sunshiny 1 -sunspot/1 1 -sunspots/89 1 -sunstroke/2 1 -suntan/133 1 -suntrap/10 1 -sunup/2 1 -sunny/49 1 -Sunnyvale -sup/47 1 -super/18 1 -superabundance/1 1 -superabundant 1 -superannuate/6 1 -superannuation/2 1 -superb/75 1 -Superbowl/3 -supercargo/4 1 -supercharge/6 1 -supercharger/1 1 -supercilious/16 1 -supercity/15 1 -supercomputer/1 1 -supercomputing -superconducting -superconductive -superconductivity/2 1 -superconductor/1 1 -supercooled -supercooling -superdense -superego/1 1 -supererogation/2 1 -supererogatory -superficial/8 1 -superficiality/2 1 -superficial 1 -superfine -superfix 1 -superfluity/15 1 -superfluous/8 1 -superfluousness/3 -Superfund/3 -Superglue/3 -superglue 1 -supergrass/89 1 -superheat/195 1 -superhero/71 1 -superhighway/1 1 -superhuman 1 -superimpose/6 1 -superimposition/2 1 -superintend/11 1 -superintendence/2 1 -superintendency/2 1 -superintendent/1 1 -Superior -superior/1 1 -superiority/2 1 -superlative/30 1 -Superman/3 -superman/2 1563 -supermarket/1 1 -supermen 1564 -supermodel/10 1 -supermom/1 1 -supernal 1 -supernatant 1 -supernatural/191 1 -supernova/57 1 -supernumerary/15 1 -superordinate 1 -superpose/6 1 -superposition/1 1 -superpower/1 1 -supersaturate/6 1 -supersaturation/2 1 -superscribe/6 1 -superscript/1 1 -superscription/2 1 -supersede/6 1 -supersonically -supersonic 1 -superstar/1 1 -superstate/10 1 -superstition/1 1 -superstitious/8 1 -superstore/1 1 -superstructure/1 1 -supertanker/1 1 -super 1 -superuser -superusers -supervene/6 1 -supervention/2 1 -supervise/6 1 -supervision/1 1 -supervisor/1 1 -supervisory -superwoman/2 1565 -superwomen 1566 -supine/8 1 -supp -supper/18 1 -suppertime 1 -suppl -supplant/11 1 -supple/540 1 -supplement/23 1 -supplemental 1 -supplementary 1 -supplementation/2 1 -supple 1 -suppliant/1 1 -supplicant/1 1 -supplicate/6 1 -supplication/1 1 -supplier/1 1 -supply/31 1 -supply's -support/78 1 -supportability 1 -supportable 1 -supporter/1 1 -supporting 1 -supportive -suppose/6 1 -supposed/8 1 -supposing 1 -supposition/1 1 -suppository/15 1 -suppress/7 1 -suppressant/1 1 -suppressible -suppression/2 1 -suppressive -suppressor/1 1 -suppurate/6 1 -suppuration/2 1 -supranational -supra 1 -supremacist/1 1 -supremacy/2 1 -supremal -supreme/45 1 -supremo/10 1 -supt -Supt -Surabaja -Surabaya -Surat -surcease/28 1 -surcharge/28 1 -surcingle/18 1 -surd 1 -sure/27 1 -surefire -surefooted -sure 1 -surety/15 1 -surf/23 1 -surface/28 1 -surfacing 1 -surfactant/10 1 -surfboard/23 1 -surfboarding 1 -surfeit/23 1 -surfeiting 1 -surfer/1 1 -surfing/2 1 -surge/28 1 -surgeon/1 1 -surgery/15 1 -surgical/8 1 -surging 1 -Surinam/2 1 -Suriname/2 1 -Surinamese -surlily -surly/49 1 -surmise/28 1 -surmising 1 -surmount/11 1 -surmountable 1 -surmounting 1 -surname/18 1 -surpass/7 1 -surpassing 1 -surplice/1 1 -surplus/541 1 -surprise/28 1 -surprised 1 -surprising/191 1 -surrealism/2 1 -surrealist/1 1 -surrealistic -surrealistically -surreality -surreal 1 -surrender/23 1 -surreptitious/8 1 -surreptitiousness/3 -surrey/1 1 -surrogacy/2 1 -surrogate/18 1 -surround/5 1 -surrounded 1 -surrounding/130 1 -surtax/22 1 -surtitle/10 1 -surveillance/2 1 -survey/23 1 -surveying/2 1 -surveyor/1 1 -survivability 1 -survivable -survival/1 1 -survivalist/1 1 -survive/6 1 -survivor/1 1 -Surya/2 1 -Susan/3 -Susana/3 -Susanna -Susanne/3 -susceptibility/15 1 -susceptible 1 -SUSE -sushi/2 1 -Susie/3 -suspect/23 1 -suspected 1 -suspect 1 -suspend/11 1 -suspender/1 1 -suspense/2 1 -suspenseful -suspension/1 1 -suspicion/18 1 -suspicious/8 1 -Susquehanna/2 1 -suss/7 1 -Sussex 1 -sustain/11 1 -sustainability 1 -sustainable -sustainably -sustained 1 -sustaining 1 -sustenance/2 1 -Sutherland/3 -sutler/1 1 -suttee 1 -Sutton/3 -suture/28 1 -SUV -Suva/2 1 -Suwanee/3 -Suzanne/3 -suzerain/1 1 -suzerainty/2 1 -Suzette/3 -Suzhou/3 -Suzuki/3 -Suzy/3 -Svalbard/2 1 -svelte/150 1 -Sven/3 -Svengali 1 -Sverdlovsk -SW/2 1 -swab/136 1 -swaddle/43 1 -swag/92 1 -swagger/78 1 -swaggerer 1 -swaggering 1 -Swahili/1 1 -swain/1 1 -SWAK -swallow/23 1 -swallower 1 -swallowtail/1 1 -swami/1 1 -Swammerdam/3 -swamp/23 1 -swampland/1 1 -swamp 1 -swampy/34 1 -swam 1567 -swan/133 1 -Swanee -swank/179 1 -swanker 1 -swanky/50 1 -swansdown/2 1 -Swansea/2 1 -Swanson/3 -swansong/10 1 -swap/47 1 -swappable -swapper/10 1 -swapping 1 -sward/18 1 -swarm/23 1 -swarming 1 -swarthy/34 1 -swash/22 1 -swashbuckler/1 1 -swashbuckling/2 1 -swashing 1 -swastika/1 1 -SWAT -swat/109 1 -swatch/4 1 -swath/23 1 -swathe/28 1 -swatter/23 1 -sway/23 1 -swayback/2 1 -swaybacked -swayback 1 -swaying 1 -Swazi/1 1 -Swaziland/2 1 -Swazi 1 -swear/121 1568 -swearer/1 1 -swearing 1 -swearword/1 1 -sweat/185 1 -sweatband/1 1 -sweater/1 1 -sweating 1 -sweatpants/2 1 -sweatshirt/1 1 -sweatshop/1 1 -sweatsuit/10 1 -sweaty/59 1 -Swed -swede/1 1 -Swede/1 1 -Sweden/2 1 -Swedenborg/3 -Swedish/2 1 -Sweeney/3 -sweep/86 1569 -sweepable -sweeper/1 1 -sweeping/542 1 -sweepstake/130 1 -Sweet -sweet/38 1 -sweetbread/1 1 -sweetbriar/1 1 -sweetbrier/1 1 -sweetcorn -sweeten/11 1 -sweetener/1 1 -sweetening/2 1 -sweetheart/1 1 -sweetie/1 1 -sweetish 1 -sweetmeat/1 1 -sweetshop 1 -swell/179 1570 -sweller 1 -swellhead/1 1 -swellheaded 1 -swelling/1 1 -swelter/23 1 -sweltering 1 -sweptback 1 -swept 1571 -swerve/28 1 -swerving 1 -swift/38 1 -Swift/2 1 -swift/58 1 -swifter 1 -swig/92 1 -swill/23 1 -swilling 1 -swim/543 1572 -swimmer/1 1 -swimming/37 1 -swimsuit/1 1 -swimwear -Swinburne/3 -swindle/28 1 -swindler/1 1 -swindling 1 -swine/2 1 -swineherd/1 1 -swines -swing/408 1573 -swingeing 1 -swinger/1 1 -swinging 1 -swinish 1 -swipe/28 1 -swirl/23 1 -swirling 1 -swirly/34 1 -swish/293 1 -swisher 1 -swishing 1 -swishy 1 -Swiss/4 1 -Swissair/3 -Swiss 1 -switch/147 1 -switchable -switchback/18 1 -switchblade/1 1 -switchboard/1 1 -switcher/1 1 -switchgear 1 -switching 1 -switchover -Switz -Switzerland/2 1 -swivel/23 1 -swiveling 1 -swiz 1 -swizzle/43 1 -swizzling 1 -swizz 1 -swob/136 1 -swollen 1574 -swoon/23 1 -swooning 1 -swoop/23 1 -swoosh/22 1 -swop/47 1 -swopping 1 -sword/18 1 -swordfish/4 1 -swordplay/2 1 -swordsman/2 1575 -swordsmanship/2 1 -swordsmen 1576 -swore 1577 -sworn 1577 -swot/479 1 -swotting 1 -swum 1567 -swung 1578 -sybarite/1 1 -sybaritic -Sybil/3 -sycamore/1 1 -sycophancy/2 1 -sycophant/1 1 -sycophantic -sycophantically -Sydney/2 1 -Sykes/3 -syllabary 1 -syllabicate/6 1 -syllabication/2 1 -syllabic 1 -syllabification/2 1 -syllabify/31 1 -syllable/18 1 -syllabub/10 1 -syllabus/4 1 -syllogism/1 1 -syllogistic 1 -sylph/1 1 -sylphic 1 -sylphlike 1 -sylvan 1 -Sylvester/3 -Sylvia/3 -Sylvie/3 -symbiont 1 -symbioses 1579 -symbiosis/2 1580 -symbiotically -symbiotic 1 -symbol/18 1 -symbolical/8 1 -symbolic 1 -symbolism/2 1 -symbolist 1 -symbolization/2 1 -symbolize/6 1 -symmetrical/8 1 -symmetric 1 -symmetrization 1 -symmetrizing -symmetry/15 1 -sympathetic/39 1 -sympathize/6 1 -sympathizer/1 1 -sympathy/344 1 -symphonic 1 -symphonists -symphony/15 1 -symposium/1 1 -symptom/1 1 -symptomatic/39 1 -symptomless 1 -syn -synagog/1 1 -synagogal -synagogue/1 1 -synapse/18 1 -synapses 1581 -synaptic 1 -sync/23 1 -synch/23 1 -synchronicity 1 -synchronization/1 1 -synchronize/6 1 -synchronous/8 1 -synchrony 1 -synchrotron 1 -syncopate/6 1 -syncopation/2 1 -syncope/2 1 -sync 1 -syndicalism 1 -syndicalist/10 1 -syndicate/28 1 -syndication/2 1 -syndrome/1 1 -synergism/2 1 -synergistic 1 -synergy/15 1 -synfuel/1 1 -Synge -synod/1 1 -synonym/1 1 -synonymic -synonymous/8 1 -synonymy/2 1 -synopses 1582 -synopsis/2 1583 -synopsizes -synoptic 1 -syntactical/8 1 -syntactic 1 -syntax/2 1 -syntheses 1584 -synthesis/2 1585 -synthesize/6 1 -synthesizer/1 1 -synthetic/1 1 -synthetically -synthetic 1 -syphilis/2 1 -syphilitic/1 1 -Syracuse/2 1 -Syria/2 1 -Syriac -Syrian/1 1 -syringe/28 1 -syrup/18 1 -syrupy 1 -sysadmin -sysadmins -sysop/10 1 -system/1 1 -systematic/39 1 -systematical -systematic 1 -systematization/2 1 -systematize/6 1 -systemic/1 1 -systemically -systemic 1 -systole/1 1 -systolic 1 -Szechuan/2 1 -Szilard/3 -Szymborska/3 -T/2 1 -t/544 1 -TA -Ta/2 1 -tab/136 1 -Tabasco/1 1 -Tabatha/3 -tabbouleh/2 1 -tabby/167 1 -tabernacle/1 1 -Tabernacle/1 1 -tabernacle/58 1 -Tabitha/3 -tabla/1 1 -table/28 1 -tableau/100 1 -tablecloth/1 1 -tableland/1 1 -tablespoon/1 1 -tablespoonful/1 1 -tablet/18 1 -tabletop/1 1 -tableware/2 1 -tabling 1 -tabloid/1 1 -taboo/23 1 -tabor/18 1 -Tabriz/4 1 -tabu/23 1 -tabular 1 -tabulate/6 1 -tabulation/1 1 -tabulator/1 1 -tabus 1 -tabu 1 -tachograph/10 1 -tachometer/1 1 -tachycardia/2 1 -tachyon/10 1 -tacit/16 1 -taciturn/8 1 -taciturnity/2 1 -Tacitus -tack/23 1 -tacker/1 1 -tackier 1586 -tackiest 1586 -tacking 1 -tackle/28 1 -tackler/1 1 -tackling 1 -tacky/49 1 -taco/1 1 -Tacoma/2 1 -tact/2 1 -tactful/16 1 -tactic/1 1 -tactical/8 1 -tactician/1 1 -tactile 1 -tactility/2 1 -tactless/16 1 -tactual 1 -Tad/3 -tad/1 1 -tadpole/1 1 -Tadzhik/2 1 -Tadzhikistan/2 1 -Taegu/2 1 -Taejon -taffeta/2 1 -taffrail/1 1 -taffy/15 1 -Taft/2 1 -tag/92 1 -Tagalog/1 1 -tagger/1 1 -tagliatelle 1 -Tagore -Tagus/2 1 -Tahiti/2 1 -Tahitian/1 1 -Tahoe -Taichung/2 1 -taiga/1 1 -tail/23 1 -tailback/1 1 -tailboard/10 1 -tailbone/10 1 -tailcoat/1 1 -tailgate/28 1 -tailgater/1 1 -tailing 1 -tailless/153 1 -taillight/1 1 -tailor/23 1 -tailorable -tailoring/2 1 -tailpiece/10 1 -tailpipe/1 1 -tailplane 1 -tailspin/1 1 -tail 1 -tailwind/1 1 -Tainan -Taine/3 -taint/23 1 -Taipei/2 1 -Taiping 1 -Taiwan/2 1 -Taiwanese/2 1 -Taiyuan -Tajikistan/2 1 -take/263 1587 -takeable -takeaway/10 1 -takeoff/1 1 -takeout/1 1 -takeover/1 1 -taker/1 1 -taking/130 1 -Taklamakan/3 -Talbot 1 -talc/2 1 -talcum/2 1 -tale/1 1 -talebearer/1 1 -talent/1 1 -talented -talentless 1 -Taliban/3 -Taliesin -talisman/1 1 -tali 1588 -talk/23 1 -talkative/16 1 -talker/1 1 -talkie/41 1 -talking 1 -talky/219 1 -tall/178 1 -Tallahassee/2 1 -tallboy/1 1 -Tallchief/3 -Talley/3 -Talleyrand/3 -tallier/1 1 -Tallinn/2 1 -tallish 1 -tallow/2 1 -tallowy 1 -Talmud/1 1 -Talmudic -Talmudist 1 -talon/1 1 -talus/4 1589 -tally/31 1 -tallyho/23 1 -tally's -tam/18 1 -tamable 1 -tamale/1 1 -Tamara/3 -tamarack/1 1 -tamarind/1 1 -tambourine/1 1 -tame/104 1 -tameable 1 -Tameka/3 -tamer/1 1 -Tamera/3 -Tamerlane/2 1 -tames 1590 -Tamika/3 -Tamil/1 1 -taming 1 -Tami's 1591 -Tami 1592 -Tammany/2 1 -Tammi/3 -Tammie/3 -Tammuz/2 1 -Tammy/3 -tamoxifen 1 -tamp/5 1 -Tampa/2 1 -Tampax/3 -tamper/5 1 -tamperer/1 1 -tampering 1 -tamping 1 -tampon/18 1 -Tamra/3 -tam 1 -Tamworth 1 -tan/267 1 -tanager/1 1 -tanbark/2 1 -Tancred -tandem/1 1 -tandoori/2 1 -Taney -T'ang -tang/18 1 -Tanganyika/2 1 -tangelo/1 1 -tangent/1 1 -tangential/8 1 -tangent 1 -tangerine/1 1 -tangibility/2 1 -tangible/545 1 -Tangier/1 1 -tangle/28 1 -tangling 1 -tango/23 1 -Tangshan -tangy/34 1 -Tania/3 -Tanisha/3 -tank/23 1 -tankard/1 1 -tanker/1 1 -tankful/1 1 -tanking 1 -Tanner/3 -tanner/1 1 -tannery/15 1 -Tannhauser/3 -tannin/1 1 -tanning/2 1 -tansy/2 1 -tantalization/2 1 -tantalize/6 1 -tantalizer/1 1 -tantalizing/8 1 -tantalum/2 1 -Tantalus/2 1 -tantamount -tantra/2 1 -tantra's 1593 -tantra 1594 -tantrum/1 1595 -Tanzania/2 1 -Tanzanian/1 1 -Tanya/3 -Tao/2 1 -Taoism/1 1 -Taoist/1 1 -tap/47 1 -tapas -tape/139 1 -tapeline/1 1 -taper/23 1 -tapering 1 -tapes 1596 -tapestry/167 1 -tapeworm/1 1 -tapioca/2 1 -tapir/1 1 -tapper/1 1 -tappet/1 1 -tapping 1 -taproom/1 1 -taproot/1 1 -tar/103 1 -Tara/2 1 -taramasalata 1 -tarantella/1 1 -Tarantino/3 -tarantula/1 1 -Tarawa/2 1 -Tarazed/3 -tarball/10 1 -Tarbell/3 -tardy/50 1 -tare/28 1 -Target/3 -target/23 1 -tariff/18 1 -Tarim -Tarkenton/3 -Tarkington -tarmac/64 1 -tarmacadam 1 -tarmac 1 -tarn/1 1 -tarnish/22 1 -taro/1 1 -tarot/1 1 -tarp/1 1 -tarpaulin/1 1 -tarpon/1 1 -tarragon/1 1 -tarrier 1 -tarring 1 -tarry/169 1 -tarsal/1 1 -tarsi 1597 -tarsus/2 1598 -tart/52 1 -tartan/1 1 -tartar/1 1 -Tartar/1 1 -tartaric -Tartary -tar 1 -Tartuffe 1 -tarty/546 1 -Tarzan/2 1 -Tasha/3 -Tashkent/2 1 -task/23 1 -tasking 1 -taskmaster/1 1 -taskmistress/4 1 -Tasman -Tasmania/2 1 -Tasmanian 1 -Tass -tassel/23 1 -tasseling 1 -taste/28 1 -tasteful/16 1 -tasteless/16 1 -taster/1 1 -tasting/1 1 -ta 1599 -tasty/50 1 -tat/479 1 -tatami/1 1 -Tatar/1 1 -Tate -tater/1 1 -tatter/23 1 -tatterdemalion/1 1 -tattie/447 1 -tatting/2 1 -tattle/28 1 -tattler/1 1 -tattletale/1 1 -tattling 1 -tattoo/23 1 -tattooer/1 1 -tattooist/1 1 -Tatum -tatty/219 1 -tau/1 1 -taught 1600 -taunt/23 1 -taunter/1 1 -taunting/8 1 -taupe/2 1 -Taurus/4 1 -taus 1 -taut/21 1 -tauten/11 1 -tautological/8 1 -tautologous -tautology/15 1 -taut 1 -tavern/1 1 -taverna/10 1 -tawdry/50 1 -Tawney -tawnier 1601 -tawniest 1601 -tawny/244 1 -tax/22 1 -taxable 1 -taxation/2 1 -taxer/1 1 -taxes 1602 -taxi/23 1 -taxicab/1 1 -taxidermist/1 1 -taxidermy/2 1 -taximeter/1 1 -taxing 1 -taxi's 1603 -taxis 1604 -taxi 1605 -taxiway/10 1 -taxman 1606 -taxmen 1607 -taxonomic -taxonomical 1 -taxonomist/1 1 -taxonomy/15 1 -taxpayer/1 1 -taxpaying -Taylor/2 1 -Tb/2 1 -TB/2 1 -TBA -Tbilisi/2 1 -tbs -tbsp -Tc/2 1 -Tchaikovsky -TD -TDD -Te/2 1 -tea/18 1 -teabag -teabags -teacake/1 1 -teach/547 1608 -teachable 1 -teacher/1 1 -teaching/1 1 -teacloth -teacup/1 1 -teacupful/1 1 -teak/1 1 -teakettle/1 1 -teal/1 1 -tealeaves -team/23 1 -teaming 1 -teammate/1 1 -teamster/1 1 -team 1 -teamwork/2 1 -teapot/1 1 -tear/23 1609 -tearaway/10 1 -teardrop/1 1 -tearful/83 1 -teargas/541 1 -tearing 1 -tearjerker/1 1 -tearless 1 -tearoom/1 1 -teary/34 1 -teas/7 1 -Teasdale/3 -tease/28 1 -teasel/18 1 -teaser/1 1 -teashop/10 1 -teasing/8 1 -teaspoon/1 1 -teaspoonful/1 1 -teat/1 1 -teatime/10 1 -teazel/70 1 -teazle/58 1 -tech/1 1 -techie/10 1 -technetium/2 1 -technical/8 1 -technicality/15 1 -technical 1 -technician/1 1 -technicolor 1 -Technicolor 1 -technique/1 1 -technocracy/15 1 -technocrat/1 1 -technocratic -technological/8 1 -technologist/1 1 -technology/15 1 -technophiles -technophobe/10 1 -technophobia 1 -technophobic -techno 1 -tech 1 -tectonic/35 1 -Tecumseh/2 1 -Ted/2 1 -ted/58 1 -Teddy/3 -teddy/60 1 -tedious/16 1 -tedium/2 1 -tee/63 1 -teem/11 1 -teeming 1 -teen/1 1 -teenage/336 1 -teenaged -teenager/1 1 -teensy/34 1 -teen 1 -teeny/34 1 -teenybopper/1 1 -teepee/1 1 -teeter/23 1 -teethe/6 1 -teething/2 1 -teethmarks -teeth 1610 -teetotaler/1 1 -teetotalism/2 1 -teetotal 1 -tee 1 -TEFL -Teflon/1 1 -Tegucigalpa/2 1 -Teheran/2 1 -Tehran -tektite/1 1 -telecast/86 1 -telecaster/1 1 -telecommunication/130 1 -telecommute/6 1 -telecommuter/1 1 -telecommuting/2 1 -telecoms -teleconference/28 1 -teleconferencing/2 1 -telegenic -telegram/18 1 -telegraph/23 1 -telegrapher/1 1 -telegraphese 1 -telegraphic -telegraphically -telegraphist/1 1 -telegraphy/2 1 -telekinesis/2 1 -telekinetic -Telemachus -Telemann -telemarketer/1 1 -telemarketing/2 1 -telemeter/18 1 -telemetry/15 1 -teleological -teleology 1 -telepathic/39 1 -telepathy/2 1 -telephone/28 1 -telephoner/1 1 -telephonic 1 -telephonist/10 1 -telephony/2 1 -telephoto/1 1 -telephotography/2 1 -teleplay/1 1 -teleprinter/1 1 -teleprocessing/2 1 -TelePrompter -teleprompter/1 1 -TelePrompTer 1 -telesales -telescope/28 1 -telescopic/39 1 -teletext/1 1 -telethon/1 1 -teletype/58 1 -Teletype 1 -teletypewriter/1 1 -televangelism/2 1 -televangelist/1 1 -televise/6 1 -television/1 1 -televisual -teleworker/10 1 -teleworking -telex/22 1 -Tell/2 1 -tell/141 1611 -Teller -teller/18 1 -telling/8 1 -telltale/1 1 -tellurium/2 1 -TELNET/548 1 -telnet 1 -tel 1 -Telugu/2 1 -telly/15 1 -temblor/1 1 -temerity/2 1 -temp/179 1 -Tempe -temper/23 1 -tempera/1 1 -temperament/1 1 -temperamental/8 1 -temperance/2 1 -temperate/16 1 -temperature/1 1 -tempering 1 -tempest/18 1 -tempestuous/16 1 -Templar/2 1 -template/1 1 -temple/1 1 -tempo/1 1 -temporal/8 1 -temporary/212 1 -temporize/6 1 -temporizer/1 1 -temporizing 1 -tempt/11 1 -temptation/1 1 -tempter/1 1 -tempting/8 1 -temptress/4 1 -tempura/2 1 -ten/350 1 -tenability/2 1 -tenable/19 1 -tenacious/16 1 -tenacity/2 1 -tenancy/15 1 -tenant/23 1 -tenantry/2 1 -tench 1 -tend/11 1 -tendency/15 1 -tendentious/16 1 -tender/52 1 -tenderer 1 -tenderfoot/1 1 -tenderhearted/33 1 -tenderheartedly -tendering 1 -tenderize/6 1 -tenderizer/1 1 -tenderloin/1 1 -tendinitis/2 1 -tendon/1 1 -tendonitis/2 1 -tendril/1 1 -tenement/1 1 -tenet/1 1 -tenfold 1 -Tenn -tenner/10 1 -Tennessean/1 1 -Tennessee/2 1 -tennis/2 1 -Tenochtitlan/3 -tenon/18 1 -tenor/1 1 -tenpin/130 1 -tens/393 1 -tense/107 1 -tensile 1 -tension/62 1 -tensional -tensity/2 1 -tensor/10 1 -tent/23 1 -tentacle/1 1 -tentacled -tentative/8 1 -tentativeness/3 -tentative 1 -tenterhook/1 1 -tenth/30 1 -tenting 1 -tenuity/2 1 -tenuous/16 1 -tenure/28 1 -Tennyson -Teotihuacan/3 -tepee/1 1 -tepid/16 1 -tepidity/2 1 -tequila/1 1 -terabyte/1 1 -terbium/2 1 -tercentenary/15 1 -tercentennial/1 1 -Terence -Teresa/3 -Tereshkova -Teri/3 -Terkel/3 -term/23 1 -termagant/1 1 -terminable 1 -terminal/30 1 -terminate/6 1 -termination/1 1 -terminator/10 1 -termini 1612 -terminological/8 1 -terminology/15 1 -terminus/2 1613 -termite/1 1 -termly 1 -tern/18 1 -ternary/15 1 -Terpsichore/2 1 -terpsichorean 1 -Terr/3 -Terra/3 -terrace/28 1 -terracing 1 -terracotta/2 1 -terraform/195 1 -terrain/1 1 -Terran/2 1 -Terrance/3 -terrapin/1 1 -terrarium/1 1 -terrazzo/1 1 -Terrell/3 -Terrence/3 -terrestrial/30 1 -Terri/3 -terrible/29 1 -Terrie/3 -terrier/1 1 -terrific/39 1 -terrify/31 1 -terrifying/8 1 -terrine/10 1 -territorial/30 1 -territoriality 1 -Territorial 1 -territory/15 1 -Territory 1 -terror/1 1 -terrorism/2 1 -terrorist/1 1 -terrorize/6 1 -terr 1 -Terry -terry/549 1 -terrycloth/2 1 -terse/27 1 -tertiary/60 1 -Tertiary/2 1 -tertiary 1 -TESL -Tesla -TESOL -Tess -Tessa/3 -tessellate/6 1 -tessellation/1 1 -tesseral -Tessie/3 -test/78 1 -testability 1 -testable 1 -testament/1 1 -testamentary -testate/10 1 -testator/1 1 -testatrix/184 1 -testbed -testbeds -testcard -tester/1 1 -testes 1614 -testicle/1 1 -testicular -testifier/1 1 -testify/31 1 -testimonial/1 1 -testimony/15 1 -testing/10 1 -testis/2 1615 -testosterone/2 1 -testy/50 1 -Tet/2 1 -tetanus/2 1 -tetchy/193 1 -tether/23 1 -Tethys/2 1 -Tetons -tetra/1 1 -tetrachloride 1 -tetracycline/2 1 -tetrahedral 1 -tetrahedron/1 1 -tetrameter/1 1 -Teuton/1 1 -Teutonic -Tevet/2 1 -Tex -TeX/89 1 -Texaco/3 -Texan/1 1 -Texas/2 1 -text/1 1 -textbook/1 1 -textile/1 1 -textual 1 -textually 1 -textural -texturally -texture/77 1 -TGIF -Th/2 1 -Thackeray -Thad/3 -Thaddeus -Thai/1 1 -Thailand/2 1 -Thai 1 -thalami 1616 -thalamus/2 1617 -Thales -Thalia/2 1 -thalidomide/2 1 -thallium/2 1 -Thames/2 1 -than -thane/1 1 -Thanh/3 -thank/11 1 -thankful/85 1 -thankless/16 1 -thanksgiving/1 1 -Thanksgiving/1 1 -Thant -Thar/3 -Tharp/3 -that/2 1 -thatch/22 1 -Thatcher -thatcher/1 1 -thatching/2 1 -that 1 -thaumaturge 1 -thaw/23 1 -thawing 1 -THC -Thea/2 1 -theater/1 1 -theatergoer/1 1 -theatrical/550 1 -theatricality/2 1 -theatrics -theatrics's -Thebes/2 1 -thee/70 1 -theft/1 1 -Theiler/3 -their/10 1 -theism/2 1 -theist/1 1 -theistic 1 -theist 1 -Thelma/3 -themas -thematic/39 1 -theme/77 1 -Themistocles -themselves 1 -them 1 -then/2 1 -thenceforth -thenceforward 1 -thence 1 -then 1 -theocracy/15 1 -theocratic -Theocritus -theodolite/10 1 -Theodora -Theodore/3 -Theodoric/3 -Theodosius/3 -theologian/1 1 -theological/8 1 -theologists -theology/15 1 -theorem/1 1 -theoretical/8 1 -theoretician/1 1 -theoretic 1 -theorist/1 1 -theorize/6 1 -theory/15 1 -theosophic -theosophical 1 -theosophist/1 1 -theosophy/2 1 -Theosophy 1 -therapeutic/32 1 -therapeutically -therapist/1 1 -therapy/15 1 -Theravada 1 -there/2 1 -thereabout/10 1 -thereafter -thereat 1 -thereby 1 -therefor -therefore -therefrom -therein 1 -thereof 1 -thereon 1 -Theresa -Therese/3 -thereto -theretofore -there 1 -thereunder -thereunto -thereupon -therewith -therm/1 1 -thermal/30 1 -thermionic 1 -thermistor/10 1 -thermochemical 1 -thermocouple/10 1 -thermodynamic/32 1 -thermodynamical/8 1 -thermoelectric -thermoluminescence 1 -thermometer/1 1 -thermometric 1 -thermonuclear -thermophile/10 1 -thermophilic -thermoplastic/1 1 -Thermopylae/2 1 -thermos/4 1 -thermostat/18 1 -thermostatic/39 1 -Thermos 1 -Theron/3 -thesauri 1618 -thesaurus/4 1619 -these/10 1 -theses 1620 -Theseus/2 1 -thesis/2 1621 -thespian/1 1 -Thespian 1 -Thespis/3 -Thessalonian/10 1 -Thessaloniki/3 -Thessaly/2 1 -theta/1 1 -the 1 -thew/1 1 -they'd -they'll -they're -they 1 -they've -thiamin/2 1 -thiamine/2 1 -thick/551 1 -thicken/11 1 -thickener/1 1 -thickening/1 1 -thicket/1 1 -thickheaded/2 1 -thicko/10 1 -thickset 1 -thief/120 1 -Thieu/3 -thieve/6 1 -thievery/2 1 -thieving/2 1 -thievish/153 1 -thigh/1 1 -thighbone/1 1 -thimble/18 1 -thimbleful/1 1 -Thimbu -Thimphu -thin/552 1 -thine 1 -thing/1 1 -thingamabob/1 1 -thingamajig/1 1 -thingumabob/10 1 -thingummy/60 1 -thingy/60 1 -think/141 1622 -thinkable 1 -thinker/1 1 -thinking/2 1 -thinner/1 1 -thinning 1 -thinnish -third/164 1 -thirst/23 1 -thirstiness/3 -thirsty/59 1 -thirteen/1 1 -thirteenth/1 1 -thirteen 1 -thirtieth/1 1 -thirty/15 1 -thistle/1 1 -thistledown/2 1 -this 1 -thither 1 -thole/18 1 -Thomas/2 1 -Thomism/2 1 -Thomistic -Thompson -Thomson -thong/1 1 -Thor/2 1 -thoracic -thorax/4 1 -Thorazine/2 1 -Thoreau/2 1 -thorium/2 1 -thorn/18 1 -thorniness/3 -Thornton/3 -thorny/34 1 -thorough/21 1 -thoroughbred/1 1 -Thoroughbred 1 -thoroughfare/1 1 -thoroughgoing 1 -Thorpe -those 1 -Thoth/2 1 -tho 1 -thou/18 1 -thought/1 1 -thoughtful/16 1 -thoughtless/16 1 -though 1 -thought 1623 -thousand/1 1 -thousandfold -thousandth/1 1 -thousand 1 -Thrace/2 1 -Thracian/2 1 -thraldom/2 1 -thrall/23 1 -thralldom/2 1 -thrash/22 1 -thrasher/1 1 -thrashing/1 1 -thread/23 1 -threadbare 1 -threader/1 1 -threadlike 1 -thready/34 1 -threat/18 1 -threaten/11 1 -threatening/8 1 -three/1 1 -threefold 1 -threepence/2 1 -threepenny 1 -threescore/1 1 -threesome/1 1 -three 1 -threnody/15 1 -thresh/22 1 -thresher/1 1 -threshing 1 -threshold/1 1 -threw 1624 -thrice 1 -thrift/1 1 -thriftless 1 -thrifty/50 1 -thrill/23 1 -thriller/1 1 -thrilling/8 1 -thrive/6 1 -thriving 1 -throat/18 1 -throaty/50 1 -throb/136 1 -throbbing 1 -throe/18 1 -thrombi 1625 -thromboses 1626 -thrombosis/2 1627 -thrombotic -thrombus/2 1628 -throne/77 1 -throng/23 1 -throttle/28 1 -throttler/1 1 -throttling 1 -throughout 1 -throughput/2 1 -through 1 -throughway/1 1 -throw/144 1629 -throwaway/1 1 -throwback/1 1 -thrower/1 1 -throwing 1 -throwout -thrum/160 1 -thrumming 1 -thrush/4 1 -thrust/86 1 -thruster/10 1 -thrusting 1 -thru 1 -thruway/1 1 -Thu -Thucydides/2 1 -thud/113 1 -thudding 1 -thug/1 1 -thuggery/2 1 -thuggish 1 -Thule/2 1 -thulium/2 1 -thumb/23 1 -thumbnail/1 1 -thumbprint/1 1 -thumbscrew/1 1 -thumbtack/18 1 -thump/23 1 -thumping's -thumping 1 -thunder/23 1 -Thunderbird/3 -thunderbolt/1 1 -thunderclap/1 1 -thundercloud/1 1 -thunderer/1 1 -thunderflashes -thunderhead/1 1 -thundering 1 -thunderous/8 1 -thundershower/1 1 -thunderstorm/1 1 -thunderstruck 1630 -thundery 1 -thunk/70 1 -Thur -Thurber -Thurman/3 -Thurmond/3 -Thurs -Thursday/1 1 -thus 1 -Thutmose/3 -thwack/23 1 -thwacker/1 1 -thwacking 1 -thwart/23 1 -thwarted 1 -thwarting 1 -thwart 1 -thyme/2 1 -thymine/2 1 -thymus/4 1 -thyristor/10 1 -thyroid/1 1 -thyroidal 1 -thyroid 1 -thyself 1 -thy 1 -ti/2 1 -Ti/2 1 -Tia/3 -Tianjin/2 1 -tiara/1 1 -Tiber/2 1 -Tiberius -Tibet/2 1 -Tibetan/1 1 -tibia/53 1 -tibial 1 -tic/64 1 -tick/23 1 -ticker/1 1 -ticket/23 1 -Ticketmaster/3 -ticking/2 1 -tickle/28 1 -tickler/1 1 -tickling 1 -ticklish/16 1 -ticktacktoe/2 1 -ticktock/18 1 -Ticonderoga -tidal/8 1 -tidbit/1 1 -tiddler/10 1 -tiddly 1 -tiddlywink/32 1 -Tide/3 -tide/28 1 -tideland/1 1 -tideless 1 -tidemark/10 1 -tidewater/1 1 -tideway/1 1 -tidier 1 -tiding/32 1 -tidy/275 1 -tie/77 1631 -tieback/1 1 -tiebreak -tiebreaker/1 1 -tiebreaks -Tienanmen/3 -Tientsin/2 1 -tiepin/10 1 -tier/62 1 -tiff/23 1 -Tiffany -tiffing 1 -tiger/1 1 -tigerish 1 -tight/434 1 -tighten/11 1 -tightener/1 1 -tightfisted 1 -tightrope/18 1 -tightwad/1 1 -tigress/4 1 -Tigris/2 1 -Tijuana/2 1 -tike/1 1 -tikes 1632 -til/553 1 -tilde/1 1 -tile/28 1 -tiler/1 1 -tiling/1 1 -till/23 1 -tillable 1 -tillage/2 1 -tiller/18 1 -Tillich -tilling 1 -Tillman/3 -Tilsit 1 -tilt/23 1 -tilting 1 -Tim/3 -timber/62 1 -timberland/2 1 -timberline/1 1 -timbre/1 1 -timbrel/1 1 -Timbuktu/2 1 -time/139 1 -timebase -timekeeper/1 1 -timekeeping/2 1 -timeless/33 1 -timelessly -timeless 1 -timely/49 1 -timeout/1 1 -timepiece/1 1 -timer/1 1 -timescale/10 1 -timeserver/1 1 -timeserving/2 1 -timeshare -timeshares -timestamped -timestamps -timetable/28 1 -timeworn -Timex/3 -timezone -timezones -timid/21 1 -timidity/2 1 -timid 1 -timing/1 1 -Timmy/3 -Timon/3 -Timor -timorous/16 1 -Timothy -timothy/2 1 -timpani/2 1 -timpanist/1 1 -Timur/2 1 -Timurid/3 -tin/133 1 -Tina/3 -tincture/28 1 -tinder/2 1 -tinderbox/4 1 -tine/18 1 -tinfoil/2 1 -Ting/3 -ting/23 1 -tinge/270 1 -tingle/28 1 -tingling/2 1 -tinglings -tingling 1 -tingly/34 1 -tinker/23 1 -Tinkerbell/3 -tinkerer/1 1 -tinkering 1 -Tinkertoy 1 -tinkle/28 1 -tinkling 1 -tinkly 1 -tinning 1 -tinnitus/2 1 -tinplate/2 1 -tinpot 1 -tinsel/23 1 -Tinseltown/3 -tinsel 1 -tinsmith/1 1 -tint/23 1 -tinting 1 -tintinnabulation/1 1 -Tintoretto -tin 1 -tintype/1 1 -tinware/2 1 -tiny/49 1 -tinny/50 1 -tip/47 1 -tipi/1 1 -Tippecanoe/3 -tipper/1 1 -Tipperary -tippet/1 1 -tippex -tippexed -tippexes -tippexing -tipping 1 -tipple/28 1 -tippler/1 1 -tipster/1 1 -tipsy/50 1 -tiptoe/63 1 -tiptop/1 1 -tirade/1 1 -Tirana/2 1 -Tirane -tire/28 1 -tired/21 1 -tireless/16 1 -Tiresias/2 1 -tiresome/16 1 -tiring 1 -tiro/2 1 -Tirol/2 1 -Tirolean 1 -Tisha/3 -Tishri/2 1 -tissue/18 1 -tit/18 1 -titan/1 1 -Titan/1 1 -Titania -Titanic -titanic/39 1 -titanium/2 1 -titbit/1 1 -titch/89 1 -titchy -titer/10 1 -tithe/28 1 -tither/1 1 -tithing 1 -titian/2 1 -Titian/2 1 -titian 1 -Titicaca -titillate/6 1 -titillating/8 1 -titillation/2 1 -titivate/6 1 -titivation/2 1 -title/28 1 -titleholder/1 1 -title 1 -titling 1 -titlist/1 1 -titmice 1633 -titmouse/2 1634 -Tito/3 -titrated -titration 1 -titter/23 1 -tittering 1 -tittivate/6 1 -tittle/18 1 -titular 1 -Titus -titty/60 1 -tizz 1 -tizzy/15 1 -TKO/2 1 -Tl/2 1 -Tlaloc/3 -TLC/2 1 -Tlingit/2 1 -TM -Tm/2 1 -tn -TN -tnpk -TNT/2 1 -toad/113 1 -toadstool/1 1 -toady/56 1 -toadyism/2 1 -toast/23 1 -toaster/1 1 -toasting 1 -toastmaster/1 1 -toastmistress/4 1 -toasty/219 1 -tobacco/1 1 -tobacconist/1 1 -Tobago/2 1 -Tobit -toboggan/23 1 -tobogganer/1 1 -tobogganing/2 1 -Toby 1 -Tocantins -toccata/10 1 -Tocqueville -tocsin/1 1 -Tod/3 -today/2 1 -Todd -toddle/28 1 -toddler/1 1 -toddy/15 1 -toe/63 1 -toecap/1 1 -toeclip/10 1 -TOEFL -toehold/1 1 -toenail/18 1 -toerag/10 1 -toe 1 -toff/10 1 -toffee/1 1 -toffy/15 1 -tofu/2 1 -tog/554 1 -toga/1 1 -togaed 1 -toge -together/33 1 -toggle/28 1 -Togo/2 1 -Togolese/2 1 -toil/23 1 -toiler/1 1 -toilet/23 1 -toiletry/15 1 -toilette/2 1 -toiling 1 -toilsome 1 -Tojo -Tokay/2 1 -toke/28 1 -token/18 1 -tokenism/2 1 -token 1 -Tokugawa -Tokyo/2 1 -Tokyoite 1 -told 1635 -tole/2 1 -Toledo/1 1 -tolerable/19 1 -tolerance/1 1 -tolerant/8 1 -tolerate/6 1 -toleration/2 1 -tole 1 -Tolkien -toll/23 1 -tollbooth/1 1 -tollgate/1 1 -tollway/1 1 -Tolstoy/2 1 -Toltec 1 -toluene/2 1 -Tolyatti/3 -tom/1 1 -Tom/2 1 -tom/58 1 -tomahawk/23 1 -Tomas -tomato/4 1 -tomb/23 1 -Tombaugh/3 -tombola/10 1 -tomboy/1 1 -tomboyish 1 -tombstone/1 1 -tomcat/18 1 -tome/1 1 -tomfoolery/15 1 -Tomlin/3 -Tommie/3 -Tommy 1 -tomographic -tomography/2 1 -tomorrow/1 1 -Tompkins/3 -Tomsk -tomtit/1 1 -tom 1 -Tom 1 -ton/18 1 -tonal/8 1 -tonality/15 1 -tone/28 1 -tonearm/1 1 -toneless/8 1 -toner/1 1 -tong/23 1 -Tonga/2 1 -Tongan/1 1 -tongue/28 1 -tongueless 1 -tonguing 1 -Toni/3 -Tonia/3 -tonic/1 1 -tonier 1636 -toniest 1636 -tonight/2 1 -tonnage/1 1 -tonne/1 1 -tonsil/1 1 -tonsillectomy/15 1 -tonsillitis/2 1 -tonsorial -tonsure/28 1 -Tonto/3 -tony/34 1 -Tonya/3 -Tony 1 -took 1637 -tool/23 1 -toolbar 1 -toolbox/4 1 -tooling 1 -toolkit 1 -toolmaker/1 1 -toolmaking 1 -toot/23 1 -tooter/1 1 -tooth/173 1638 -toothache/1 1 -toothbrush/4 1 -toothily 1 -toothless 1 -toothmarks -toothpaste/1 1 -toothpick/1 1 -toothsome 1 -toothy/34 1 -tootle/43 1 -tootling 1 -too 1 -tootsie/10 1 -toots 1 -top/296 1 -topaz/4 1 -topcoat/1 1 -topdressing/1 1 -topee/10 1 -Topeka/2 1 -topflight 1 -topi/10 1 -topiary/2 1 -topic/1 1 -topical/8 1 -topicality/2 1 -topis 1 -topknot/1 1 -topless 1 -topmast/1 1 -topmost 1 -topnotch 1 -topographer/1 1 -topographic -topographical/8 1 -topography/15 1 -topological/8 1 -topologist/10 1 -topology/60 1 -topper/1 1 -topping/1 1 -topple/6 1 -topsail/1 1 -topside/1 1 -topsoil/2 1 -topspin/2 1 -Topsy/3 -toque/1 1 -tor/1 1 -torah/1 1 -Torah/1 1 -torch/22 1 -torchbearer/1 1 -torchlight/2 1 -torchlit -toreador/1 1 -tore 1639 -tori 1640 -torment/23 1 -tormenter/1 1 -tormentingly -tormenting 1 -tormentor/1 1 -tornado/4 1 -torn 1639 -toroidal 1 -toroid 1 -Toronto/2 1 -torpedo/22 1 -torpid/8 1 -torpidity/2 1 -torpid 1 -torpor/2 1 -torque/28 1 -Torquemada -torques 1 -Torrance -Torrens -torrent/1 1 -torrential -torrent 1 -Torres -Torricelli/2 1 -torrid/21 1 -torridity/2 1 -tors/89 1 -torsion/1 1 -torsional -torso/1 1 -tort/1 1 -torte/1 1 -tortellini/1 1 -tortilla/1 1 -tortoise/1 1 -tortoiseshell/1 1 -Tortola -tortoni/2 1 -Tortuga -tortuous/16 1 -torture/28 1 -torturer/1 1 -torturing 1 -torturous 1 -torus 1641 -Torvalds/3 -Tory/15 1 -Tosca/3 -Toscanini -Toshiba/3 -tosh 1 -toss/22 1 -tosser/10 1 -tossing 1 -tossup/1 1 -tot/109 1 -total/210 1 -totalitarian/1 1 -totalitarianism/2 1 -totality/15 1 -totalizator/1 1 -totalizing -tote/28 1 -totem/1 1 -totemic 1 -toter 1 -Toto/3 -to 1 -totter/23 1 -totterer/1 1 -tottering 1 -totting 1 -toucan/1 1 -touch/22 1 -touchable 1 -touchdown/1 1 -touche/6 1 -touching/191 1 -touchline/10 1 -touchpaper -touchpapers -touchscreen/1 1 -touchstone/1 1 -touchy/50 1 -tough/52 1 -toughen/11 1 -toughener/1 1 -toughening 1 -toughie/1 1 -Toulouse -toupee/1 1 -tour/23 1 -tourer/10 1 -touring 1 -tourism/2 1 -tourist/1 1 -touristic 1 -tourist 1 -touristy 1 -tourmaline/2 1 -tournament/1 1 -tourney/18 1 -tourniquet/1 1 -tousle/43 1 -tout/23 1 -tow/23 1 -toward/10 1 -towboat/1 1 -towel/23 1 -towelette/1 1 -toweling/1 1 -tower/23 1 -towhead/1 1 -towheaded -towhee/1 1 -towing 1 -towline/1 1 -town/1 1 -townee/10 1 -Townes -townhouse/1 1 -townie/1 1 -Townsend/3 -townsfolk/2 1 -township/1 1 -townsman/2 1642 -townsmen 1643 -townspeople/2 1 -townswoman/2 1644 -townswomen 1645 -town 1 -towpath/1 1 -towrope/1 1 -toxemia/2 1 -toxicity/15 1 -toxicological 1 -toxicologist/1 1 -toxicology/2 1 -toxic 1 -toxin/1 1 -toy/23 1 -toyboy -toyboys -toying 1 -toymaker -Toynbee/3 -Toyoda/3 -Toyota/3 -toyshop 1 -toy 1 -TQM -tr -trace/28 1 -traceability 1 -traceable 1 -traceless 1 -tracer/1 1 -tracery/15 1 -Tracey/3 -trachea/53 1 -tracheal 1 -tracheotomy/15 1 -Traci/3 -Tracie/3 -tracing/1 1 -track/23 1 -trackball/1 1 -trackbed -tracker/1 1 -tracking 1 -trackless 1 -tracksuit/10 1 -trackway/10 1 -tract/1 1 -tractability/2 1 -tractable 1 -tractably 1 -traction/2 1 -tractor/1 1 -Tracy/3 -trad/89 1 -trade/139 1 -trademark/23 1 -tradeoff/1 1 -trader/1 1 -tradesman/2 1646 -tradesmen 1647 -tradespeople's 1648 -tradespeople 1649 -tradeswoman/2 1650 -tradeswomen 1651 -trading/1 1 -tradition/1 1 -traditional/8 1 -traditionalism/2 1 -traditionalist/1 1 -trad 1 -traduce/6 1 -traducer/1 1 -traducing 1 -Trafalgar/2 1 -traffic/64 1 -trafficker/1 1 -trafficking/2 1 -tragedian/1 1 -tragedienne/1 1 -tragedy/15 1 -tragical/8 1 -tragicomedy/15 1 -tragicomic -tragic 1 -trail/23 1 -trailblazer/1 1 -trailblazing/2 1 -trailer/18 1 -trailing 1 -Trailways/3 -train/23 1 -trainable 1 -trainee/1 1 -trainer/1 1 -training/1 1 -trainload/1 1 -trainman/2 1652 -trainmen 1653 -trainspotter -trainspotters -trainspotting -traipse/28 1 -traipsing 1 -trait/1 1 -traitor/1 1 -traitorous/8 1 -Trajan -trajectory/15 1 -tram/160 1 -tramcar/10 1 -tramlines -trammel/23 1 -tramp/23 1 -tramper/1 1 -tramping 1 -trample/28 1 -trampler/1 1 -trampling 1 -trampoline/28 1 -trampolining 1 -trampolinist 1 -tramway/10 1 -Tran/3 -trance/18 1 -tranche/10 1 -tranquil/75 1 -tranquility/2 1 -tranquilize/6 1 -tranquilizer/1 1 -tranquillize/6 1 -tranquillizer/1 1 -transact/11 1 -transaction/1 1 -transactional 1 -transactor/1 1 -transatlantic 1 -Transcaucasia -transceiver/1 1 -transcend/11 1 -transcendence/2 1 -transcendental/191 1 -transcendentalism/2 1 -transcendentalist/1 1 -transcendent 1 -transcontinental 1 -transcribe/6 1 -transcriber/1 1 -transcript/1 1 -transcription/1 1 -transcriptional 1 -transducer/1 1 -transduction 1 -transect/11 1 -transept/1 1 -transfer/103 1 -transferability 1 -transferable -transferal/1 1 -transferee/10 1 -transference/2 1 -transfiguration/2 1 -transfigure/6 1 -transfinite -transfinitely -transfix/7 1 -transform/23 1 -transformable -transformation/1 1 -transformational -transformer/1 1 -transforming 1 -transfuse/6 1 -transfusion/1 1 -transgender/3 -transgendered -transgenders -transgenic -transgress/7 1 -transgression/1 1 -transgressive 1 -transgressor/1 1 -transhipment -transience/2 1 -transiency/2 1 -transient/30 1 -transistor/1 1 -transistorize/6 1 -transit/23 1 -transition/23 1 -transitional/8 1 -transitive/36 1 -transitivity/2 1 -transitory 1 -transl -translatable 1 -translate/6 1 -translation/1 1 -translational 1 -translator/1 1 -transliterate/6 1 -transliteration/1 1 -translucence/2 1 -translucency/2 1 -translucent/8 1 -transmigrate/6 1 -transmigration/2 1 -transmissible -transmission/1 1 -transmissive 1 -transmit/12 1 -transmittable -transmittal/2 1 -transmittance/2 1 -transmitter/1 1 -transmogrification/2 1 -transmogrify/31 1 -transmutable 1 -transmutation/1 1 -transmute/6 1 -transnational/1 1 -transoceanic -transom/1 1 -transonic 1 -transpacific -transparency/15 1 -transparent/8 1 -transpiration/2 1 -transpire/6 1 -transplant/23 1 -transplantation/2 1 -transpolar -transponder/1 1 -transport/23 1 -transportability 1 -transportable -transportation/2 1 -transporter/1 1 -transporting 1 -transpose/6 1 -transposing 1 -transposition/1 1 -transputer/10 1 -transsexual/1 1 -transsexualism/2 1 -transship/105 1 -transshipment/2 1 -trans 1 -transubstantiation/2 1 -Transvaal/2 1 -transverse/164 1 -transvestism/2 1 -transvestite/1 1 -Transylvania -trap/47 1 -trapdoor/1 1 -trapeze/18 1 -trapezium/1 1 -trapezoid/1 1 -trapezoidal -trappable -trapper/1 1 -trapping/32 1 -Trappist/1 1 -trapshooting/2 1 -trash/22 1 -trashcan/1 1 -trashy/49 1 -trauma/1 1 -traumatic -traumatically -traumatize/6 1 -travail/23 1 -travel/78 1 -traveler/1 1 -traveling/1 1 -travelog/1 1 -travelogue/1 1 -traversal/1 1 -traverse/28 1 -traversing 1 -travesty/56 1 -Travis/3 -Travolta/3 -trawl/23 1 -trawler/1 1 -trawling 1 -tray/1 1 -treacherous/16 1 -treachery/15 1 -treacle/2 1 -treacly 1 -tread/86 1654 -treader 1 -treading 1 -treadle/28 1 -treadling 1 -treadmill/1 1 -treas -treason/2 1 -treasonable 1 -treasonous 1 -treasure/28 1 -treasurer/1 1 -treasurership 1 -treasury/15 1 -Treasury/15 1 -treat/23 1 -treatable 1 -treating 1 -treatise/1 1 -treatment/1 1 -treaty/15 1 -treble/28 1 -Treblinka -tree/63 1 -treeless 1 -treelike 1 -treeline -treetop/1 1 -trefoil/1 1 -trek/64 1 -trekker/1 1 -Trekkie/3 -trellis/22 1 -trematode/1 1 -tremble/28 1 -trembling/10 1 -tremblingly -tremendous/8 1 -tremolo/1 1 -tremor/18 1 -tremulous/16 1 -trench/22 1 -trenchancy/2 1 -trenchant/8 1 -trencher/1 1 -trencherman/2 1655 -trenchermen 1656 -trend/23 1 -trendily 1 -trendiness/3 -trendsetter/10 1 -trendsetting -trendy/42 1 -Trent/3 -Trenton/2 1 -trepanned -trepidation/1 1 -trespass/22 1 -trespasser/1 1 -tress/40 1 -trestle/1 1 -Trevelyan -Trevino/3 -Trevor/3 -trews 1 -Trey/3 -trey/1 1 -triad/1 1 -triadic 1 -triage/2 1 -trial/213 1 -trialed -trialing -trialling 1 -trial 1 -triangle/1 1 -triangulable -triangular/8 1 -triangulate/6 1 -triangulation/1 1 -Triangulum/3 -Triassic/2 1 -triathlete/10 1 -triathlon/1 1 -triatomic 1 -tribal/8 1 -tribalism/2 1 -tribe/1 1 -tribesman/2 1657 -tribesmen 1658 -tribeswoman/2 1659 -tribeswomen 1660 -tribulation/1 1 -tribunal/1 1 -tribune/1 1 -tributary/15 1 -tribute/1 1 -trice/2 1 -tricentennial/1 1 -triceps/4 1 -triceratops/2 1 -trice 1 -trichina/53 1 -trichinosis/2 1 -Tricia/3 -trick/23 1 -trickery/2 1 -tricking 1 -trickle/28 1 -trickling 1 -trickster/1 1 -trick 1 -tricky/50 1 -tricolor/1 1 -tricycle/18 1 -Trident/3 -trident/1 1 -triennial/30 1 -trier/1 1 -Trieste -triffid/10 1 -trifle/28 1 -trifler/1 1 -trifling 1 -trifocals -trifocals's -trig/555 1 -trigger/23 1 -triglyceride/1 1 -trigonometric -trigonometrical 1 -trigonometry/2 1 -trigram/10 1 -trig 1 -trike/18 1 -trilateral/10 1 -trilby/15 1 -trilingual 1 -trill/23 1 -trilling 1 -trillion/1 1 -trillionth/1 1 -trillion 1 -trillium/2 1 -trilobite/1 1 -trilogy/15 1 -trim/556 1 -trimaran/1 1 -trimester/1 1 -trimmer/1 1 -trimming/130 1 -trimodal -trimonthly 1 -Trimurti/2 1 -Trina/3 -Trinidad/2 1 -Trinidadian/1 1 -trinitrotoluene/2 1 -trinity/15 1 -Trinity/15 1 -trinket/18 1 -trio/1 1 -trios 1 -trip/47 1 -tripartite -tripe/2 1 -Tripitaka -triplane 1 -triple/467 1 -triplet/1 1 -triplex/4 1 -triplicate/28 1 -triplication 1 -tripling 1 -triply 1 -tripod/1 1 -tripodal -Tripoli/2 1 -tripos/89 1 -Trippe/3 -tripper/1 1 -tripping 1 -trips 1 -triptych/1 1 -tripwire/10 1 -trireme/1 1 -trisect/11 1 -trisection/2 1 -trisector 1 -Trisha/3 -Tristan/2 1 -trite/27 1 -tritium/2 1 -Triton/2 1 -triumph/23 1 -triumphalism 1 -triumphalist 1 -triumphal 1 -triumphant/8 1 -triumphing 1 -triumvir/1 1 -triumvirate/1 1 -trivalent -trivet/1 1 -trivia/2 1 -trivial/8 1 -triviality/15 1 -trivialization/1 1 -trivialize/6 1 -trivia's 1661 -trivia 1662 -trivium/2 1663 -Trobriand/3 -trochaic 1 -trochee/1 1 -trodden 1664 -trod 1664 -troglodyte/1 1 -troika/1 1 -Trojan/1 1 -troll/23 1 -trolley/18 1 -trolleybus/4 1 -trolling 1 -trollish -trollop/18 1 -Trollope -trolly/258 1 -trolly's -trombone/1 1 -trombonist/1 1 -tromp/11 1 -tron/192 1 -Trondheim/2 1 -troop/23 1 -trooper/1 1 -troopship/1 1 -trope/1 1 -trophy/167 1 -tropic/130 1 -tropical/8 1 -Tropicana/3 -tropic 1 -tropism/1 1 -tropopause 1 -troposphere/1 1 -tropospheric -trot/109 1 -troth/2 1 -Trotsky -trotter/1 1 -trotting 1 -troubadour/1 1 -trouble/28 1 -troubled 1 -troublemaker/1 1 -troubleshoot/11 1665 -troubleshooter/1 1 -troubleshooting/2 1 -troubleshot 1666 -troublesome/8 1 -troubling 1 -trough/1 1 -trounce/6 1 -trouncer/1 1 -trouncing 1 -troupe/28 1 -trouper/1 1 -trouser/138 1 -trousseau/100 1 -trout/1 1 -trove/1 1 -trow/11 1 -trowel/23 1 -troy/10 1 -Troy/4 1 -troy 1 -truancy/2 1 -truant/23 1 -truce/18 1 -truck/23 1 -Truckee/3 -trucker/1 1 -trucking/2 1 -truckle/28 1 -truckling 1 -truckload/1 1 -truculence/2 1 -truculent/8 1 -Trudeau -trudge/28 1 -trudging 1 -Trudy/3 -true/254 1 -truelove/1 1 -Truffaut/3 -truffle/1 1 -trug/10 1 -truism/1 1 -Trujillo -truly 1 -Truman/2 1 -Trumbull/3 -Trump/3 -trump/23 1 -trumpery/2 1 -trumpet/23 1 -trumpeter/1 1 -trumpeting 1 -truncate/6 1 -truncation/1 1 -truncheon/18 1 -trundle/28 1 -trundler/1 1 -trunk/86 1 -trunking 1 -trunnion/10 1 -truss/22 1 -trussing 1 -trust/23 1 -trustee/18 1 -trusteeship/1 1 -trustful/16 1 -trusting/8 1 -trustworthy/49 1 -trusty/42 1 -truth/1 1 -truthful/16 1 -Truth 1 -try/56 1 -trying/8 1667 -tryout/1 1 -tryst/23 1 -tsarina/1 1 -tsarism 1 -tsarist/10 1 -tsetse/1 1 -Tsimshian/2 1 -Tsingtao -Tsiolkovsky/3 -Tsitsihar/3 -Tsongkhapa/3 -tsp -tsunami/1 1 -Tswana/2 1 -Tu -Tuamotu/3 -Tuareg/2 1 -tub/18 1 -tuba/57 1 -tubal 1 -tubby/34 1 -tube/28 1 -tubeless/2 1 -tuber/1 1 -tubercle/1 1 -tubercular 1 -tuberculin/2 1 -tuberculosis/2 1 -tuberculous -tuberose/2 1 -tuberous -tubful/1 1 -tubing/2 1 -Tubman -tubular 1 -tubule/1 1 -tuck/23 1 -Tucker/3 -tucker/23 1 -Tucuman/3 -Tucson/2 1 -Tudor/1 1 -Tue -Tues/2 1 -Tuesday/1 1 -tuft/23 1 -tufter/1 1 -tufting 1 -tug/92 1 -tugboat/1 1 -tugging 1 -tuition/2 1 -Tulane/3 -tularemia/2 1 -tulip/1 1 -Tull/3 -tulle/2 1 -Tulsa/2 1 -Tulsidas/3 -tum/10 1668 -tumble/28 1 -tumbledown -tumbler/1 1 -tumbleweed/1 1 -tumbling/2 1 -tumbrel/1 1 -tumbril/1 1 -tumescence/2 1 -tumescent -tumidity/2 1 -tumid 1 -tummy/15 1 -tumor/1 1 -tumorous -Tums/2 1 -tumult/18 1 -tumultuous/8 1 -tumulus 1 -tun/18 1 -tuna/1 1 -tunable 1 -tundra/1 1 -tune/28 1 -tuneful/16 1 -tuneless/8 1 -tuner/1 1 -tuneup/1 1 -tungsten/2 1 -Tungus/2 1 -Tunguska/3 -tunic/1 1 -tuning/10 1 -Tunis/2 1 -Tunisia/2 1 -Tunisian/1 1 -tunnel/23 1 -tunneler/1 1 -tunneling/10 1 -Tunney/3 -tunny/15 1 -Tupi/2 1 -tuppence/10 1 -tuppenny -Tupperware -Tupungato/2 1 -tuque/1 1 -turban/1 1 -turbaned -turbidity/2 1 -turbid 1 -turbine/1 1 -turbo/1 1 -turbocharge/6 1 -turbocharger/1 1 -turbocharging 1 -turbofan/1 1 -turbojet/1 1 -turboprop/1 1 -turbot/1 1 -turbulence/2 1 -turbulent/8 1 -turd/1 1 -tureen/1 1 -turf/23 1 -turfing 1 -turfy/34 1 -Turgenev -turgid/8 1 -turgidity/2 1 -Turin/2 1 -Turing/3 -Turk/1 1 -Turkestan/2 1 -turkey/1 1 -Turkey/2 1 -Turkic/1 1 -Turkish/2 1 -Turkmenistan/2 1 -turmeric/1 1 -turmoil/18 1 -turn/23 1 -turnabout/1 1 -turnaround/1 1 -turnbuckle/1 1 -turncoat/1 1 -Turner -turner/1 1 -turning/1 1 -turnip/18 1 -turnkey/1 1 -turnoff/1 1 -turnout/1 1 -turnover/1 1 -turnpike/1 1 -turnstile/1 1 -turntable/1 1 -turpentine/2 1 -Turpin -turpitude/2 1 -turps 1 -turquoise/1 1 -turret/1 1 -turreted -turtle/18 1 -turtledove/1 1 -turtleneck/1 1 -turtlenecked -Tuscaloosa/3 -Tuscan/2 1 -Tuscany/2 1 -Tuscarora/1 1 -Tuscon/3 -tush/40 1 -tusk/62 1 -Tuskegee/3 -Tussaud/3 -tussle/28 1 -tussock/1 1 -tussocky 1 -Tut/3 -tut/109 1 -Tutankhamen -tutelage/2 1 -tutelary 1 -tutor/23 1 -tutorial/1 1 -tutorship/2 1 -Tutsi 1 -tuts 1 -tutti/1 1 -Tutu/3 -tutu/1 1 -Tuvalu/2 1 -Tuvaluan -tux/4 1 -tuxedo/1 1 -TV/1 1 -TVA -TWA/3 -twaddle/28 1 -twaddler/1 1 -twaddling 1 -Twain -twain/2 1 -twang/23 1 -twanging 1 -twangy/34 1 -twas -twat/10 1 -tweak/23 1 -Tweed -tweed/130 1 -Tweedledee/3 -Tweedledum/3 -tweedy/34 1 -tween -tweeness -tweet/23 1 -tweeter/1 1 -twee 1 -tweezers -tweezers's -twelfth/1 1 -twelve/1 1 -twelvemonth/1 1 -twelve 1 -twentieth/1 1 -twenty/15 1 -twerp/1 1 -twice 1 -twiddle/28 1 -twiddler 1 -twiddling 1 -twiddly/34 1 -twig/92 1 -twiggy/34 1 -Twila/3 -twilight/2 1 -twilit 1 -twill/173 1 -twin/557 1 -twine/28 1 -twiner/1 1 -twinge/28 1 -twinight 1 -twining 1 -twink/58 1 -Twinkies -twinkle/28 1 -twinkling/1 1 -twinkly 1 -twinning 1 -twinset/10 1 -twirl/23 1 -twirler/1 1 -twirly/34 1 -twist/23 1 -twisted 1 -twister/1 1 -twisting 1 -twisty/34 1 -twit/109 1 -twitch/22 1 -twitching 1 -twitchy/34 1 -twitter/23 1 -twittering 1 -twittery 1 -twitting 1 -twixt -Twizzlers/3 -two/1 1 -twofer/1 1 -twofold 1 -twopence/1 1 -twopenny 1 -twosome/1 1 -two 1 -twp -Twp -TWX -TX -tzar/1 1 -tzarina/1 1 -tzarism 1 -tzarist/10 1 -Ty/3 -Tycho -tycoon/1 1 -tying 1669 -tyke/1 1 -Tylenol/2 1 -Tyler/2 1 -tympani/2 1 -tympanist/1 1 -tympanum/1 1 -Tyndale -Tyndall -type/28 1 -typecast/121 1 -typeface/1 1 -typeless -typescript/1 1 -typeset/88 1 -typesetter/1 1 -typesetting/2 1 -typewrite/317 1670 -typewriter/1 1 -typewriting/2 1 -typewrote 1671 -typhoid/2 1 -typhoon/1 1 -typhus/2 1 -typical/8 1 -typicality/2 1 -typification/2 1 -typify/31 1 -typing/2 1 -typist/1 1 -typo/1 1 -typographer/1 1 -typographic -typographical/8 1 -typography/2 1 -typological/8 1 -typology/15 1 -tyrannical/8 1 -tyrannicide 1 -tyrannic 1 -tyrannize/6 1 -tyrannosaur/1 1 -tyrannosaurus/4 1 -tyrannous 1 -tyrant/1 1 -tyranny/15 1 -Tyre -Tyree/3 -tyro/1 1 -Tyrol/2 1 -Tyrolean 1 -Tyrone -tyrosine 1 -Tyson/3 -ttys -U/2 1 -UAR -UAW -Ubangi 1 -ubiquitously -ubiquitous 1 -ubiquity/2 1 -UBS/3 -Ubuntu/3 -Ucayali -Uccello/3 -UCLA/3 -Udall -udder/1 1 -Ufa/2 1 -UFO/1 1 -ufologist/1 1 -ufology/2 1 -Uganda/2 1 -Ugandan/1 1 -ugh 1 -uglification 1 -ugly/49 1 -uh -UHF/2 1 -Uighur/2 1 -Ujungpandang/3 -UK/2 1 -ukase/1 1 -ukelele/1 1 -Ukraine/2 1 -Ukrainian/1 1 -ukulele/1 1 -UL -Ulaanbaatar/2 1 -ulcer/18 1 -ulcerate/6 1 -ulceration/1 1 -ulcerous 1 -ulna/53 1 -ulnar 1 -ulster/1 1 -Ulster/2 1 -ulterior 1 -ultimate/37 1 -ultimatum/1 1 -ultimo -ultra/1 1 -ultraconservative/1 1 -ultrahigh -ultralight/1 1 -ultramarine/2 1 -ultramodern -ultramontane 1 -ultrasonic/276 1 -ultrasound/1 1 -Ultrasuede/2 1 -ultra 1 -ultraviolet/2 1 -ult 1 -ululate/6 1 -ululation/1 1 -Ulyanovsk -Ulysses/2 1 -um -umbel/1 1 -umber/2 1 -umbilical 1 -umbilici 1672 -umbilicus/2 1673 -umbra/1 1 -umbrage/2 1 -umbrageous 1 -umbrage 1 -umbrella/18 1 -Umbriel/3 -umiak/1 1 -umlaut/18 1 -ump/23 1 -umpire/28 1 -umpteenth 1 -umpteen 1 -UN/2 1 -unabashed/8 1 -unabated 1 -unable 1 -unabridged/1 1 -unabsorbed -unaccented -unacceptability 1 -unacceptable/19 1 -unaccepted -unaccommodating 1 -unaccompanied -unaccomplished -unaccountability 1 -unaccountable/19 1 -unaccounted -unaccredited -unaccustomed 1 -unachievable 1 -unacknowledged -unacquainted -unactivated -unadapted -unadaptive 1 -unaddressable -unaddressed -unadjusted -unadorned -unadulterated 1 -unadventurous 1 -unadvertised -unadvised/8 1 -unaesthetic -unaffectedly -unaffected 1 -unaffiliated -unaffordable -unafraid -unaided 1 -unalienable -unaligned -unalike -unallocated -unalloyed -unalterable/19 1 -unaltered -unambiguity 1 -unambiguous/8 1 -unambitious 1 -unamended -unamused -unanimity/2 1 -unanimous/8 1 -unannotated -unannounced -unanswerable 1 -unanswered -unanticipated -unapologetic 1 -unapparent 1 -unappealing/8 1 -unappeased -unappetizing 1 -unappreciated -unappreciative 1 -unapproachable -unappropriated -unapproved -unarchived -unarguable/19 1 -unarmed -unarmored -unaroused -unashamed/8 1 -unasked -unassailable 1 -unassailed -unassertive 1 -unassigned -unassisted -unassociated -unassuaged -unassuming/8 1 -unattached -unattainable/19 1 -unattained -unattended -unattenuated 1 -unattested -unattractive/83 1 -unattributable 1 -unattributed -unaudited -unauthentic -unauthenticated -unauthorized -unavailability/2 1 -unavailable 1 -unavailing/8 1 -unavenged -unavoidable/19 1 -unawakened -unaware/489 1 -unbaked -unbalance/43 1 -unbanned -unbanning -unbaptized -unbar/13 1 -unbearable/19 1 -unbeatable -unbeaten -unbecoming/8 1 -unbeknown -unbeknownst -unbelief/2 1 -unbelievability -unbelievable/19 1 -unbelieved -unbeliever/1 1 -unbelieving 1 -unbend/382 1 -unbending 1 -unbiased/8 1 -unbiassedly -unbidden -unbid 1 -unbind/121 1674 -unbinding 1 -unbleached -unblemished -unblinking/8 1 -unblock/11 1 -unbloodied -unblushing/8 1 -unboiled -unbolt/11 1 -unbooked -unborn 1675 -unbosom/11 1 -unbounded 1 -unbound 1676 -unbowed -unbraced -unbracketed -unbranded -unbreakability -unbreakable 1 -unbridgeable -unbridged -unbridled -unbroken 1 -unbruised -unbuckle/6 1 -unbundled -unburden/11 1 -unburied -unburned -unburnt -unbutton/11 1 -uncalibrated -uncalled -uncanceled -uncanny/59 1 -uncap/105 1 -uncared -uncaring -uncased -uncatalogued -uncaught 1 -unceasing/8 1 -uncelebrated -uncensored -unceremonious/8 1 -uncertain/8 1 -uncertainty/15 1 -unchain/11 1 -unchallengeable 1 -unchallenged -unchangeable 1 -unchanged -unchanging 1 -unchaperoned -uncharacteristic/39 1 -uncharged -uncharismatic -uncharitable/19 1 -uncharted -unchaste/150 1 -uncheckable -unchecked -unchristened -unchristian 1 -unchronicled -uncial/2 1 -uncircumcised -uncivil/8 1 -uncivilized -unclad 1677 -unclaimed -unclasp/11 1 -unclassifiable 1 -unclassified -uncle/18 1 -unclean/396 1 -uncleaned -uncleanly/140 1 -unclear/166 1 -uncleared -unclench/195 1 -unclimbable -unclimbed -uncloak/11 1 -unclog/117 1 -unclosed -unclothe/6 1678 -unclouded 1 -uncluttered -uncoil/11 1 -uncollated -uncollected -uncollimated -uncolored 1 -uncombed -uncombined -uncomfortable/55 1 -uncommitted -uncommon/21 1 -uncommunicative 1 -uncompensated -uncompetitive/153 1 -uncompilable -uncomplaining/8 1 -uncompleted -uncomplicated -uncomplimentary -uncompounded -uncomprehending/8 1 -uncompressed -uncompromisable -uncompromising/8 1 -unconcealed -unconcern/173 1 -unconcerned/8 1 -unconditional/8 1 -unconditioned 1 -unconfined -unconfirmed -unconformable 1 -unconfused 1 -uncongenial 1 -unconnected 1 -unconquerable 1 -unconquered -unconscionable/19 1 -unconscious/239 1 -unconsecrated -unconsidered -unconsoled -unconsolidated -unconstitutional/8 1 -unconstitutionality/2 1 -unconstrained -unconsumed -unconsummated -uncontainable -uncontaminated -uncontentious 1 -uncontested 1 -uncontrollable/19 1 -uncontrolled -uncontroversial/8 1 -unconventional/8 1 -unconventionality/2 1 -unconverted -unconvinced -unconvincing/8 1 -uncooked -uncool 1 -uncooperative 1 -uncoordinated -uncork/11 1 -uncorrectable 1 -uncorrected -uncorrelated 1 -uncorroborated -uncorrupted 1 -uncountable -uncountably -uncounted -uncouple/6 1 -uncouth/83 1 -uncover/11 1 -uncrackable -uncreased -uncreated -uncreative 1 -uncredited -uncritical/8 1 -uncross/7 1 -uncrossable -uncross 1 -uncrowded -uncrowned -uncrushable -unction/1 1 -unctuous/16 1 -uncultivated -uncultured -uncured -uncurl/11 1 -uncustomary 1 -uncut 1 -undamaged -undated -undaunted/8 1 -undead 1 -undeceive/6 1 -undecidability 1 -undecidable -undecided/1 1 -undecipherable 1 -undeclared -undecorated -undefeated 1 -undefended -undefiled -undefinable -undefined 1 -undeliverable -undelivered -undemanding -undemocratic/39 1 -undemonstrative/8 1 -undeniable/19 1 -undependable 1 -underachieve/6 1 -underachievement 1 -underachiever/1 1 -underact/11 1 -underage 1 -underarm/18 1 -underbellies -underbelly/3 -underbid/474 1 -underbrush/2 1 -undercarriage/1 1 -undercharge/28 1 -underclass/4 1 -underclassman/2 1679 -underclassmen 1680 -underclothes -underclothes's -underclothing/2 1 -undercoat/23 1 -undercoating/1 1 -undercooked -undercover -undercurrent/1 1 -undercut/128 1 -underdeveloped -underdevelopment/2 1 -underdog/1 1 -underdone -undereducated -underemphasis 1 -underemployed -underemployment/2 1 -underestimate/28 1 -underestimation/1 1 -underexploited -underexpose/6 1 -underexposure/1 1 -underfed 1681 -underfeed/121 1682 -underfloor -underflow 1 -underfoot -underframe 1 -underfund/241 1 -underfunding 1 -underfur/2 1 -undergarment/1 1 -undergo/302 1683 -undergrad/10 1 -undergraduate/1 1 -underground/1 1 -undergrowth/2 1 -underhand -underhanded/16 1 -underinvestment 1 -underlain 1684 -underlay/18 1685 -underlie/58 1686 -underline/28 1 -underling/1 1 -underlining/10 1 -underlip/1 1 -underloaded -underlying 1684 -undermanned -undermentioned -undermine/6 1 -undermining 1 -undermost -underneath/1 1 -undernourished -undernourishment/2 1 -underpants/2 1 -underpart/1 1 -underpass/4 1 -underpay/312 1 -underpayment/1 1 -underperformed -underpin/192 1 -underpinning/1 1 -underplay/11 1 -underpopulated -underpopulation -underpowered -underpricing -underprivileged -underproduction/2 1 -underrate/6 1 -underrepresented -underscore/28 1 -undersea/10 1 -undersealed -undersecretary/15 1 -undersell/121 1687 -undersexed -undershirt/1 1 -undershoot/121 1688 -undershorts/2 1 -undershot 1689 -underside/1 1 -undersign/11 1 -undersigned's -undersize -undersized -underskirt/1 1 -undersold 1690 -underspecification -underspecified -underspend/481 1 -understaffed -understand/121 1691 -understandability 1 -understandable/19 1 -understander 1 -understanding/30 1 -understate/6 1 -understatement/1 1 -understocked -understood 1692 -understorey -understory 1 -understrength -understudy/56 1 -undertake/76 1693 -undertaker/1 1 -undertaking/1 1 -underthings/2 1 -undertone/1 1 -undertook 1694 -undertow/1 1 -under 1 -underused -underusing -underutilized -undervaluation/2 1 -undervalue/6 1 -underwater 1 -underway -underwear/2 1 -underweight/2 1 -underwent 1695 -underwhelm/11 1 -Underwood/3 -underworld/1 1 -underwrite/317 1696 -underwriter/1 1 -underwrote 1697 -undeserved/8 1 -undeserving 1 -undesirability/2 1 -undesirable/82 1 -undesired -undetectability -undetectable/19 1 -undetected -undetermined -undeterred -undetonated -undeveloped -undeviating 1 -undiagnosable -undiagnosed -undies -undies's -undifferentiated -undigested -undignified 1 -undiluted -undiminished -undimmed -undiplomatic 1 -undirected -undiscerning 1 -undischarged -undisciplined -undisclosed -undiscovered -undiscriminated -undiscriminating 1 -undisguised -undisguisedly -undismayed -undisplayed -undisputed 1 -undissipated -undissolved -undistinguished -undistorted 1 -undistributed -undisturbed -undivided -undo/413 1 -undocumented -undoing/1 1 -undomesticated -undoubted/8 1 -undramatic -undreamed -undreamt 1 -undress/22 1 -undressing 1 -undress 1 -undrinkability -undrinkable -undroppable -undue 1 -undulant -undulate/6 1 -undulation/1 1 -unduly 1 -undying 1 -unearned -unearth/11 1 -unearthliness/3 -unearthly 1 -unease/2 1 -uneasy/50 1 -uneatable -uneaten -uneconomic -uneconomical/8 1 -unedifying -unedited -uneducated -unelectable -unelected -unembarrassed -unemotional/8 1 -unemphatic 1 -unemployable 1 -unemployed/2 1 -unemployment/2 1 -unenclosed -unencrypted -unencumbered -unending 1 -unendurable 1 -unenforceable -unenforced 1 -unengaged -unenlightened -unenlightening -unentered -unenterprising 1 -unenthusiastic/39 1 -unenviable 1 -unequal/8 1 -unequaled -unequal 1 -unequipped -unequivocal/8 1 -unergonomic -unerring/8 1 -UNESCO/2 1 -unescorted -unessential 1 -unestablished -unethical/8 1 -unevaluated -uneven/21 1 -uneventful/8 1 -unexacting -unexamined -unexampled -unexceptionable/19 1 -unexceptional/8 1 -unexcited -unexciting 1 -unexcused 1 -unexpanded -unexpected/16 1 -unexpired -unexplainable 1 -unexplained 1 -unexploded -unexploited -unexplored -unexposed -unexpressed -unexpurgated -unfading -unfailing/8 1 -unfair/21 1 -unfaithful/16 1 -unfalsifiable -unfaltering 1 -unfamiliar -unfamiliarity/2 1 -unfashionable/19 1 -unfasten/11 1 -unfathomable -unfathomably -unfathomed -unfatigued -unfavorable/19 1 -unfavored -unfazed -unfeasible/19 1 -unfed 1 -unfeeling/8 1 -unfeigned 1 -unfeminine 1 -unfenced -unfertilized -unfetchable -unfetter/11 1 -unfilled -unfiltered -unfinished 1 -unfired -unfit/558 1 -unfitting 1 -unfix/7 1 -unflagging/8 1 -unflappability/2 1 -unflappable -unflappably -unflattering 1 -unflavored -unfledged -unflinching/8 1 -unfocused -unfocussed -unfold/11 1 -unfolding 1 -unforced 1 -unfordable -unforeseeable 1 -unforeseen -unforgettable/19 1 -unforgivable/19 1 -unforgiven -unforgiving 1 -unforgotten -unformed -unformulated -unfortified -unfortunate/30 1 -unfounded 1 -unframed -unfreeze/14 1698 -unfrequented -unfriendly/49 1 -unfrock/11 1 -unfrozen 1699 -unfroze 1699 -unfruitful -unfulfillable -unfulfilled -unfunded -unfunny 1 -unfurl/11 1 -unfurnished -unfussy 1 -ungainly/49 1 -Ungava -ungenerous/8 1 -ungentlemanly -ungentle 1 -ungerminated -unglamorous 1 -unglazed -unglued -ungodly/49 1 -ungovernable 1 -ungoverned -ungraceful/8 1 -ungracious/8 1 -ungraded -ungrammatical/8 1 -ungrateful/16 1 -ungrounded -ungrudging 1 -unguarded 1 -unguent/1 1 -unguessable -unguided 1 -ungulate/1 1 -unhallowed -unhampered -unhand/11 1 -unhandy/34 1 -unhappily -unhappiness -unhappiness's -unhappy/34 1 -unhardened -unharmed -unharness/7 1 -unharvested -unhatched -unhealed -unhealthful 1 -unhealthy/50 1 -unheard 1 -unheated -unheeded 1 -unhelpful/8 1 -unheralded -unheroic -unhesitating/8 1 -unhidden -unhindered -unhinge/6 1 -unhistorical 1 -unhitch/7 1 -unholy/49 1 -unhonored -unhook/11 1 -unhoped -unhorse/6 1 -unhurried/8 1 -unhurt 1 -unhygienic 1 -unhyphenated -uni/10 1 -unicameral -UNICEF/2 1 -unicellular -Unicode/3 -unicorn/1 1 -unicycle/18 1 -unicyclist/10 1 -unideal -unidentifiable 1 -unidentified -unidiomatic 1 -unidirectional -unifiable -unification/2 1 -unifier 1 -uniform/559 1 -uniformity/2 1 -unify/31 1 -unilateral/8 1 -unilateralism 1 -unilateralist 1 -Unilever/3 -unillustrated -unimaginable/19 1 -unimaginative/8 1 -unimagined -unimpaired -unimpeachable 1 -unimpeded -unimplementable -unimplemented -unimportance 1 -unimportant 1 -unimposing -unimpressed -unimpressive 1 -unimproved -unincorporated -uninfected -uninfluenced -uninformative/8 1 -uninformed -uninhabitable -uninhabited -uninhibited/8 1 -uninitialized -uninitiated -uninjured -uninspired -uninspiring 1 -uninstall -uninstallable -uninstalled -uninstaller/3 -uninstallers -uninstalling -uninstalls -uninstructed 1 -uninsulated -uninsured -unintellectual 1 -unintelligent 1 -unintelligible/19 1 -unintended 1 -unintentional/8 1 -uninterested/8 1 -uninteresting 1 -uninterpretable -uninterpreted -uninterrupted/8 1 -unintuitive 1 -uninvented -uninvited 1 -uninviting 1 -uninvolved -union/1 1 -Union/1 1 -unionism/2 1 -unionist/1 1 -Unionist 1 -unionization/2 1 -unionize/6 1 -union 1 -Union 1 -unipolar -unique/27 1 -Uniroyal/3 -unisex/2 1 -unison/2 1 -unissued -unit/18 1 -Unitarian/1 1 -Unitarianism/1 1 -unitary 1 -Unitas/3 -unite/43 1 -united/8 1 -uniting 1 -unitize/6 1 -unit 1 -unity/15 1 -univ -univalent 1 -univalve/1 1 -universal/30 1 -universalism 1 -universality/2 1 -universalize/6 1 -universe/1 1 -university/15 1 -UNIX/2 1 -Unix/89 1 -unixism -unixisms -unjam/560 1 -unjaundiced -unjust/83 1 -unjustifiable/19 1 -unjustified -unkempt 1 -unkind/396 1 -unkindly 1 -unknightly 1 -unknowable/2 1 -unknowing/191 1 -unknown/1 1 -unlabeled -unlace/6 1 -unladen -unladylike -unlamented -unlatch/7 1 -unlawful/16 1 -unleaded -unleaded's -unlearn/11 1 -unlearned 1 -unleash/7 1 -unleavened -unless 1 -unlettered -unlicensed -unlighted -unlikable 1 -unlike/561 1 -unlikeable 1 -unlikelihood/2 1 -unlikely/140 1 -unlike 1 -unlimber/11 1 -unlimited 1 -unlined -unlink/195 1 -unlisted -unlit 1 -unlivable -unload/11 1 -unloading 1 -unlock/11 1 -unloose/6 1 -unloosen/11 1 -unlovable 1 -unloved -unlovely/34 1 -unloving -unlucky/50 1 -unmade 1700 -unmagnified -unmaintainable -unmaintained -unmake/14 1701 -unman/192 1 -unmanageable/19 1 -unmanly/34 1 -unmannerly 1 -unmapped -unmarked -unmarketable -unmarred -unmarried 1 -unmask/11 1 -unmatchable -unmatched -unmeaning 1 -unmeant 1 -unmeasurable 1 -unmeasured 1 -unmechanized -unmediated -unmeetable -unmelodious 1 -unmemorable 1 -unmemorized -unmentionable/130 1 -unmentioned -unmerciful/8 1 -unmerited 1 -unmet -unmindful 1 -unmissable -unmistakable/19 1 -unmistakeable -unmistakeably -unmitigated 1 -unmixed 1 -unmnemonic -unmodifiable -unmodified -unmolested -unmonitored -unmorality/2 1 -unmoral 1 -unmotivated -unmounted -unmovable -unmoved -unmoving -unmusical/8 1 -unmutilated -unmuzzled -unnameable -unnamed -unnatural/16 1 -unnavigable 1 -unnecessary/211 1 -unneeded -unnerve/6 1 -unnervingly -unnoticeable 1 -unnoticed -unnumbered -unobjectionable -unobliging -unobservable -unobservant 1 -unobserved -unobstructed -unobtainable -unobtrusive/16 1 -unoccupied -unoffensive 1 -unofficial/8 1 -unopened -unopposed -unoptimized -unordered -unorganized -unoriginality 1 -unoriginal 1 -unorthodox 1 -unorthodoxy 1 -unowned -unpack/11 1 -unpackers -unpaid -unpainted -unpaired -unpalatable 1 -unparalleled -unparallelled -unpardonable/19 1 -unparodied -unpasted -unpasteurized -unpatriotic 1 -unpaved -unpeeled -unpeople 1702 -unperceived -unperceptive 1 -unperformed -unperson/1 1703 -unpersonalized -unpersuaded -unpersuasive 1 -unperturbed -unphysical 1 -unpick/11 1 -unpin/192 1 -unplaced -unplanned -unplayability -unplayable -unpleasant/16 1 -unpleasing 1 -unploughed -unplug/117 1 -unplumbed -unpoetical 1 -unpolished -unpolitical 1 -unpolluted -unpopularity/2 1 -unpopular 1 -unpopulated -unportable -unpractical 1 -unpracticed -unprecedented/8 1 -unpredictability/2 1 -unpredictable/19 1 -unpredicted -unprejudiced 1 -unpremeditated -unprepared/33 1 -unprepossessing 1 -unpressed -unpressurized -unpretending -unpretentious/8 1 -unpreventable -unprincipled -unprintable 1 -unprinted -unprivileged -unproblematic -unprocessed -unproductive/8 1 -unprofessional/8 1 -unprofitable/19 1 -unpromising -unprompted -unpronounceable -unpronounced -unpropitious 1 -unprotected 1 -unprovable -unproved -unproven -unprovided -unprovoked -unpublicized -unpublishable -unpublished -unpunctuality 1 -unpunctual 1 -unpunished -unqualified 1 -unquantifiable -unquantified -unquenchable -unquestionable/19 1 -unquestioned -unquestioning/8 1 -unquiet/166 1 -unquote/6 1 -unraisable -unrated -unravel/11 1 -unreachable -unreached -unreadability 1 -unreadable 1 -unread 1 -unready/34 1 -unrealistic/39 1 -unreality/2 1 -unrealizable -unrealized -unreal 1 -unreasonable/29 1 -unreasoned -unreasoning 1 -unreceived -unreceptive 1 -unrecognizable/19 1 -unrecognized -unrecommended -unreconciled -unreconstructed -unrecorded -unrecoverable -unredeemed -unreduced -unreel/11 1 -unrefereed -unreferenced -unreferencing -unrefined -unreflected -unreformed -unrefreshed -unrefrigerated -unregarded 1 -unregenerate -unregistered -unregulated -unrehearsed -unrelated 1 -unreleasable -unreleased -unrelenting/8 1 -unreliability/2 1 -unreliable/19 1 -unrelieved -unrelievedly -unremarkable 1 -unremarked -unremembered -unremitting/8 1 -unrepairable -unrepeatability -unrepeatable -unrepeated -unrepentant/8 1 -unreported -unrepresentable -unrepresentative 1 -unrepresented -unreproducible 1 -unrequested -unrequited -unreserved/8 1 -unresistant -unresisting -unresistingly -unresolvable -unresolved -unresponsive/16 1 -unrest/2 1 -unrestrained 1 -unrestricted 1 -unrest 1 -unrevealed -unrevised -unrewarded -unrewarding -unriddle 1 -unrighteous/33 1 -unripe/150 1 -unripened -unrivaled -unroll/11 1 -unromantic 1 -unruffled -unruly/49 1 -unsaddle/6 1 -unsafe/250 1 -unsalable 1 -unsaleable 1 -unsalted -unsanctioned -unsanitary 1 -unsatisfactory/243 1 -unsatisfiable -unsatisfied -unsatisfying -unsaturated -unsaved -unsavory 1 -unsay/312 1 -unscaled -unscathed -unscented -unscheduled -unschooled -unscientific/39 1 -unscramble/6 1 -unscratched -unscrew/11 1 -unscripted -unscrupulous/16 1 -unseal/11 1 -unsealable -unsearchable 1 -unseasonable/19 1 -unseasonal -unseasoned -unseat/11 1 -unseaworthiness -unsecured -unseeded -unseeing/8 1 -unseemly/49 1 -unseen/1 1 -unsegmented -unsegregated -unselected -unselfconscious/8 1 -unselfish/16 1 -unsellable -unsentimental 1 -unsent 1 -unserviceable 1 -unserviced -unsettle/6 1 -unsettled 1 -unset 1 -unshackle/6 1 -unshaded -unshakable/19 1 -unshakeable -unshaken -unshaped -unshapely 1 -unsharable -unshared -unshaven -unsheathe/6 1 -unshielded -unshod -unshorn 1 -unshrinking 1 -unsifted -unsighted -unsightlier -unsightliest -unsightly/140 1 -unsigned -unsimplified -unsinkable -unskilful 1 -unskilled -unskillful/8 1 -unsliced -unsmiling/8 1 -unsnap/105 1 -unsnarl/11 1 -unsociable 1 -unsocial 1 -unsoiled -unsolder 1 -unsold 1704 -unsolicited -unsolvable 1 -unsolved -unsophisticated 1 -unsophistication 1 -unsorted -unsought 1 -unsound/21 1 -unspanned -unsparing/8 1 -unspeakable/19 1 -unspecific 1 -unspecified -unspectacular 1 -unspent 1 -unspoiled -unspoilt 1 -unspoken 1705 -unsporting 1 -unsportsmanlike -unstable/17 1 -unstack/241 1 -unstained -unstamped -unstated -unsteady/50 1 -unsterilized -unsticking -unstimulated -unstinting/8 1 -unstirred -unstop/105 1 -unstoppable/19 1 -unstrap/105 1 -unstressed -unstretchable -unstructured -unstrung 1706 -unstuck 1707 -unstudied -unsubdued -unsubscribe -unsubscribed -unsubscribes -unsubscribing -unsubsidized -unsubstantial 1 -unsubstantiated -unsubstituted -unsubtle/19 1 -unsuccessful/8 1 -unsuitability/2 1 -unsuitable/55 1 -unsuited -unsullied -unsung 1 -unsupervised -unsupportable 1 -unsupported 1 -unsuppressed -unsure/153 1 -unsurfaced -unsurpassed -unsurprised -unsurprising/8 1 -unsurvivable -unsuspected 1 -unsuspecting/8 1 -unsustainable -unswappable -unswayed -unsweetened -unswerving/8 1 -unsymmetrical 1 -unsympathetic/39 1 -unsystematic -untactful 1 -untagged -untainted -untalented -untamed -untangle/6 1 -untanned -untapped -untarnished -untasted -untaught 1708 -untaxed -untaxing -unteachable -untempered -untenability 1 -untenable 1 -untenanted -untended -unterminated -untestable -untested -untethered -untextured -unthinkable/19 1 -unthinking/8 1 -unthoughtful 1 -untidy/50 1 -untie/122 1709 -until 1 -untimely/49 1 -untiring/8 1 -untitled -unto -untold 1 -untouchable/1 1 -untouched -untoward 1 -untraceable -untrained -untrammeled -untransformed -untranslatable -untranslated -untransportable -untrappable -untraveled -untreatable -untreated -untried 1 -untrimmed 1 -untrodden 1710 -untrod 1710 -untroubled -untrue/150 1 -untruly 1 -untrusted -untrustworthy 1 -untruth/1 1 -untruthful/16 1 -unturned -untutored -untwist/11 1 -untying 1711 -untyped -untypical/8 1 -Unukalhai/3 -unusable/19 1 -unused -unusual/8 1 -unutterable/19 1 -unvalidated -unvanquished -unvaried 1 -unvarnished -unvarying/8 1 -unveil/11 1 -unveiling 1 -unventilated -unverifiable -unverified -unversed -unvisitable -unvisited -unvoiced -unwaged -unwanted 1 -unwarned -unwarrantable/19 1 -unwarranted 1 -unwary/50 1 -unwashed 1 -unwatchable -unwatched -unwavering/8 1 -unwearable -unwearied 1 -unwedge -unwed 1 -unweighted -unwelcome -unwelcoming -unwell 1 -unwholesome/33 1 -unwieldy/49 1 -unwilling/16 1 -unwind/121 1712 -unwindable -unwisdom 1 -unwise/45 1 -unwitting/8 1 -unwonted 1 -unworkability 1 -unworkable 1 -unworldly/140 1 -unworn 1 -unworried -unworthy/50 1 -unwounded -unwound 1713 -unwoven 1714 -unwrap/105 1 -unwrinkled -unwritten -unzip/105 1 -unyielding 1 -unyoke/6 1 -up/562 1 -Upanishads -upbeat/1 1 -upbraid/11 1 -upbraiding 1 -upbringing/1 1 -UPC -upchuck/11 1 -upcoming -upcountry/2 1 -updatability -update/28 1 -updater 1 -Updike -updraft/1 1 -upend/11 1 -upfront 1 -upgradable -upgrade/28 1 -upgradeable -upgrade 1 -upgradings -upheaval/1 1 -upheld 1715 -uphill/1 1 -uphold/121 1716 -upholder/1 1 -upholding 1 -upholster/11 1 -upholsterer/1 1 -upholstery/2 1 -UPI -Upjohn/3 -upkeep/2 1 -upland/1 1 -uplift/23 1 -uplifting/10 1 -upload/11 1 -upmarket -upon -upper/1 1 -uppercase/2 1 -upperclassman/2 1717 -upperclassmen 1718 -upperclasswoman -upperclasswomen -uppercut/128 1 -uppermost -upping 1 -uppish 1 -uppity 1 -upraise/6 1 -uprate/251 1 -uprear/11 1 -upright/220 1 -uprising/1 1 -upriver 1 -uproar/1 1 -uproarious/8 1 -uproot/11 1 -uprooting 1 -UPS -upscale 1 -upset/128 1 -upsetting 1 -upshot/1 1719 -upside/1 1 -upsilon/1 1 -upstage/43 1 -upstairs -upstanding 1 -upstart/23 1 -upstate/2 1 -upstream 1 -upstroke/1 1 -upsurge/28 1 -upswing/18 1 -uptake/1 1 -uptempo 1 -upthrust/86 1 -uptick/1 1 -uptight 1 -Upton/3 -uptown/2 1 -uptrend 1 -upturn/23 1 -upturning 1 -upward/191 1 -upwelling 1 -upwind 1 -Ur -uracil/2 1 -Ural/10 1 -Urania/2 1 -uranium/2 1 -Uranus/2 1 -Urban/3 -urban/166 1 -urbane/45 1 -urbanity/2 1 -urbanization/2 1 -urbanize/6 1 -urbanologist/1 1 -urbanology/2 1 -urchin/1 1 -Urdu/2 1 -urea/2 1 -uremia/2 1 -uremic -ureter/1 1 -urethane/2 1 -urethra/53 1 -urethral -urethritis 1 -Urey -urge/28 1 -urgency/2 1 -urgent/8 1 -urging/10 1 -Uriah -uric 1 -Uriel -urinal/1 1 -urinalyses 1720 -urinalysis/2 1721 -urinary 1 -urinate/6 1 -urination/2 1 -urine/2 1 -Uris -URL/10 1 -urn/18 1 -urogenital -urological -urologist/1 1 -urology/2 1 -Urquhart -Ursa/3 -ursine 1 -Ursula -Ursuline 1 -urticaria/2 1 -Uruguay/2 1 -Uruguayan/1 1 -Urumqi -US/2 1 -us/89 1722 -USA/2 1 -usability/2 1 -usable 1 -USAF -usage/1 1 -USCG -USDA -use/28 1 -useability/2 1 -useable 1 -useful/16 1 -useless/16 1 -Usenet/1 1 -user/1 1 -usher/23 1 -usherette/1 1 -USIA -USMC -USN -USO -USP -USPS -USS -USSR/2 1 -Ustinov -usu -usual/37 1 -usurer/1 1 -usurious 1 -usurp/11 1 -usurpation/2 1 -usurper/1 1 -usury/2 1 -UT/2 1 -Utah/2 1 -Utahan/1 1 -Utahn 1 -Ute/1 1 -utensil/1 1 -uterine -uteri 1723 -uterus/2 1724 -utilitarian/1 1 -utilitarianism/2 1 -utility/15 1 -utilizable -utilization/2 1 -utilize/6 1 -utmost/2 1 -utopia/1 1 -Utopia/1 1 -utopian/1 1 -Utopian/1 1 -Utrecht/2 1 -Utrillo/2 1 -u 1 -utter/305 1 -utterance/1 1 -utterer 1 -uttering 1 -uttermost/2 1 -UV/2 1 -uvula/1 1 -uvular/1 1 -uxorious 1 -Uzbek/2 1 -Uzbekistan/2 1 -Uzi/1 1 -v/374 1 -V/2 1 -Va -VA -vac/70 1 -vacancy/15 1 -vacant/8 1 -vacate/6 1 -vacation/23 1 -vacationer/1 1 -vacationist/1 1 -vaccinate/6 1 -vaccination/1 1 -vaccine/1 1 -vacillate/6 1 -vacillating 1 -vacillation/1 1 -vacuity/2 1 -vacuole/1 1 -vacuous/16 1 -vacuum/23 1 -Vader/3 -Vaduz/2 1 -vagabond/23 1 -vagabondage/2 1 -vagarious 1 -vagary/15 1 -vagina/53 1 -vaginal -vaginally -vagrancy/2 1 -vagrant/1 1 -vague/27 1 -vain/75 1 -vainglorious/8 1 -vainglory/2 1 -val -Val/3 -valance/18 1 -Valarie/3 -Valdez/2 1 -vale/1 1 -valediction/1 1 -valedictorian/1 1 -valedictory/15 1 -valence/1 1 -Valencia/1 1 -valency/15 1 -Valenti/3 -Valentin/3 -valentine/1 1 -Valentine/2 1 -Valentino -Valenzuela/3 -Valeria/3 -Valerian/3 -Valerie/3 -Valery -vales 1725 -valet/23 1 -valeting 1 -valetudinarian/1 1 -valetudinarianism/2 1 -Valhalla/2 1 -valiance/2 1 -valiant/8 1 -valid/16 1 -validate/6 1 -validation/1 1 -validity/2 1 -valise/1 1 -Valium/1 1 -Valkyrie/1 1 -Vallejo -Valletta/2 1 -valley/1 1 -Valois -valor/2 1 -valorous/8 1 -Valparaiso/2 1 -valuable/1 1 -valuate/6 1 -valuation/1 1 -value/28 1 -valueless 1 -valuer/1 1 -valve/28 1 -valveless 1 -Valvoline/3 -valvular -vamoose/6 1 -vamp/23 1 -vamping 1 -vampire/18 1 -Van -van/133 1 -vanadium/2 1 -Vance -Vancouver/2 1 -vandal/1 1 -Vandal/1 1 -vandalism/2 1 -vandalize/6 1 -Vanderbilt -Vandyke 1 -vane/1 1 -Vanessa/2 1 -Vang/3 -vanguard/1 1 -vanilla/1 1 -vanish/156 1 -vanishing/191 1 -vanity/15 1 -vanning 1 -vanquish/7 1 -vanquisher/1 1 -vantage/1 1 -Vanuatu/2 1 -Vanzetti/3 -vapid/16 1 -vapidity/2 1 -vapor/18 1 -vaporization/2 1 -vaporize/6 1 -vaporizer/1 1 -vaporous 1 -vaporware/10 1 -vapory 1 -vaquero/1 1 -var/10 1 -Varanasi -Varese -Vargas -variability/2 1 -variable/82 1 -variance/1 1 -variant/1 1 -variate/70 1 -variation/1 1 -variational 1 -varicolored -varicose 1 -varied 1 -variegate/6 1 -variegation/2 1 -varietal/1 1 -variety/15 1 -various/8 1 -varlet/1 1 -varmint/1 1 -varnish/22 1 -varnishing 1 -varsity/15 1 -vary/31 1 -varying 1 -vascular 1 -vase/1 1 -vasectomy/15 1 -Vaseline/18 1 -vasomotor -Vasquez/3 -vassal/18 1 -vassalage/2 1 -vassal 1 -Vassar/3 -vast/38 1 -vat/1 1 -VAT/2 1 -vat/12 1 -Vatican/2 1 -Vauban -vaudeville/2 1 -vaudevillian/1 1 -Vaughan -Vaughn/3 -vault/23 1 -vaulter/1 1 -vaulting/2 1 -vaunt/23 1 -vaunting 1 -VAX/89 1 -Vazquez/3 -vb -VCR/2 1 -VD/2 1 -VDT -VDU -veal/2 1 -Veblen/3 -vector/23 1 -vectorization -vectorized -Veda/1 1 -Vedanta 1 -veejay/1 1 -veep/1 1 -Veep 1 -veer/23 1 -veering 1 -veg/563 1 -Vega/1 1 -vegan/1 1 -vegeburger/10 1 -Vegemite/3 -vegetable/1 1 -vegetarian/1 1 -vegetarianism/2 1 -vegetate/6 1 -vegetation/2 1 -vegetational -vegetative -vegges -veggie/1 1 -veggieburger/10 1 -vehemence/2 1 -vehemency/2 1 -vehement/8 1 -vehicle/1 1 -vehicular -veil/23 1 -veiled 1 -veiling 1 -vein/23 1 -veining 1 -Vela -velar/1 1 -Velasquez/3 -vela 1726 -Velazquez -Velcro/1 1 -veld/1 1 -veldt/1 1 -Velez/3 -vellum/2 1 -Velma/3 -velocipede/1 1 -velocity/15 1 -velodrome/10 1 -velor -velour's -velours's -velum/2 1727 -Velveeta/2 1 -velvet/18 1 -velveteen/1 1 -velvet 1 -velvety/34 1 -venal/8 1 -venality/2 1 -venation/2 1 -vend/11 1 -vender/1 1 -vendetta/1 1 -vendible 1 -vendor/1 1 -veneer/23 1 -veneering 1 -venerability/2 1 -venerable -venerate/6 1 -veneration/2 1 -venereal -Venetian/1 1 -venetian 1 -Venezuela/2 1 -Venezuelan/1 1 -vengeance/2 1 -vengeful/8 1 -venial 1 -Venice/2 1 -venireman/2 1728 -veniremen 1729 -venison/2 1 -Venn/3 -venom/2 1 -venomous/8 1 -venom 1 -venous 1 -vent/23 1 -ventilate/6 1 -ventilation/2 1 -ventilator/1 1 -venting 1 -Ventolin/2 1 -ventral/8 1 -ventricle/1 1 -ventricular -ventriloquism/2 1 -ventriloquist/1 1 -ventriloquy/2 1 -venture/28 1 -venturesome/16 1 -ventures 1730 -venturing 1 -venturous/16 1 -venue/1 1 -Venus/4 1 -Venusian 1 -Vera/3 -veracious/8 1 -veracity/2 1 -Veracruz/2 1 -veranda/1 1 -verandah/1 1 -verb/1 1 -verbal/164 1 -verbalization/2 1 -verbalize/6 1 -verbatim -verbena/1 1 -verbiage/1 1 -verbose/83 1 -verbosity/2 1 -verboten -verdant/8 1 -Verde -Verdi -verdict/1 1 -verdigris/22 1 -Verdun/2 1 -verdure/2 1 -verge/28 1 -verger/1 1 -Vergil/2 1 -verifiability 1 -verifiable 1 -verification/1 1 -verifier/10 1 -verify/31 1 -verisimilitude/2 1 -veritable/19 1 -verity/15 1 -Verizon/3 -Verlaine/3 -Vermeer -vermicelli/2 1 -vermiculite/2 1 -vermiform -vermilion/2 1 -vermillion/2 1 -vermin/2 1 -verminous 1 -Vermont/2 1 -Vermonter/1 1 -vermouth/2 1 -Vern/3 -Verna/3 -vernacular/1 1 -vernal 1 -Verne -vernier/1 1 -Vernon/3 -Verona/2 1 -Veronese -veronica/2 1 -Veronica 1 -verruca/57 1 -Versailles/2 1 -versatile 1 -versatility/2 1 -verse/28 1 -versicle 1 -versification/2 1 -versifier/1 1 -versify/31 1 -versing 1 -version/1 1 -verso/1 1 -versus -vertebra/53 1 -vertebral 1 -vertebrate/1 1 -vertex/4 1 -vertical/30 1 -vertiginous -vertigo/2 1 -verve/2 1 -very/59 1 -Vesalius/2 1 -vesicle/1 1 -vesicular 1 -vesiculate 1 -Vespasian -vesper/1 1 -Vespers -vesper 1 -Vespucci/2 1 -vessel/1 1 -vest/23 1 -Vesta/2 1 -vestal/1 1 -vestibular -vestibule/18 1 -vestige/1 1 -vestigial/8 1 -vesting/2 1 -vestment/1 1 -vestry/15 1 -vestryman/2 1731 -vestrymen 1732 -Vesuvius/2 1 -vet/109 1 -vetch/4 1 -veteran/1 1 -veterinarian/1 1 -veterinary/15 1 -veto/22 1 -vet 1 -vex/7 1 -vexation/1 1 -vexatious/8 1 -vexed 1 -vexing 1 -VF -VFW/2 1 -VG -VGA -vhf -VHF/2 1 -VHS -VI/2 1 -viability/2 1 -viable 1 -viably 1 -Viacom/3 -viaduct/1 1 -Viagra -vial/18 1 -viand/1 1 -via 1 -vibe/130 1 -vibraharp/1 1 -vibrancy/2 1 -vibrant/8 1 -vibraphone/1 1 -vibraphonist/1 1 -vibrate/6 1 -vibrating 1 -vibration/1 1 -vibrational -vibrationally -vibrato/1 1 -vibrator/1 1 -vibratory -viburnum/1 1 -Vic -vicar/1 1 -vicarage/1 1 -vicarious/16 1 -vice/28 1 -vicegerent/1 1 -vicennial -Vicente/3 -viceregal 1 -viceroy/1 1 -vichyssoise/2 1 -Vichy 1 -vicinity/15 1 -vicious/16 1 -vicissitude/1 1 -Vicki/3 -Vickie/3 -Vicksburg/2 1 -Vicky -victim/1 1 -victimization/2 1 -victimize/6 1 -victimless 1 -Victor/3 -victor/1 1 -Victoria/2 1 -Victorian/1 1 -Victorianism 1 -victorious/8 1 -victory/15 1 -Victrola/2 1 -victual/23 1 -vicuna/1 1 -Vidal/3 -videlicet -video/23 1 -videocassette/1 1 -videoconferencing 1 -videodisc/1 1 -videodisk/1 1 -videophone/1 1 -videotape/28 1 -videotex/89 1 -video 1 -vie/122 1733 -Vienna/2 1 -Viennese 1 -Vientiane/2 1 -Vietcong -Vietminh -Vietnam/2 1 -Vietnamese/2 1 -view/23 1 -viewable -viewer/1 1 -viewership/2 1 -viewfinder/1 1 -viewing/1 1 -viewpoint/1 1 -vigesimal -vigil/1 1 -vigilance/2 1 -vigilant/8 1 -vigilante/1 1 -vigilantism/2 1 -vigilantist/2 1 -vignette/28 1 -vignettist/1 1 -vigor/2 1 -vigorous/8 1 -viii 1 -vii 1 -Vijayanagar/3 -Vijayawada/3 -viking/1 1 -Viking/1 1 -Vila/2 1 -vile/27 1 -vilification/2 1 -vilify/31 1 -Villa -villa/1 1 -village/48 1 -villager/1 1 -villain/1 1 -villainous 1 -villainy/15 1 -Villarreal/3 -ville -villein/1 1 -villeinage/2 1 -villi 1734 -Villon -villus/2 1735 -Vilma/3 -Vilnius/2 1 -Vilyui/3 -vim/2 1 -vinaigrette/2 1 -Vince/3 -Vincent/3 -vincible 1 -vindaloos -Vindemiatrix/3 -vindicate/6 1 -vindication/1 1 -vindicator/1 1 -vindictive/16 1 -vine/18 1 -vinegar/18 1 -vinegary 1 -vineyard/1 1 -vino/2 1 -vinous 1 -Vinson/3 -vintage/18 1 -vintner/1 1 -vinyl/1 1 -viol/1 1 -Viola/3 -viola/1 1 -violable 1 -violate/6 1 -violation/1 1 -violator/1 1 -violence/2 1 -violent/8 1 -Violet/3 -violet/1 1 -violin/1 1 -violincello -violincellos -violinist/1 1 -violist/1 1 -violoncellist/1 1 -violoncello/1 1 -VIP/1 1 -viper/1 1 -viperous 1 -virago/4 1 -viral 1 -vireo/1 1 -Virgie/3 -Virgil/2 1 -virgin/1 1 -virginal/1 1 -Virginia/2 1 -Virginian/1 1 -virginity/2 1 -virgin 1 -Virgo/1 1 -virgule/1 1 -virile 1 -virility/2 1 -virologist/1 1 -virology/2 1 -virtual/8 1 -virtue/1 1 -virtuosic -virtuosity/2 1 -virtuoso/1 1 -virtuous/16 1 -virulence/2 1 -virulent/8 1 -virus/4 1 -Visa/3 -visa/23 1 -visage/1 1 -Visakhapatnam -visa's 1736 -visa 1737 -Visayans -visceral/8 1 -viscera 1738 -viscid 1 -viscometer 1 -viscose/2 1 -viscosity/2 1 -viscount/1 1 -viscountcy/15 1 -viscountess/4 1 -viscous 1 -viscus/2 1739 -vise/28 1 -Vishnu/2 1 -visibility/15 1 -visible/19 1 -Visigoth/1 1 -vision/23 1 -visionary/15 1 -visioning 1 -visit/23 1 -visitable -visitant/1 1 -visitation/1 1 -visiting 1 -visitor/1 1 -visor/18 1 -VISTA -vista/18 1 -Vistula/2 1 -visual/30 1 -visualization/1 1 -visualize/6 1 -visualizer/1 1 -vita/53 1 -vital/550 1 -vitality/2 1 -vitalization/2 1 -vitalize/6 1 -vitamin/1 1 -vitiate/6 1 -vitiation/2 1 -viticulture/2 1 -viticulturist/1 1 -Vitim/3 -Vito/3 -vitreous 1 -vitrifaction/2 1 -vitrification/2 1 -vitrify/31 1 -vitrine/1 1 -vitriol/2 1 -vitriolic/39 1 -vitriol 1 -vi 1 -vittles -vittles's -vituperate/6 1 -vituperation/2 1 -vituperative -Vitus/3 -viva/58 1 -vivace 1 -vivacious/16 1 -vivacity/2 1 -Vivaldi -vivaria 1740 -vivarium/1 1741 -viva's -Vivekananda/3 -Vivian -vivid/21 1 -Vivienne/3 -vivify/31 1 -viviparous 1 -vivisect/11 1 -vivisection/2 1 -vivisectional 1 -vivisectionist/1 1 -vixen/1 1 -vixenish/8 1 -vixen 1 -viz -vizier/1 1 -vizir/1 1 -vizor/18 1 -VJ -Vlad/3 -Vladimir -Vladivostok/2 1 -Vlaminck -Vlasic/3 -VLF/2 1 -VOA -vocable/1 1 -vocab 1 -vocabulary/15 1 -vocal/30 1 -vocalic 1 -vocalist/1 1 -vocalization/1 1 -vocalize/6 1 -vocation/1 1 -vocational/8 1 -vocative/1 1 -vociferate/6 1 -vociferation/2 1 -vociferous/16 1 -vodka/1 1 -voe/10 1 -Vogue/3 -vogue/18 1 -voguish 1 -voice/28 1 -voiced 1 -voiceless/16 1 -voicing 1 -void/23 1 -voidable 1 -voiding 1 -void 1 -voila -voile/2 1 -volatile/10 1 -volatility/2 1 -volatilize/6 1 -volcanic/39 1 -volcanism 1 -volcano/4 1 -Volcker/3 -Voldemort/3 -vole/18 1 -Volga/2 1 -Volgograd/2 1 -volition/2 1 -volitional 1 -Volkswagen/2 1 -volley/23 1 -volleyball/1 1 -Volstead/3 -volt/1 1 -Volta -voltage/1 1 -voltaic 1 -Voltaire/2 1 -voltmeter/1 1 -vol 1 -volubility/2 1 -voluble/19 1 -volume/18 1 -volumetric -voluminous/16 1 -voluntarism/2 1 -voluntary/206 1 -volunteer/23 1 -volunteerism/2 1 -voluptuary/15 1 -voluptuous/16 1 -volute/1 1 -Volvo/3 -vomit/23 1 -vomiting 1 -Vonda/3 -Vonnegut/3 -voodoo/23 1 -voodooism/2 1 -voodoo 1 -voracious/16 1 -voracity/2 1 -Voronezh -Vorster/3 -vortex/4 1 -vorticity 1 -votary/15 1 -vote/28 1 -voter/1 1 -votive 1 -vouch/156 1 -voucher/18 1 -vouchsafe/6 1 -vow/23 1 -vowel/18 1 -voyage/28 1 -Voyager/3 -voyager/1 1 -voyageur/1 1 -voyeur/1 1 -voyeurism/2 1 -voyeuristic -VP -vs -Vt -VT -VTOL -Vuitton/3 -Vulcan/2 1 -vulcanism 1 -vulcanization/2 1 -vulcanize/6 1 -vulcanologist 1 -Vulg -vulgar/75 1 -vulgarian/1 1 -vulgarism/1 1 -vulgarity/15 1 -vulgarization/2 1 -vulgarize/6 1 -vulgarizer/1 1 -vulgar 1 -Vulgate/1 1 -vulnerability/15 1 -vulnerable/19 1 -vulpine 1 -vulture/1 1 -vulturous -vulva/53 1 -vying 1742 -w -W/2 1 -WA -Wabash/2 1 -wabbit/10 1 -WAC -wackes -wacko/1 1 -wacky/49 1 -Waco -Wac 1 -wad/113 1 -wadding/2 1 -waddle/28 1 -Wade -wade/28 1 -wader/130 1 -wades 1743 -wadge -wadges -wadi/1 1 -wading 1 -wadis 1744 -wafer/18 1 -waffle/28 1 -waffler/1 1 -waffling 1 -waft/23 1 -wafting 1 -wag/92 1 -wage/28 1 -wager/23 1 -wagerer/1 1 -waggery/15 1 -waggish/16 1 -waggle/28 1 -waggly 1 -Wagner/2 1 -Wagnerian 1 -wagon/18 1 -wagoner/1 1 -wagtail/1 1 -Wahhabi 1 -waif/564 1 -Waikiki -wail/23 1 -wailer/1 1 -wailing/2 1 -wain/18 1 -wainscot/23 1 -wainscoting/1 1 -wainwright/1 1 -waist/18 1 -waistband/1 1 -waistcoat/18 1 -waistline/1 1 -wait/23 1 -Waite/3 -waiter/18 1 -waiting/2 1 -waitpeople 1745 -waitperson/1 1746 -waitress/40 1 -waitstaff/2 1 -waive/6 1 -waiver/1 1 -wake/1 1 -Wake/2 1 -wake/6 1747 -wakeful/16 1 -waken/11 1 -wakening 1 -waking/10 1 -Waksman -Wald/3 -Waldemar/3 -Walden/3 -Waldensian 1 -Waldheim -Waldo/3 -waldo/231 1 -Waldorf/3 -wale/28 1 -Wales/2 1 -Walesa -wales 1748 -Walgreen/3 -walk/23 1 -walkable -walkabout/10 1 -walkaway/1 1 -Walker/3 -walker/1 1 -walkies -walking/2 1 -Walkman 1 -walkout/1 1 -walkover/1 1 -walkway/1 1 -Wall/3 -wall/23 1 -walla/10 1 -wallaby/15 1 -Wallace -wallah/10 1 -wallboard/2 1 -wallchart 1 -Wallenstein -Waller -wallet/1 1 -walleye/1 1 -walleyed -wallflower/1 1 -wallies -walling 1 -Wallis -Walloon 1 -wallop/23 1 -walloping/1 1 -wallow/23 1 -wallowing 1 -wallpaper/23 1 -Walls -walnut/1 1 -Walpole/2 1 -Walpurgisnacht 1 -walrus/4 1 -Walsh/3 -Walt/3 -Walter -Walters -Walton/3 -waltz/22 1 -waltzer/1 1 -waltzing 1 -wally -wampum/2 1 -wan/565 1 -Wanamaker/3 -wand/1 1 -Wanda/3 -wander/5 1 -wanderer/1 1 -wandering/32 1 -wanderlust/1 1 -wane/28 1 -Wang/3 -wangle/28 1 -wangler/1 1 -wangling 1 -waning 1 -wank/5 1 -Wankel/3 -wanker/10 1 -wanna -wannabe/1 1 -wannabee/10 1 -want/23 1 -wanting 1 -wanton/566 1 -wantoner 1 -wan 1 -wapiti/1 1 -war/103 1 -warble/28 1 -warbler/1 1 -warbling 1 -warbonnet/1 1 -Ward -ward/23 1 -warden/18 1 -warder/18 1 -warding 1 -wardress/89 1 -wardrobe/18 1 -wardroom/1 1 -wardship 1 -Ware/3 -ware/73 1 -warehouse/28 1 -warehouseman 1 -warehousing 1 -ware 1 -warez/89 1 -warfare/2 1 -warhead/1 1 -Warhol -warhorse/1 1 -Waring/3 -warlike 1 -warlock/1 1 -warlord/1 1 -warm/520 1 -warmblooded -warmer/1 1 -warmhearted/33 1 -warming 1 -warmish 1 -warmonger/1 1 -warmongering/2 1 -warmth/2 1 -warmup/1 1 -warn/11 1 -Warner/3 -warning/30 1 -warp/23 1 -warpaint -warpath/1 1 -warping 1 -warplane/1 1 -warrant/23 1 -warranting 1 -warranty/56 1 -Warren -warren/1 1 -warrior/1 1 -Warsaw/2 1 -warship/1 1 -wart/1 1 -warthog/1 1 -wartime/2 1 -war 1 -warty/34 1 -Warwick -wary/50 1 -Wasatch/3 -Wash -wash/22 1 -washable/1 1 -washbasin/1 1 -washboard/1 1 -washbowl/1 1 -washcloth/1 1 -washday 1 -washer/18 1 -washerwoman/2 1749 -washerwomen 1750 -washing/1 1 -Washington/2 1 -Washingtonian/1 1 -washout/1 1 -washrag/1 1 -washroom/1 1 -washstand/1 1 -washtub/1 1 -washy/34 1 -wasn't -wasp/1 1 -WASP/2 1 -waspish/16 1 -Wasp 1 -wassail/23 1 -Wassermann 1 -was 46 -wast/241 1 -wastage/2 1 -waste/139 1 -wastebasket/1 1 -wasteful/16 1 -wasteland/1 1 -wastepaper/2 1 -waster/18 1 -wasting 1 -wastrel/1 1 -was 1 -wast 46 -watch/22 1 -watchable 1 -watchband/1 1 -watchdog/18 1 -watcher/1 1 -watchful/16 1 -watchmaker/1 1 -watchmaking/2 1 -watchman/2 1751 -watchmen 1752 -watchstrap/10 1 -watchtower/1 1 -watchword/1 1 -water/185 1 -waterbed/1 1 -waterbird/1 1 -waterborne -Waterbury -watercolor/18 1 -watercolorists -watercourse/1 1 -watercraft/2 1 -watercress/2 1 -waterfall/1 1 -Waterford -waterfowl/1 1 -waterfront/1 1 -Watergate 1 -waterhole/1 1 -watering 1 -waterless 1 -waterlilies -waterlily/3 -waterline/1 1 -waterlogged -Waterloo/1 1 -waterman 1 -watermark/23 1 -watermelon/1 1 -watermill/1 1 -waterpower/2 1 -waterproof/23 1 -waterproofing/2 1 -Waters/3 -watershed/1 1 -waterside/1 1 -waterspout/1 1 -watertight 1 -waterway/1 1 -waterwheel/1 1 -waterworks -waterworks's -watery/49 1 -Watkins -WATS/2 1 -Watson -Watt -watt/1 1 -wattage/2 1 -Watteau -wattle/28 1 -wattling 1 -Watts -watt 1 -Watusi 1 -Waugh -wave/28 1 -waveband/10 1 -waveform/10 1 -wavefront 1 -waveguide/10 1 -wavelength/1 1 -wavelet/1 1 -wavelike -waver/23 1 -waverer/1 1 -wavering/8 1 -Wave 1 -wavier 1753 -waviest 1753 -waving 1 -wavy/50 1 -wax/567 1 -waxen 1 -waxing 1 -wax 1 -waxwing/1 1 -waxwork/1 1 -waxy/49 1 -way/1 1 -waybill/1 1 -wayfarer/1 1 -wayfaring/1 1 -waylay/312 1 -waylayer/1 1 -wayleave/10 1 -waymarked -Wayne -wayside/1 1 -way 1 -waywardly 1 -waywardness/3 -wayward 1 -wazoo/10 1 -WC -weak/568 1 -weaken/11 1 -weakener/1 1 -weakfish/4 1 -weakish 1 -weakling/1 1 -weakly 1 -weal/1 1 -wealth/2 1 -wealthy/49 1 -wean/11 1 -weaned 1 -weanling 1 -weapon/18 1 -weaponless 1 -weaponry/2 1 -wear/86 1754 -wearable 1 -wearer/1 1 -wearing/10 1 -wearisome/8 1 -weary/143 1 -wearying/8 1 -weasel/23 1 -weaselly 1 -weather/23 1 -weatherboard/141 1 -weatherboarding 1 -weathercock/18 1 -weathering/2 1 -weatherization/2 1 -weatherize/6 1 -weatherman/2 1755 -weathermen 1756 -weatherperson/1 1 -weatherproof/11 1 -weatherstrip/105 1 -weatherstripping/2 1 -weather 1 -weave/28 1757 -Weaver/3 -weaver/1 1 -weaving/2 1 -Web -web/136 1 -Webb -webbing/2 1 -Weber -Webern/3 -webfeet 1758 -webfoot/2 1759 -webmaster/1 1 -webmistress/4 1 -website/1 1 -Webster/1 1 -we'd -Wed/2 1 -wed/569 1 -Weddell/3 -wedder 1 -wedding/1 1 -wedge/28 1 -wedgie/1 1 -wedging 1 -Wedgwood 1 -wedlock/2 1 -Wednesday/1 1 -wee/570 1 -weed/23 1 -weeder/1 1 -weeding 1 -weedkiller/10 1 -weedless 1 -weeds/89 1 -weedy/34 1 -week/1 1 -weekday/1 1 -weekend/23 1 -weekender/10 1 -weeklies -weekly's -weekly 1 -weeknight/1 1 -Weeks/3 -week 1 -ween/11 1 -weenie/41 1 -weensy/34 1 -weeny/219 1 -weep/86 1760 -weeper/1 1 -weepie/447 1 -weeping/10 1 -weepy/42 1 -weevil/1 1 -weft/18 1 -Wehrmacht -Wei/3 -Weierstrass/3 -weigh/23 1 -weighbridge/10 1 -weighing 1 -weight/23 1 -weighted 1 -weighting/10 1 -weightless/16 1 -weightlifter/1 1 -weightlifting/2 1 -weighty/50 1 -Weill/3 -Weinberg/3 -weir/18 1 -weird/21 1 -weirdie/1 1 -weirdo/1 1 -weird 1 -Weiss/3 -Weissmuller/3 -Weizmann -Welch -welch/7 1 -welcome/28 1 -weld/23 1 -weldable 1 -welder/1 1 -welding 1 -Weldon/3 -welfare/2 1 -welkin/2 1 -we'll -well/571 643 -Welland/3 -Weller/3 -Welles -wellhead/1 1 -wellie/10 1 -wellington/1 1 -Wellington/1 1 -welling 1 -Wells -wellspring/1 1 -Welsh/2 1 -welsh/7 1 -welsher/1 1 -Welshman/2 1761 -Welshmen 1762 -Welsh 1 -Welshwoman 1 -welt/23 1 -welter/23 1 -welterweight/1 1 -welting 1 -welly -wen/1 1 -wench/40 1 -wend/572 1 -Wendell/3 -Wendi/3 -Wendy/3 -went 1763 -wept 1764 -we're -weren't -were 46 -werewolf/120 1 -werwolf/120 1 -Wesak/3 -Wesley/2 1 -Wesleyan/2 1 -Wessex -Wesson/3 -West/1 1 -west/2 1 -westbound 1 -westerlies -westerly's -westerly 1 -western/129 1 -Western/1 1 -westerner/1 1 -Westerner 1 -westernization/2 1 -westernize/6 1 -westernmost -Westinghouse -Westminster -Weston/3 -Westphalia -west 1 -westward/10 1 -wet/573 1 -wetback/1 1 -wetland/1 1 -we 1 -wetsuit/10 1 -wettable -wetter/1 1 -wetting 1 -wetware/10 1 -we've -Weyden/3 -Wezen/3 -whack/23 1 -whacker/1 1 -whacking/10 1 -whacky/34 1 -whale/28 1 -whaleboat/1 1 -whalebone/2 1 -whaler/1 1 -whales/89 1 -whaling/2 1 -wham/160 1 -whammy/15 1 -wham 1 -wharf/564 1 -Wharton -what/1 1 -whatchamacallit/1 1 -whatever 1 -whatnot/2 1 -whatshername -whatshisname -whatsit/10 1 -whatsoever 1 -what 1 -wheal/1 1 -wheat/2 1 -wheaten 1 -wheatgerm -Wheaties/3 -wheatmeal -Wheatstone/3 -wheedle/6 1 -wheedler/1 1 -wheedling 1 -wheel/23 1 -wheelbarrow/18 1 -wheelbase/1 1 -wheelchair/1 1 -Wheeler/3 -wheeler/10 1 -wheelhouse/1 1 -wheelie/1 1 -Wheeling/2 1 -wheeling 1 -wheelwright/1 1 -whee 1 -wheeze/28 1 -wheezing 1 -wheezy/50 1 -whelk/62 1 -whelm/11 1 -whelp/23 1 -when/1 1 -whence 1 -whenever -whensoever -when 1 -where/1 1 -whereabouts/2 1 -whereas 1 -whereat 1 -whereby 1 -wherefore/1 1 -wherein 1 -whereof 1 -whereon 1 -wheresoever -whereto -where 1 -whereupon -wherever -wherewithal/2 1 -wherewith 1 -wherry/167 1 -whet/479 1 -whether -whetstone/1 1 -whew 1 -whey/2 1 -whichever 1 -which 1 -whiff/23 1 -whiffing 1 -whiffletree/1 1 -Whig/1 1 -while/28 1 -whilom 1 -whilst -whim/18 1 -whimper/23 1 -whimpering 1 -whimsey/1 1 -whimsical/8 1 -whimsicality/2 1 -whimsy/15 1 -whine/28 1 -whiner/1 1 -whinge/574 1 -whingeing 1 -whinger/10 1 -whinier 1765 -whiniest 1765 -whining 1 -whiny/34 1 -whinny/56 1 -whip/47 1 -whipcord/2 1 -whiplash/40 1 -whipper/1 1 -whippersnapper/1 1 -whippet/1 1 -whipping/1 1 -Whipple/3 -whippletree/1 1 -whippoorwill/1 1 -whipsaw/23 1 -whir/103 1 -whirl/23 1 -whirligig/18 1 -whirling 1 -Whirlpool/3 -whirlpool/18 1 -whirlwind/1 1 -whirlybird/1 1 -whirr/23 1 -whirring 1 -whisk/23 1 -whisker/62 1 -whiskery 1 -whiskey/1 1 -whisper/23 1 -whisperer/1 1 -whispering/10 1 -whist/2 1 -whistle/28 1 -Whistler -whistler/1 1 -whistling 1 -whist 1 -whit/18 1 -Whitaker -white/25 1 -White/1 1 -white/6 1 -whitebait 1 -whiteboard/10 1 -whitecap/1 1 -Whitefield/3 -whitefish/4 1 -Whitehall -Whitehead -whitehead/1 1 -Whitehorse/2 1 -Whiteley/3 -whiten/11 1 -whitener/1 1 -whitening/1 1 -whiteout/1 1 -whitetail/1 1 -whitewall/1 1 -whitewash/22 1 -whitewashing 1 -whitewater/2 1 -whitey/1 1 -Whitfield/3 -whither 1 -whiting/1 1 -whitish 1 -Whitley/3 -Whitman -Whitney/2 1 -Whitsunday/1 1 -Whittier -whittle/43 1 -whittler/1 1 -whittling 1 -whit 1 -whiz/306 1 -whizkid/2 1 -whizzbang/1 1 -whizzing 1 -who/2 1 -WHO/2 1 -whoa 1 -who'd -whodunit/1 1 -whodunnit/1 1 -whoever 1 -whole/20 1 -wholefood/10 1 -wholegrain -wholehearted/16 1 -wholemeal -wholesale/28 1 -wholesaler/1 1 -wholesome/16 1 -wholewheat -who'll -wholly 1 -whomever 1 -whomsoever 1 -whom 1 -whoop/23 1 -whoopee/10 1 -whooper/1 1 -whooping 1 -whoosh/22 1 -whop/105 1 -whopper/1 1 -whopping 1 -who're -whore/73 1 -whorehouse/1 1 -whoreish 1 -whorish 1 -whorl/1 1 -whorled 1 -whose 1 -whosoever 1 -whoso 1 -who've -whup/105 1 -why/1 1 -why'd -why 1 -WI -Wicca 1 -Wichita/2 1 -wick/62 1 -wicked/21 1 -wicker/1 1 -wickerwork/2 1 -wicket/1 1 -wicketkeeper/10 1 -wicketkeeping -wide/575 1 -widemouthed -widen/11 1 -widener/1 1 -widespread -widgeon/1 1 -widget/10 1 -widow/23 1 -widower/1 1 -widowhood/2 1 -width/1 1 -wield/11 1 -wielder/1 1 -Wiemar/3 -wiener/1 1 -wienie/1 1 -Wiesel/3 -Wiesenthal/3 -wife/2 1766 -wifeless 1 -wifely/34 1 -wife 1 -wig/92 1 -wigeon/1 1 -wigging 1 -Wiggins -wiggle/28 1 -wiggler/1 1 -wiggles/89 1 -wiggly/34 1 -wight/18 1 -wiglet/1 1 -Wigner/3 -wigwag/92 1 -wigwam/1 1 -Wii/3 -wiki/3 -Wikipedia/3 -wikis -Wilberforce -Wilbert/3 -Wilbur/3 -Wilburn/3 -Wilcox/3 -wild/135 1 -Wilda/3 -wildcat/403 1 -wildcatter/1 1 -Wilde -wildebeest/1 1 -Wilder -wilderness/3 -wildernesses -wilder 1 -wildfire/1 1 -wildflower/1 1 -wildfowl/2 1 -wildlife/2 1 -wile/28 1 -Wiles -Wiley/3 -Wilford/3 -Wilfred/3 -Wilfredo/3 -wilfulness -wilfulness's -Wilhelm/3 -Wilhelmina/3 -Wilkerson/3 -Wilkes -Wilkins -Wilkinson/3 -Will/3 -will/519 1767 -Willa/3 -Willamette/3 -Willard -Willemstad -willful/16 1 -William/10 1 -Williamson -Willie/3 -willie/58 1 -willies's -willing/21 1 -Willis -williwaw/1 1 -willow/18 1 -willowy/34 1 -willpower/2 1 -Wilma/3 -Wilmer/3 -Wilmington/2 1 -Wilson/2 1 -Wilsonian -wilt/23 1 -Wilton/2 1 -wily/49 1 -Willy/3 -willy/258 1 -Wimbledon/3 -wimp/23 1 -wimpish 1 -wimple/28 1 -wimpling 1 -wimpy/34 1 -Wimsey/3 -win/442 1768 -wince/28 1 -winch/22 1 -Winchell/3 -Winchester/10 1 -wincing 1 -wind/23 1769 -windbag/1 1 -windblown 1 -windbreak/1 1 -windbreaker/1 1 -Windbreaker 1 -windburn/173 1 -windcheater/10 1 -windchill/2 1 -winded 1 -winder/1 1 -Windex/3 -windfall/1 1 -windflower/1 1 -Windhoek -winding/1 1 -windjammer/1 1 -windlass/40 1 -windless 1 -windmill/23 1 -window/23 1 -windowless 1 -windowpane/1 1 -Windows -windowsill/1 1 -windpipe/1 1 -windproof 1 -windrow/18 1 -windscreen/1 1 -windshield/1 1 -windsock/1 1 -Windsor/1 1 -windstorm/1 1 -windsurf/11 1 -windsurfer/1 1 -windsurfing/2 1 -windswept 1 -windup/1 1 -Windward/3 -windward/2 1 -windy/50 1 -wine/28 1 -wineglass/4 1 -winegrower/1 1 -winemaker/1 1 -winery/15 1 -Winesap/2 1 -wineskin 1 -Winfred/3 -Winfrey/3 -wing/23 1 -wingding/1 1 -winged 1 -winger/10 1 -wingless 1 -winglike 1 -wingspan/1 1 -wingspread/1 1 -wingtip/1 1 -winier 1770 -winiest 1770 -Winifred/3 -wink/23 1 -winker/1 1 -winking 1 -Winkle/3 -winkle/28 1 -winkling 1 -winnable -Winnebago/2 1 -winner/1 1 -Winnie 1 -winning/30 1 -Winnipeg/2 1 -winnow/5 1 -winnower/1 1 -winnowing 1 -wino/1 1 -winsome/27 1 -Winston/3 -winter/23 1 -wintergreen/2 1 -winterize/6 1 -Winters -wintertime/2 1 -winter 1 -wintery/34 1 -Winthrop/3 -wintry/34 1 -winy/34 1 -wipe/28 1 -wiper/1 1 -wiping 1 -wire/139 1 -wired/10 1 -wirehair/1 1 -wireless/40 1 -wirer 1 -wiretap/47 1 -wiretapper/1 1 -wiretapping/2 1 -wiriness/3 -wiring/2 1 -wiry/34 1 -Wis -Wisc -Wisconsin/2 1 -Wisconsinite/1 1 -wisdom/2 1 -Wise/3 -wise/576 1 -wiseacre/1 1 -wisecrack/23 1 -wiseguy/10 1 -wish/22 1 -wishbone/1 1 -wisher/1 1 -wishful/8 1 -wishing 1 -wisp/18 1 -wispy/34 1 -wistaria/1 1 -wisteria/1 1 -wistful/16 1 -wist 1 -wit/577 1771 -witch/22 1 -witchcraft/2 1 -witchdoctor -witchdoctors -witchery/2 1 -witching 1 -with/241 1 -withal 1 -withdraw/301 1772 -withdrawal/1 1 -withdrawing 1 -withdrawn 1 -withdrew 1773 -withe/28 1 -wither/11 1 -withered 1 -withering/191 1 -withers's -withheld 1774 -withhold/121 1775 -withholding/2 1 -within/2 1 -without 1 -withstand/121 1776 -withstood 1777 -witless/16 1 -witness/7 1 -witness's -Witt/3 -witted 1 -witter/11 1 -Wittgenstein/2 1 -witticism/1 1 -witting/8 1 -Witwatersrand -witty/50 1 -wive/6 1 -wives 1778 -wiz/2 1 -wizard/30 1 -wizardry/2 1 -wizened -wk -wkly -Wm/3 -WNW/2 1 -woad/2 1 -wobble/28 1 -wobbler 1 -wobbliness/3 -wobbling 1 -wobbly/34 1 -Wobegon/3 -Wodehouse/3 -wodge/10 1 -woe/1 1 -woebegone -woeful/85 1 -wog/10 1 -wok/1 1 -woken 1779 -woke 1779 -wold/1 1 -Wolf -wolf/578 1 -Wolfe -Wolff -Wolfgang/3 -wolfhound/1 1 -wolfing 1 -wolfish/8 1 -wolfram/2 1 -Wollongong -Wollstonecraft/3 -Wolsey -Wolverhampton -wolverine/1 1 -woman/2 1780 -womanhood/2 1 -womanish 1 -womanize/6 1 -womanizer/1 1 -womankind/2 1 -womanlike/2 1 -womanly/49 1 -woman 1 -womb/1 1 -wombat/1 1 -womble/10 1 -womenfolk/130 1 -women 1781 -won/2 1 -Wonder -wonder/23 1 -Wonderbra/2 1 -wonderful/16 1 -wondering/8 1 -wonderland/1 1 -wonderment/2 1 -wondrous/8 1 -Wong/3 -wonk/1 1 -wonky/34 1 -won 1782 -won't -wont/173 1 -wonted 1 -wonton/1 1 -won 1 -wont 1 -woo/11 1 -Wood -wood/185 1 -Woodard/3 -woodbine/2 1 -woodblock/1 1 -woodcarver/1 1 -woodcarving/1 1 -woodchuck/1 1 -woodcock/1 1 -woodcraft/2 1 -woodcut/128 1 -woodcutter/1 1 -woodcutting/2 1 -wooden/21 1 -Woodhull/3 -woodland/1 1 -woodlice -woodlot/1 1 -woodlouse 1 -woodman/2 1783 -woodmen 1784 -woodpecker/1 1 -woodpile/1 1 -Woodrow/3 -Woods -woodshed/18 1 -woodsiness/3 -woodsman/2 1785 -woodsmen 1786 -woodsmoke -Woodstock/3 -woodsy/34 1 -wood 1 -Woodward/3 -woodwind/1 1 -woodwork/2 1 -woodworker/1 1 -woodworking/2 1 -woodworm/10 1 -woody/286 1 -wooer/1 1 -woof/23 1 -woofer/1 1 -wooing 1 -wool/1 1 -woolen/1 1 -Woolf -woolgathering/2 1 -woolie/41 1 -wooliness -Woolite/3 -woollies -Woolongong/3 -Woolworth -wooly/34 1 -woolly/49 1 -woolly's -wooly's -Wooster/3 -Wooten/3 -woozy/50 1 -wop/579 1 -Worcester/1 1 -Worcestershire -word/23 1 -wordage/2 1 -wordbook/1 1 -wording/1 1 -wordless/8 1 -wordplay/2 1 -wordsmith/10 1 -Wordsworth/2 1 -wordy/50 1 -wore 1787 -work/580 1788 -workability 1 -workable 1 -workaday -workaholic/1 1 -workaround/10 1 -workbasket/10 1 -workbench/4 1 -workbook/1 1 -workday/1 1 -worker/1 1 -workfare/2 1 -workforce/1 1 -workhorse/1 1 -workhouse/1 1 -working/130 1 -workingman/2 1789 -workingmen 1790 -workingwoman/2 1791 -workingwomen 1792 -workload/1 1 -Workman/3 -workman/2 1793 -workmanlike -workmanship/2 1 -workmate/10 1 -workmen 1794 -workout/1 1 -workpeople -workpiece/10 1 -workplace/1 1 -workroom/1 1 -worksheet/1 1 -workshop/1 1 -workshy -workspace 1 -workstation/1 1 -worktable/1 1 -worktop/10 1 -workup/1 1 -workweek/1 1 -world/581 1 -worldly/140 1 -worldview/1 1 -worldwide 1 -worm/23 1 -wormhole/1 1 -Worms -wormwood/2 1 -wormy/34 1 -worn 1787 -worried/8 1 -worrier/1 1 -worriment/2 1 -worrisome -worry/56 1 -worrying/191 1 -worrywart/1 1 -worse/2 1 -worsen/11 1 -worse 1795 -worship/23 1 -worshiper/1 1 -worshipful 1 -worst/23 1 -worsted/2 1 -worst 1795 -wort/2 1 -worth/2 1 -worthless/16 1 -worth 1 -worthwhile 1 -worthy/221 1 -wost 1796 -Wotan/2 1 -wotcha -wot 1796 -would/58 1 -wouldn't -wouldst 1797 -would 1797 -would've -wound/78 1 -wounded 1 -wounder 1 -wounding 1 -wound 1798 -woven 1799 -wove 1799 -Wovoka/3 -wow/23 1 -Wozniak/3 -Wozzeck/3 -WP -wpm 1 -wrack/23 1 -wraith/1 1 -Wrangell/3 -wrangle/28 1 -wrangler/1 1 -wrangling/10 1 -wrap/296 1 -wraparound/1 1 -wrapper/1 1 -wrapping/1 1 -wrasse/1 1 -wrath/2 1 -wrathful/8 1 -wrath 1 -wreak/11 1 -wreath/23 1 -wreathe/6 1 -wreck/23 1 -wreckage/2 1 -wrecker/1 1 -wrecking 1 -wren/1 1 -wrench/22 1 -wrenching 1 -Wren 1 -wrest/23 1 -wrestle/28 1 -wrestler/1 1 -wrestling/2 1 -wretch/4 1 -wretched/21 1 -wriggle/28 1 -wriggler/1 1 -wriggling 1 -wriggly/34 1 -Wright -wright/1 1 -Wrigley/3 -wring/86 1800 -wringer/1 1 -wringing 1 -wrinkle/28 1 -wrinkled 1 -wrinklies -wrinkly/34 1 -wrinkly's -wrist/1 1 -wristband/1 1 -wristwatch/4 1 -writ/1 1 -writable -write/90 1801 -writer/1 1 -writeup 1 -writhe/28 1 -writhing 1 -writing/1 1 -Wroclaw/2 1 -wrong/52 1 -wrongdoer/1 1 -wrongdoing/1 1 -wronger 1 -wrongful/16 1 -wrongheaded/16 1 -wrote 1802 -wroth 1 -wrought 1803 -wrung 1804 -wry/21 1 -WSW/2 1 -wt -Wu/2 1 -Wuhan -wunderkind/10 1 -Wurlitzer/3 -wurst/1 1 -wuss/4 1 -wussy/42 1 -WV -WW -WWI -WWII -WWW/2 1 -WY -Wyatt -Wycherley/3 -Wycliffe/3 -Wyeth -Wylie/3 -Wynn/3 -Wyo -Wyoming/2 1 -Wyomingite/1 1 -WYSIWYG -X/4 1 -Xanadu 1 -Xanthippe 1 -Xavier -xci -xcii -xciv -xcix -xcvi -xcvii -Xe/1 1 -XEmacs/3 -Xenakis/3 -Xenia/3 -xenon/2 1 -xenophobe/1 1 -xenophobia/2 1 -xenophobic -Xenophon -xerographic 1 -xerography/2 1 -Xerox/205 1 -xerox/4 1 -Xerox/4 1 -xerox/7 1 -Xerxes -Xhosa/2 1 -xi/1 1 -Xi'an -Xian/1 1 -Xiaoping/3 -xiii 1 -xii 1 -Ximenes -Xingu/3 -Xiongnu/3 -xi 1 -xiv 1 -xix 1 -XL/2 1 -Xmas/4 1 -XML -Xochipilli/3 -xor -xref -xreffed -xreffing -xrefs -XS -XSS -xterm/2 1 -x 1 -Xuzhou/3 -xviii 1 -xvii 1 -xvi 1 -xv 1 -xxiii 1 -xxii 1 -xxi 1 -xxiv 1 -xxix 1 -XXL -xx 1 -xxviii 1 -xxvii 1 -xxvi 1 -xxv 1 -xxxi -xxxii -xxxiii -xxxiv -xxxix -xxx 1 -xxxv -xxxvi -xxxvii -xxxviii -xylem/2 1 -xylene 1 -xylophone/1 1 -xylophonist/1 1 -y/166 1 -Y/2 1 -Yacc/3 -yacht/23 1 -yachting/2 1 -yachtsman/2 1805 -yachtsmen 1806 -yachtswoman/2 1807 -yachtswomen 1808 -yack/23 1 -yahoo/1 1 -Yahoo/2 1 -Yahtzee/3 -Yahveh/2 1 -Yahweh/2 1 -yak/64 1 -Yakima 1 -Yakut/2 1 -Yakutsk -Yale/2 1 -y'all -Yalow/3 -Yalta/2 1 -Yalu/2 1 -yam/1 1 -Yamagata/3 -Yamaha/3 -yammer/23 1 -yammerer/1 1 -yammering 1 -Yamoussoukro -Yang -yang/2 1 -Yangon/2 1 -Yangtze/2 1 -yank/1 1 -Yank/1 1 -yank/11 1 -Yankee/1 1 -Yaobang/3 -Yaounde/2 1 -yap/47 1 -Yaqui 1 -yard/18 1 -yardage/1 1 -yardarm/1 1 -yardman/2 1809 -yardmaster/1 1 -yardmen 1810 -yardstick/1 1 -Yaren -yarmelke/1 1 -yarmulke/1 1 -yarn/18 1 -Yaroslavl -yarrow/2 1 -yashmak/10 1 -ya 1811 -Yataro/3 -Yates -yaw/185 1 -yawl/18 1 -yawn/23 1 -yawner/1 1 -yawningly -yawning 1 -Yb/2 1 -yd -ye/582 1 -yea/1 1 -Yeager/3 -yeah/1 1 -year/1 1 -yearbook/1 1 -yearlies -yearling/1 1 -yearlong 1 -yearly's -yearly 1 -yearn/11 1 -yearning/30 1 -yeast/18 1 -yeasty/34 1 -Yeats/2 1 -yea 1 -yegg/1 1 -Yekaterinburg -yell/23 1 -yelling 1 -yellow/165 1 -yellowhammer/10 1 -yellowish -Yellowknife -Yellowstone/2 1 -yellowy 1 -yelp/23 1 -yelping 1 -Yeltsin -Yemen/2 1 -Yemeni/1 1 -Yemenite 1 -yen/18 1 -Yenisei/2 1 -yeoman/2 1812 -yeomanry/2 1 -yeoman 1 -yeomen 1813 -yep/1 1 -Yerevan -Yerkes/3 -yes/541 1 -Yesenia/3 -yeshiva/1 1 -yeshivah/2 1 -yesterday/1 1 -yesteryear/2 1 -yeti/1 1 -yet 1 -Yevtushenko/3 -yew/1 1 -Yggdrasil -yid/10 1 -Yiddish/2 1 -yield/23 1 -yielding/10 1 -yikes -yin/2 1 -yip/47 1 -yipe 1 -yippee 1 -YMCA -YMHA -Ymir/2 1 -YMMV -yo -yob/10 1 -yobbo/10 1 -Yoda/3 -yodel/23 1 -yodeler/1 1 -yodeling 1 -yoga/2 1 -yoghourt/1 1 -yoghurt/1 1 -yogi/1 1 -yogic 1 -yogin/1 1 -yogurt/1 1 -yoke/28 1 -yokel/1 1 -yoking 1 -Yoknapatawpha/3 -Yoko/3 -Yokohama -Yolanda/3 -yolk/1 1 -yolked 1 -yonder 1 -Yong/3 -Yonkers -yonks -yon 1814 -yore/2 1 -York/2 1 -yorker/10 1 -Yorkie 1 -Yorkshire/1 1 -Yorktown/2 1 -york 1 -Yoruba/2 1 -Yosemite/2 1 -Yossarian/3 -you/1 1 -you'd -you'll -Young -young/583 1 -younger 1 -youngish 1 -youngster/1 1 -Youngstown -your/10 1 -you're -yourself/338 1 -your 1 -youth/1 1 -youthful/16 1 -YouTube/3 -you've -yowl/23 1 -yowling 1 -yow 1 -Ypres/2 1 -Ypsilanti -yr/10 1 -YT -ytterbium/2 1 -yttrium/2 1 -Yuan/3 -yuan/2 1 -Yucatan/2 1 -yucca/1 1 -yuck/23 1 -yucky/34 1 -Yugo -Yugoslav/1 1 -Yugoslavia/2 1 -Yugoslavian/1 1 -yuk/64 1 -yukky 1 -Yukon/2 1 -Yule/1 1 -yule/2 1 -Yuletide/1 1 -yuletide/2 1 -Yuma/1 1 -yummy/34 1 -yum 1814 -Yunnan/2 1 -yup/1 1 -yuppie/1 1 -yuppify/31 1 -yuppy/15 1 -yup 1 -Yuri/3 -yurt/1 1 -Yves/3 -Yvette/3 -Yvonne/3 -YWCA -YWHA -z -Z/2 1 -Zachariah/3 -Zachary/3 -Zachery/3 -Zagreb/2 1 -Zaire/2 1 -Zairian 1 -Zambezi/2 1 -Zambia/2 1 -Zambian/1 1 -Zamboni 1 -Zamenhof/3 -Zamora -Zane/3 -Zanuck/3 -Zanzibar/2 1 -zany/584 1 -zap/47 1 -Zapata -Zaporozhye -Zapotec 1 -Zappa/3 -zapper/1 1 -zappy 1 -Zara/3 -Zarathustra/2 1 -zeal/2 1 -zealot/1 1 -zealotry/2 1 -zealous/16 1 -Zebedee -zebra/1 1 -zebras 1 -zebu/1 1 -Zechariah -zed/1 1 -Zedekiah/3 -Zedong/3 -Zeffirelli/3 -zeitgeist/1 1 -Zeke/3 -Zelig -Zelma/3 -Zen/1 1 -zen/192 1 -Zenger/3 -zenith/1 1 -Zeno/2 1 -zeolites -Zephaniah -zephyr/1 1 -Zephyrus -zeppelin/1 1 -Zeppelin 1 -zero/272 1 -zeroth -zero 1 -Zest/3 -zest/18 1 -zestful/16 1 -zesty/34 1 -zeta/1 1 -zeugma 1 -Zeus/2 1 -Zhdanov -Zhengzhou -Zhivago/3 -Zhukov -Zibo/3 -Ziegfeld -Ziegler/3 -zigamorph/10 1 -zigzag/92 1 -Ziggy/3 -zilch/2 1 -zillion/1 1 -Zimbabwe/2 1 -Zimbabwean/1 1 -Zimmerman/3 -zinc/64 1 -zine/10 1 -zinfandel/2 1 -Zinfandel/2 1 -zing/23 1 -zinger/1 1 -zingy/34 1 -zinnia/1 1 -Zion/1 1 -Zionism/1 1 -Zionist/1 1 -zip/47 1 -Ziploc 1 -zipper/23 1 -zippy/34 1 -zircon/1 1 -zirconium/2 1 -zit/1 1 -zither/1 1 -zloty/15 1 -Zn/2 1 -zodiac/1 1 -zodiacal -Zoe/3 -Zola/2 1 -Zollverein -Zoloft -Zomba/2 1 -zombi/1 1 -zombie/1 1 -zonal/8 1 -zone/28 1 -zoning/2 1 -zonked -zoo/1 1 -zookeeper/1 1 -zoological/8 1 -zoologist/1 1 -zoology/2 1 -zoom/23 1 -zoophyte/1 1 -zoophytic 1 -zorch/7 1 -Zorn -Zoroaster/2 1 -Zoroastrian/1 1 -Zoroastrianism/1 1 -Zorro/3 -Zosma/3 -zounds 1 -Zr/2 1 -Zubenelgenubi/3 -Zubeneschamali/3 -zucchini/1 1 -zugzwang 1 -Zukor/3 -Zulu/1 1 -Zululand -Zuni 1 -Zurich/2 1 -zwieback/2 1 -Zwingli/3 -Zworykin -zydeco/2 1 -zygote/1 1 -zygotic 1 -zymurgy/2 1 -Zyrtec/3 -Zyuganov/3 -Zzz -Zs -Zsigmondy -0/585 -0th/586 -1/587 -1st/588 -1th/589 -2/585 -2nd/588 -2th/589 -3/585 -3rd/588 -3th/589 -4/585 -4th/586 -5/585 -5th/586 -6/585 -6th/586 -7/585 -7th/586 -8/585 -8th/586 -9/585 -9th/586 -10s/586 -20s/586 -30s/586 -40s/586 -50s/586 -60s/586 -70s/586 -80s/586 -90s/586 -100s/586 -200s/586 -300s/586 -400s/586 -500s/586 -600s/586 -700s/586 -800s/586 -900s/586 -1000s/586 -2000s/586 -'10s -'20s -'30s -'40s -'50s -'60s -'70s -'80s -'90s -10's/586 -20's/586 -30's/586 -40's/586 -50's/586 -60's/586 -70's/586 -80's/586 -90's/586 -100's/586 -200's/586 -300's/586 -400's/586 -500's/586 -600's/586 -700's/586 -800's/586 -900's/586 -1000's/586 -2000's/586 -'10's -'20's -'30's -'40's -'50's -'60's -'70's -'80's -'90's diff --git a/vendor/plugins/.gitignore b/vendor/plugins/.gitignore deleted file mode 100644 index e69de29..0000000 diff --git a/vendor/plugins/.gitkeep b/vendor/plugins/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/web/packs/account.js b/web/packs/account.js new file mode 100644 index 0000000..a9825fb --- /dev/null +++ b/web/packs/account.js @@ -0,0 +1,81 @@ + +// Base64 to ArrayBuffer +function bufferDecode(value) { + return Uint8Array.from(atob(value), c => c.charCodeAt(0)); +} + +// ArrayBuffer to URLBase64 +function bufferEncode(value) { + return btoa(String.fromCharCode.apply(null, new Uint8Array(value))) + .replace(/\+/g, "-") + .replace(/\//g, "_") + .replace(/=/g, "");; +} + +function registerUser() { + + authname = $("#webauthn-name").val(); + authname = authname.substring(0, 20); + authname = escape(authname); + + $.get( + '/account/2fa/webauthn/register/begin', + null, + function (data) { + return data + }, + 'json') + .then((credentialCreationOptions) => { + console.log(credentialCreationOptions) + credentialCreationOptions.publicKey.challenge = bufferDecode(credentialCreationOptions.publicKey.challenge); + credentialCreationOptions.publicKey.user.id = bufferDecode(credentialCreationOptions.publicKey.user.id); + if (credentialCreationOptions.publicKey.excludeCredentials) { + for (var i = 0; i < credentialCreationOptions.publicKey.excludeCredentials.length; i++) { + credentialCreationOptions.publicKey.excludeCredentials[i].id = bufferDecode(credentialCreationOptions.publicKey.excludeCredentials[i].id); + } + } + + return navigator.credentials.create({ + publicKey: credentialCreationOptions.publicKey + }) + }) + .then((credential) => { + console.log(credential) + let attestationObject = credential.response.attestationObject; + let clientDataJSON = credential.response.clientDataJSON; + let rawId = credential.rawId; + + $.post( + '/account/2fa/webauthn/register/finish?name=' + authname, + JSON.stringify({ + id: credential.id, + rawId: bufferEncode(rawId), + type: credential.type, + response: { + attestationObject: bufferEncode(attestationObject), + clientDataJSON: bufferEncode(clientDataJSON), + }, + }), + function (data) { + return data + }, + 'json') + }) + .then((success) => { + // successfully registered + return + }) + .catch((error) => { + // failed to register + console.log(error) + }) +} + + +$( "#register-webauthn" ).click(function() { + if($("#webauthn-name").val().length == 0){ + alert("Please provide a non-empty Authenticator Name"); + }else{ + registerUser(); + } +}); diff --git a/web/packs/admin.js b/web/packs/admin.js new file mode 100644 index 0000000..f536b42 --- /dev/null +++ b/web/packs/admin.js @@ -0,0 +1,60 @@ + +$( "#addUser" ).click(function() { + + if($("#newNick").val() == "" || $("#newName").val() == "" || $("#newEmail").val() == ""){ + if($("#newNick").val() == ""){ + $("#newNick").addClass("is-invalid"); + } + if($("#newName").val() == ""){ + $("#newName").addClass("is-invalid"); + } + if($("#newEmail").val() == ""){ + $("#newEmail").addClass("is-invalid"); + } + return; + } + + var newNick = $("#newNick").val(); + var newName = $("#newName").val(); + var newEmail = $("#newEmail").val(); + + var newUser = '\n' + + ' \n' + + ' \n' + + ' \n' + + ' User\n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' ' + + $("#userList").append(newUser); + $("#addUserForm").hide(); +}); diff --git a/web/packs/application.js b/web/packs/application.js new file mode 100644 index 0000000..95200ea --- /dev/null +++ b/web/packs/application.js @@ -0,0 +1,69 @@ +import "core-js/stable"; +import "regenerator-runtime/runtime"; +require("turbolinks").start(); +import 'bootstrap'; + + +window.dataTables = []; +window.RequestsDataTables = []; +window.DraftsDataTables = []; +window.ArchivesDataTables = []; +window.AllDataTables = []; + +require( 'datatables.net' )( window, $ ); +require( 'datatables.net-bs4' )( window, $ ); +require( 'datatables.net-buttons' )( window, $ ); +require( 'datatables.net-buttons-bs4/js/buttons.bootstrap4.min' )( window, $ ); +require('datatables.net-buttons/js/buttons.colVis.js')( window, $ ); + +import requests from './src/javascript/requests'; +import all from './src/javascript/all'; +import drafts from './src/javascript/drafts'; +import archive from './src/javascript/archive'; +import cvetool from './src/javascript/cvetool'; + +document.addEventListener("turbolinks:load", () => { + requests.initDatatable(); + drafts.initDatatable(); + archive.initDatatable(); + cvetool.initDatatable(); + all.initDatatable(); +}); + +document.addEventListener("turbolinks:before-cache", () => { + requests.destroyDatatable(); + drafts.destroyDatatable(); + archive.destroyDatatable(); + cvetool.destroyDatatable(); + all.destroyDatatable(); +}); + + +// double shift press + +var delta = 500; +var lastKeypressTime = 0; +function KeyHandler(event) { + if ( event.ctrlKey ){ + var thisKeypressTime = new Date(); + if ( thisKeypressTime - lastKeypressTime <= delta ) { + doDoubleKeypress(); + thisKeypressTime = 0; + } + lastKeypressTime = thisKeypressTime; + } +} + +function doDoubleKeypress() { + if($('#large-quicksearch').length){ + $('#large-quicksearch').val(''); + $('#large-quicksearch').focus(); + }else if($('#quicksearch').length){ + $('#quicksearch').val(''); + $('#quicksearch').focus(); + } +} + +// keyboard navigation is disabled for now +//document.addEventListener('keydown', KeyHandler); + diff --git a/web/packs/edit.js b/web/packs/edit.js new file mode 100644 index 0000000..7c47dd7 --- /dev/null +++ b/web/packs/edit.js @@ -0,0 +1,235 @@ +function registerDeleteReferenceButtons(){ + $('.btn-delete-reference').on('click', function(event){ + $(this).parent().parent().parent().remove(); + }); +} + +function registerDeleteBugButtons(){ + $('.btn-delete-bug').on('click', function(event){ + $(this).parent().parent().parent().remove(); + }); +} + +function registerDeletePackageButtons(){ + $('.btn-delete-package').on('click', function(event){ + $(this).parent().parent().parent().parent().remove(); + }); +} + +registerDeleteBugButtons(); +registerDeleteReferenceButtons(); +registerDeletePackageButtons(); + +$('.btn-add-bug').on('click', function(event){ + + var newBugId = $("#new_bug_id").val(); + + if(newBugId == "") { + return; + } + + var newBug = '
      ' + + '
      ' + + '
      ' + + '' + + '' + + '' + + '' + + '' + + '
      ' + + '
      ' + + 'TODO...' + + '
      ' + + '' + + '' + + '' + + '
      ' + + '
      '; + + $("#bugs-list").append(newBug); + + registerDeleteBugButtons(); +}); + + +$('.btn-add-reference').on('click', function(event){ + + var newReferenceTitle = $("#new_reference_title").val(); + var newReferenceURL = $("#new_reference_url").val(); + + if(newReferenceTitle == "" || newReferenceURL == "") { + return; + } + + var newReference = '
      ' + + '
      ' + + '
      ' + + '' + + '' + + '' + + '' + + '' + + '
      ' + + '
      ' + + '' + + '' + + '' + + '
      ' + + '' + + '' + + '' + + '
      ' + + '
      '; + + $("#reference_list").append(newReference); + + registerDeleteReferenceButtons(); +}); + + +$('.btn-add-vulnerable-package').on('click', function(event){ + + var addVulnerablePackageId = $("#add-vulnerable-package-atom").val(); + var addVulnerablePackageIdentifier = $("#add-vulnerable-package-identifier").val(); + var addVulnerablePackageVersion = $("#add-vulnerable-package-version").val(); + var addVulnerablePackageSlot = $("#add-vulnerable-package-slot").val(); + var addVulnerablePackageArch = $("#add-vulnerable-package-arch").val(); + var addVulnerablePackageAuto = $("#add-vulnerable-package-auto").val(); + + if(addVulnerablePackageId == "" || addVulnerablePackageIdentifier == "" || addVulnerablePackageVersion == "" || addVulnerablePackageSlot == "" || addVulnerablePackageArch == "" || addVulnerablePackageAuto == "") { + return; + } + + var newPackage = '
      ' + + '
      ' + + '
      ' + + '' + + '' + + '' + + '' + + '
      ' + + '
      ' + + '' + + '' + + '' + + '
      ' + + '
      ' + + '' + + '' + + '' + + '
      ' + + '
      ' + + '' + + '' + + '' + + '
      ' + + '
      ' + + '' + + '' + + '' + + '
      ' + + '
      ' + + '' + + '' + + '' + + '
      ' + + '
      ' + + '
      '; + + $("#vulnerable_package_list").append(newPackage); + + registerDeletePackageButtons(); +}); + + + +$('.btn-add-unaffected-package').on('click', function(event){ + + var addVulnerablePackageId = $("#add-unaffected-package-atom").val(); + var addVulnerablePackageIdentifier = $("#add-unaffected-package-identifier").val(); + var addVulnerablePackageVersion = $("#add-unaffected-package-version").val(); + var addVulnerablePackageSlot = $("#add-unaffected-package-slot").val(); + var addVulnerablePackageArch = $("#add-unaffected-package-arch").val(); + var addVulnerablePackageAuto = $("#add-unaffected-package-auto").val(); + + if(addVulnerablePackageId == "" || addVulnerablePackageIdentifier == "" || addVulnerablePackageVersion == "" || addVulnerablePackageSlot == "" || addVulnerablePackageArch == "" || addVulnerablePackageAuto == "") { + return; + } + + var newPackage = '
      ' + + '
      ' + + '
      ' + + '' + + '' + + '' + + '' + + '
      ' + + '
      ' + + '' + + '' + + '' + + '
      ' + + '
      ' + + '' + + '' + + '' + + '
      ' + + '
      ' + + '' + + '' + + '' + + '
      ' + + '
      ' + + '' + + '' + + '' + + '
      ' + + '
      ' + + '' + + '' + + '' + + '
      ' + + '
      ' + + '
      '; + + $("#unaffected_package_list").append(newPackage); + + registerDeletePackageButtons(); +}); + diff --git a/web/packs/glsa.js b/web/packs/glsa.js new file mode 100644 index 0000000..0490db0 --- /dev/null +++ b/web/packs/glsa.js @@ -0,0 +1,114 @@ + +$( "#save-new-glsa-comment" ).click(function() { + var glsaid = $("#glsa-id").html(); + var comment = $('#comment').val(); + $('#comment').val(" "); + $('#comment').focusout(); + + commentGLSA(glsaid, comment, "comment"); + +}); + +$( "#save-new-glsa-approve" ).click(function() { + var glsaid = $("#glsa-id").html(); + var comment = $('#comment').val(); + $('#comment').val(" "); + $('#comment').focusout(); + + commentGLSA(glsaid, comment, "approve"); + +}); + +$( "#save-new-glsa-decline" ).click(function() { + var glsaid = $("#glsa-id").html(); + var comment = $('#comment').val(); + $('#comment').val(" "); + $('#comment').focusout(); + + commentGLSA(glsaid, comment, "decline"); + +}); + +function commentGLSA(glsaid, comment, commentType){ + + $.post( + '/glsa/comment/add', + { + glsaid: glsaid, + comment: comment, + commentType: commentType, + }, + function(data) { + + if(data != "err") { + + + + console.log("hi"); + console.log(data); + var comment = JSON.parse(data); + var commentDate = comment.Date.split("T")[0] + ' ' + comment.Date.split("T")[1].split(".")[0] + ' UTC'; + var background = ""; + var hint = ""; + if(comment.Type == "approve"){ + background = "background:#DFF0D8;"; + hint = 'Approved: '; + } else if(comment.Type == "decline"){ + background = "background:#F2DEDE;"; + hint = 'Declined: '; + } + + var newComment = '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '' + + '' + + '' + + '' + + '' + + '' + comment.UserBadge.Name + '' + + '' + + '' + + '
      ' + + '
      ' + + '' + + commentDate + + '' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '' + + '' + + '' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + '
      ' + + hint + + comment.Message + + '
      ' + + '
      ' + + '
      '; + + $('#comments-section').append(newComment); + + } + return + }); +} + + +$('#btn-delete-glsa').on('click', function(event){ + var glsaid = $("#glsa-id").html(); + $.get( "/glsa/delete/" + glsaid, function( data ) { + document.location.href = "/"; + }); +}); + diff --git a/web/packs/newglsa.js b/web/packs/newglsa.js new file mode 100644 index 0000000..8b15ef8 --- /dev/null +++ b/web/packs/newglsa.js @@ -0,0 +1,58 @@ + +var BUGZILLA_URL = 'https://bugs.gentoo.org'; + +$( "#bugs" ).on('textInput input', refreshBugs); + +function refreshBugs(){ + $("#bug-refresh-ok").hide(); + $("#bug-refresh-failed").hide(); + $("#bug-spinner").show(); + + var bugIds = $("#bugs").val(); + + console.log(BUGZILLA_URL + "/rest/bug?id=" + bugIds); + + // validate data + var valid = true; + bugIds.split(",").forEach(function(bugID) { + if( bugIds == "" || isNaN(bugID) || !(bugID.length == 0 || bugID.length == 6 || bugID.length == 7) ){ + $( "#bug-spinner" ).hide(); + $( "#bug-refresh-failed" ).show(); + valid = false; + } + }); + + if(valid){ + $.getJSON( BUGZILLA_URL + "/rest/bug?id=" + bugIds, function( data ) { + + if(data.bugs.length != bugIds.split(",").length){ + $( "#bug-spinner" ).hide(); + $( "#bug-refresh-failed" ).show(); + return + } + + bugReady = true; + title = ""; + data.bugs.forEach(function(bug) { + title = title == "" ? bug.summary : title; + bugReady = bugReady && bug.whiteboard.includes("[glsa"); + }); + + if(bugReady){ + $(".badge-notbugready").hide(); + $(".badge-bugready").show(); + } else { + $(".badge-bugready").hide(); + $(".badge-notbugready").show(); + } + + if($("#title").val() == ""){ + $("#title").val(title); + } + + $("#bug-spinner").hide(); + $("#bug-refresh-ok").show(); + + }); + } +} diff --git a/web/packs/src/javascript/all.js b/web/packs/src/javascript/all.js new file mode 100644 index 0000000..715e472 --- /dev/null +++ b/web/packs/src/javascript/all.js @@ -0,0 +1,37 @@ + +function initDatatable(){ + if (window.AllDataTables.length === 0 && $('.all-data-table').length !== 0) { + $('.all-data-table').each((_, element) => { + + var table = $(element).DataTable( { + "order": [[ 0, "desc" ]], + "paging": true, + "ordering": true, + "searching": true, + "info": true, + "lengthChange": false, + "language": { + "emptyTable": "Currently there are no glsas available. -- Start with filling one." + } + }); + + window.AllDataTables.push(table); + + // Add event listener for opening and closing details + $('#table_id tbody').on('click', 'td', function () { + var tr = $(this).closest('tr'); + var row = table.row( tr ); + Turbolinks.visit("/glsa/" + row.data()[0]); + } ); + + }); + } +} + +function destroyDatatable() { + while (window.AllDataTables.length !== 0) { + window.AllDataTables.pop().destroy(); + } +} + +export default {initDatatable, destroyDatatable} diff --git a/web/packs/src/javascript/archive.js b/web/packs/src/javascript/archive.js new file mode 100644 index 0000000..088aa6b --- /dev/null +++ b/web/packs/src/javascript/archive.js @@ -0,0 +1,42 @@ + +function initDatatable(){ + if (window.ArchivesDataTables.length === 0 && $('.archives-data-table').length !== 0) { + $('.archives-data-table').each((_, element) => { + + var table = $(element).DataTable( { + "order": [[ 0, "desc" ]], + "paging": true, + "ordering": true, + "searching": true, + "info": true, + "lengthChange": false, + "language": { + "emptyTable": "Currently there are no GLSAs available. -- Start with releasing one." + }, + "columnDefs": [ + { + "targets": 'hide', + "visible": false + }], + }); + + window.ArchivesDataTables.push(table); + + // Add event listener for opening and closing details + $('#table_id tbody').on('click', 'td', function () { + var tr = $(this).closest('tr'); + var row = table.row( tr ); + Turbolinks.visit("/glsa/" + row.data()[0]); + } ); + + }); + } +} + +function destroyDatatable(){ + while (window.ArchivesDataTables.length !== 0) { + window.ArchivesDataTables.pop().destroy(); + } +} + +export default {initDatatable, destroyDatatable} diff --git a/web/packs/src/javascript/cvetool.js b/web/packs/src/javascript/cvetool.js new file mode 100644 index 0000000..6158714 --- /dev/null +++ b/web/packs/src/javascript/cvetool.js @@ -0,0 +1,535 @@ + +var BUGZILLA_URL = 'https://bugs.gentoo.org'; + + +function destroyDatatable(){ + while (window.dataTables.length !== 0) { + window.dataTables.pop().destroy(); + } +} + + +function initDatatable(){ + if (window.dataTables.length === 0 && $('.data-table').length !== 0) { + $('.data-table').each((_, element) => { + + var table = $(element).DataTable( { + "processing": true, + "serverSide": true, + "ajax": "/cve/data", + "order": [[ 0, "desc" ]], + "columnDefs": [ + { + "render": function ( data, type, row ) { + return '' + data + '' + }, + "targets" : 'render-bold', + }, + { + "render": function ( data, type, row ) { + var bugs = ' no assigned bugs'; + if(data!='' && JSON.parse(data) != null){ + bugs = ""; + JSON.parse(data).forEach(function(bug) { + bugs = bugs + bug.id + ","; + }); + } + return bugs; + }, + "targets" : 'render-bug', + }, + { + "targets" : 'no-sort', + "orderable": false, + }, + { + "render": function ( data, type, row ) { + return renderState(data, row[0]) + }, + "targets" : 'render-state', + }, + { + "render": function ( data, type, row ) { + if(data == "0.0"){ + return 'None' + }else if(parseFloat(data) < 4.0) { + return '' + data + '' + }else if(parseFloat(data) < 7.0) { + return '' + data + '' + }else if(parseFloat(data) < 9.0) { + return '' + data + '' + }else if(parseFloat(data) < 10.0) { + return '' + data + '' + } + return + + }, + "targets" : 'render-basescore', + }, + { + "targets": 'hide', + "visible": false + }], + buttons: [ + { + extend: 'colvis', + columns: ':not(.noVis)', + text: 'Columns', + className: 'btn-sm btn-outline-secondary colvis-btn' + }, + { + text: 'Fullscreen', + className: 'btn-sm btn-outline-secondary colvis-btn fullscreen-btn', + action: function ( e, dt, node, config ) { + if(window.location.href.includes("fullscreen")){ + Turbolinks.visit("/cve/tool"); + } else { + Turbolinks.visit("/cve/tool/fullscreen"); + } + } + }, + { + text: 'State', + className: 'btn-sm btn-outline-secondary float-left colvis-btn mr-2 dropdown-toggle view-filter-state' + } + ], + "initComplete": function( settings, json ) { + + $('#table_id_length').append( " Show " ); + table.buttons().container() + .appendTo( $('#table_id_length') ); + $('.buttons-colvis').removeClass("btn-secondary"); + + $('#table_id_length').append( " Toggle " ); + $('.fullscreen-btn').appendTo( $('#table_id_length') ); + + + $('#table_id_filter').prepend( '' ); + $('#table_id_filter').prepend( " Filter by " ); + $('.view-filter-state').prependTo( $('#filterByStateDropdown') ); + document.querySelector(".view-filter-state").setAttribute('data-toggle', 'dropdown'); + + $("#filterByStateNew").on('click', function () { + $('.view-filter-state').text("New"); + table.columns( 10 ).search( "New" ).draw(); + }); + + $("#filterByStateAssigned").on('click', function () { + $('.view-filter-state').text("Assigned"); + table.columns( 10 ).search( "Assigned" ).draw(); + }); + + $("#filterByStateNFU").on('click', function () { + $('.view-filter-state').text("NFU"); + table.columns( 10 ).search( "NFU" ).draw(); + }); + + $("#filterByStateLater").on('click', function () { + $('.view-filter-state').text("Later"); + table.columns( 10 ).search( "Later" ).draw(); + }); + + $("#filterByStateInvalid").on('click', function () { + $('.view-filter-state').text("Invalid"); + table.columns( 10 ).search( "Invalid" ).draw(); + }); + + $("#filterByStateAll").on('click', function () { + $('.view-filter-state').text("State"); + table.columns( 10 ).search( "" ).draw(); + }); + + }, + + }); + + window.dataTables.push(table); + + // Add event listener for opening and closing details + $('#table_id tbody').on('click', 'td', function () { + var tr = $(this).closest('tr'); + var row = table.row( tr ); + + if ( row.child.isShown() ) { + // This row is already open - close it + row.child.hide(); + tr.removeClass('shown'); + } + else { + // Open this row + row.child( format(row.data()) ).show(); + tr.addClass('shown'); + + registerCommentListener(); + + registerAssignBugListener(); + + registerChangeStateListener(); + + } + } ); + + }); + } +} + +function renderState( d, cveid ) { + if(d == "New"){ + return '' + d + '' + }else if(d == "Assigned") { + return '' + d + '' + }else if(d == "NFU") { + return '' + d + '' + }else if(d == "Later") { + return '' + d + '' + }else if(d == "Invalid") { + return '' + d + '' + }else{ + return '' + d + '' + } + return d +} + +function format ( d ) { + + var bugs = ' no assigned bugs'; + if(d[3]!='' && JSON.parse(d[3]) != null){ + + bugs = ""; + + JSON.parse(d[3]).forEach(function(bug) { + bugs = bugs + bug.id + ","; + }); + + } + + var packages = ' no assigned packages'; + if(d[2]!=''){ + packages = d[2]; + } + + var comments = '
      - no comments yet -
      '; + if(d[7]!='null') { + console.log("CommentsObject"); + console.log(d[7]); + console.log(JSON.parse(d[7])); + + var commentsObjects = JSON.parse(d[7]); + comments = ''; + commentsObjects.forEach(function (comment, index) { + var commentDate = '' + comment.Date.split("T")[0] + ' ' + comment.Date.split("T")[1].split(".")[0] + ' UTC'; + comments = comments + '
      ' + comment.User + '
      ' + commentDate + '
      ' + comment.Message + '
      '; + }); + } + + var bugs_cards = '
      - no assigned bugs yet -
      '; + if(d[3]!='' && JSON.parse(d[3]) != null) { + + bugs_cards = ''; + + JSON.parse(d[3]).forEach(function(bug) { + var newBug = '
      Bug ' + bug.id + '
      ' + escapeHtml(bug.summary) + '
      Alias: ' + bug.alias.join(", ") + '
      Status: ' + escapeHtml(bug.status) + '
      Whiteboard: ' + escapeHtml(bug.whiteboard) + '
      Created: ' + escapeHtml(bug.creation_time) + '
      '; + bugs_cards = bugs_cards + newBug; + }); + + } + + var changes = 'no changes yet'; + + // `d` is the original data object for the row + return '
      ' + + '
      ' + + '

      Details of ' + d[0] + '

      ' + + '
      ' + + '' + d[1] + '' + + '
      ' + + bugs_cards + + '
      ' + + ''+ + ''+ + '
      ' + + (window.userCanAssignBug ? '
      ' : '') + + '
      '+ + // '
      ' + + '
      ' + + // '
      Comments
      ' + + comments + + '
      ' + + ''+ + '
      ' + + (window.userCanComment ? '
      ' : '') + + '
      '+ + '
      '+ + '
      ' + + ''+ + ''+ + '' + + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + // ''+ + // ''+ + '
      State:'+ renderState(d[10], d[0]) + ( (window.userCanChangeState && d[10] != 'Assigned') ? '' : '') + '
      Last Modified:'+ d[8] + '
      Published:'+ d[9] + '
      Base Score:'+ d[4] + '
      Impact:'+ d[5] + '
      Bug(s):'+ bugs + '
      Package(s):'+ packages + '
      Reference(s):'+ d[6] + '
      Comments:'+ d[7] + '
      Changelog:'+ changes + '
      '+ + '
      '+ + '
      '+ + '
      '; +} + + +$( "#disable-twofactor-notice" ).click(function() { + $("#twofactor-notice").hide(); + $.get( "/account/2fa/notice/disable", function( data ) { + console.log("Disabled 2FA Notice.") + }); +}); + + +function registerCommentListener(){ + + $( ".trigger-new-comment" ).click(function() { + $('.new-comment-row[data-cveid="' + $(this).data( "cveid" ) + '"]').show(); + $('.trigger-new-comment[data-cveid="' + $(this).data( "cveid" ) + '"]').hide(); + }); + + $( ".btn-cancel-comment" ).click(function() { + $('.new-comment-row[data-cveid="' + $(this).data( "cveid" ) + '"]').hide(); + $('.trigger-new-comment[data-cveid="' + $(this).data( "cveid" ) + '"]').show(); + }); + + $( ".save-new-comment" ).click(function() { + var cveid = $(this).data( "cveid" ); + var comment = $('textarea.new-comment[data-cveid="' + cveid + '"]').val(); + console.log('textarea:'); + console.log(); + + + $.post( + '/cve/comment/add', + { + cveid: cveid, + comment: comment, + }, + function(data) { + + if(data != "err") { + console.log("hi"); + console.log(data); + var comment = JSON.parse(data); + var commentDate = '' + comment.Date.split("T")[0] + ' ' + comment.Date.split("T")[1].split(".")[0] + ' UTC'; + var newComment = '
      ' + comment.User + '
      ' + commentDate + '
      ' + comment.Message + '
      '; + $('.comments-section[data-cveid="' + cveid + '"]').append(newComment); + } + return + }); + }); +} + +function registerAssignBugListener(){ + + + $( ".trigger-assign-bug" ).click(function() { + var cveid = $(this).data( "cveid" ); + showAssignBugForm(cveid); + }); + + $( ".btn-cancel-assign-bug" ).click(function() { + var cveid = $(this).data( "cveid" ); + hideAssignBugForm(cveid); + }); + + $( ".btn-save-assign-bug" ).click(function() { + var cveid = $(this).data( "cveid" ); + var bugid = $('input.assign-bug[data-cveid="' + cveid + '"]').val(); + + assignBug(cveid, bugid); + hideAssignBugForm(cveid); + }); +} + +function showAssignBugForm(cveid){ + $('.assign-bug-row[data-cveid="' + cveid + '"]').show(); + $('.trigger-assign-bug[data-cveid="' + cveid + '"]').hide(); + $('.trigger-new-bug[data-cveid="' + cveid + '"]').hide(); +} + +function hideAssignBugForm(cveid) { + $('.assign-bug-row[data-cveid="' + cveid + '"]').hide(); + $('.trigger-assign-bug[data-cveid="' + cveid + '"]').show(); + $('.trigger-new-bug[data-cveid="' + cveid + '"]').show(); +} + + +function assignBug(cveid, bugid){ + + $.post( + '/cve/bug/assign', + { + cveid: cveid, + bugid: bugid, + }, + function(data) { + if(data != "err") { + console.log("hi"); + console.log(data); + + if(data == "ok"){ + + setStateToAssigned(cveid); + + var newBug = '
      Bug ' + bugid + '
      Loading...
      Alias:
      Status:
      Resolution:
      Whiteboard:
      Created:
      Last Update:
      '; + $('.bugs-section[data-cveid="' + cveid + '"]').append(newBug); + + updateBugInformation(cveid, bugid); + } + + } + }); +} + + +function registerChangeStateListener(){ + + $( ".change-state-nfu" ).click(function() { + var cveid = $(this).data( "cveid" ); + var reason = $('.change-state-reason[data-cveid="' + cveid + '"]').val(); + if(reason != "") { + changeState(cveid, reason, "NFU"); + $("#collapseExample-" + cveid).removeClass('show'); + }else{ + $('.change-state-reason[data-cveid="' + cveid + '"]').addClass('is-invalid'); + } + }); + + $( ".change-state-invalid" ).click(function() { + var cveid = $(this).data( "cveid" ); + var reason = $('.change-state-reason[data-cveid="' + cveid + '"]').val(); + if(reason != "") { + changeState(cveid, reason, "Invalid"); + $("#collapseExample-" + cveid).removeClass('show'); + }else{ + $('.change-state-reason[data-cveid="' + cveid + '"]').addClass('is-invalid'); + } + }); + + $( ".change-state-later" ).click(function() { + var cveid = $(this).data( "cveid" ); + var reason = $('.change-state-reason[data-cveid="' + cveid + '"]').val(); + if(reason != ""){ + changeState(cveid, reason, "Later"); + $("#collapseExample-" + cveid).removeClass('show'); + }else{ + $('.change-state-reason[data-cveid="' + cveid + '"]').addClass('is-invalid'); + } + }); +} + +function changeState(cveid, reason, newState){ + + $.post( + '/cve/state/change', + { + cveid: cveid, + newstate: newState, + reason: reason, + }, + function(data) { + if(data != "err") { + console.log("hi"); + console.log(data); + + // change state + setStateTo(cveid, newState); + + // add comment + var comment = JSON.parse(data); + var commentDate = '' + comment.Date.split("T")[0] + ' ' + comment.Date.split("T")[1].split(".")[0] + ' UTC'; + var newComment = '
      ' + comment.User + '
      ' + commentDate + '
      ' + escapeHtml(comment.Message) + '
      '; + $('.comments-section[data-cveid="' + cveid + '"]').append(newComment); + + } + }); +} + + +function setStateToAssigned(cveid) { + setStateTo(cveid, "Assigned"); +} + +function setStateTo(cveid, newState) { + $('.state[data-cveid="' + cveid + '"]').removeClass('badge-primary'); + $('.state[data-cveid="' + cveid + '"]').removeClass('badge-secondary'); + $('.state[data-cveid="' + cveid + '"]').removeClass('badge-success'); + $('.state[data-cveid="' + cveid + '"]').removeClass('badge-danger'); + $('.state[data-cveid="' + cveid + '"]').removeClass('badge-warning'); + $('.state[data-cveid="' + cveid + '"]').removeClass('badge-info'); + $('.state[data-cveid="' + cveid + '"]').removeClass('badge-light'); + $('.state[data-cveid="' + cveid + '"]').removeClass('badge-dark'); + + if(newState == "New"){ + $('.state[data-cveid="' + cveid + '"]').addClass('badge-danger'); + } else if(newState == "Assigned"){ + $('.state[data-cveid="' + cveid + '"]').addClass('badge-success'); + } else if(newState == "NFU"){ + $('.state[data-cveid="' + cveid + '"]').addClass('badge-info'); + } else if(newState == "Later"){ + $('.state[data-cveid="' + cveid + '"]').addClass('badge-warning'); + } else if(newState == "Invalid"){ + $('.state[data-cveid="' + cveid + '"]').addClass('badge-dark'); + } else { + $('.state[data-cveid="' + cveid + '"]').addClass('badge-primary'); + } + + $('.state[data-cveid="' + cveid + '"]').html(newState); +} + + +function updateBugInformation(cveid, bugid){ + $.getJSON( BUGZILLA_URL + "/rest/bug?id=" + bugid, function( data ) { + console.log(data.bugs[0]); + + console.log(escapeHtml(data.bugs[0].alias.join(", "))); + console.log(escapeHtml(data.bugs[0].status)); + console.log(escapeHtml(data.bugs[0].resolution)); + console.log(escapeHtml(data.bugs[0].whiteboard)); + console.log(escapeHtml(data.bugs[0]['creation_time'])); + console.log(escapeHtml(data.bugs[0]['last_change_time'])); + + $('.bug-title[data-cveid="' + cveid + '"][data-bugid="' + bugid + '"]').html(escapeHtml(data.bugs[0].summary)); + + $('.bug-alias[data-cveid="' + cveid + '"][data-bugid="' + bugid + '"]').html('' + escapeHtml(data.bugs[0].alias.join(", ")) + ''); + $('.bug-status[data-cveid="' + cveid + '"][data-bugid="' + bugid + '"]').html('' + escapeHtml(data.bugs[0].status) + ''); + $('.bug-resolution[data-cveid="' + cveid + '"][data-bugid="' + bugid + '"]').html('' + escapeHtml(data.bugs[0].resolution) + ''); + $('.bug-whiteboard[data-cveid="' + cveid + '"][data-bugid="' + bugid + '"]').html('' + escapeHtml(data.bugs[0].whiteboard) + ''); + $('.bug-created[data-cveid="' + cveid + '"][data-bugid="' + bugid + '"]').html('' + escapeHtml(data.bugs[0]['creation_time']) + ''); + $('.bug-last-update[data-cveid="' + cveid + '"][data-bugid="' + bugid + '"]').html('' + escapeHtml(data.bugs[0]['last_change_time']) + ''); + + }); +} + + +function escapeHtml(unsafe) { + return unsafe + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); +} + +export default {initDatatable, destroyDatatable} diff --git a/web/packs/src/javascript/drafts.js b/web/packs/src/javascript/drafts.js new file mode 100644 index 0000000..0430b15 --- /dev/null +++ b/web/packs/src/javascript/drafts.js @@ -0,0 +1,38 @@ + + +function initDatatable(){ + if (window.DraftsDataTables.length === 0 && $('.drafts-data-table').length !== 0) { + $('.drafts-data-table').each((_, element) => { + + var table = $(element).DataTable( { + "order": [[ 0, "desc" ]], + "paging": true, + "ordering": true, + "searching": true, + "info": true, + "lengthChange": false, + "language": { + "emptyTable": "Currently there are no drafts available. -- Start with creating one." + } + }); + + window.DraftsDataTables.push(table); + + // Add event listener for opening and closing details + $('#table_id tbody').on('click', 'td', function () { + var tr = $(this).closest('tr'); + var row = table.row( tr ); + Turbolinks.visit("/glsa/" + row.data()[0]); + } ); + + }); + } +} + +function destroyDatatable(){ + while (window.DraftsDataTables.length !== 0) { + window.DraftsDataTables.pop().destroy(); + } +} + +export default {initDatatable, destroyDatatable} diff --git a/web/packs/src/javascript/requests.js b/web/packs/src/javascript/requests.js new file mode 100644 index 0000000..75a4a6a --- /dev/null +++ b/web/packs/src/javascript/requests.js @@ -0,0 +1,37 @@ + +function initDatatable(){ + if (window.RequestsDataTables.length === 0 && $('.requests-data-table').length !== 0) { + $('.requests-data-table').each((_, element) => { + + var table = $(element).DataTable( { + "order": [[ 0, "desc" ]], + "paging": true, + "ordering": true, + "searching": true, + "info": true, + "lengthChange": false, + "language": { + "emptyTable": "Currently there are no requests available. -- Start with filling one." + } + }); + + window.RequestsDataTables.push(table); + + // Add event listener for opening and closing details + $('#table_id tbody').on('click', 'td', function () { + var tr = $(this).closest('tr'); + var row = table.row( tr ); + Turbolinks.visit("/glsa/" + row.data()[0]); + } ); + + }); + } +} + +function destroyDatatable() { + while (window.RequestsDataTables.length !== 0) { + window.RequestsDataTables.pop().destroy(); + } +} + +export default {initDatatable, destroyDatatable} diff --git a/web/packs/src/stylesheets/application.scss b/web/packs/src/stylesheets/application.scss new file mode 100644 index 0000000..8d97498 --- /dev/null +++ b/web/packs/src/stylesheets/application.scss @@ -0,0 +1,11 @@ +@import "~@gentoo/tyrian/dist/tyrian"; +@import "~@gentoo/tyrian/dist/components/searchbars"; + +@import "~datatables.net-bs4/css/dataTables.bootstrap4"; +@import "~datatables.net-buttons-bs4/css/buttons.bootstrap4"; + +@import "~taucharts/dist/taucharts"; +@import "~taucharts/dist/plugins/tooltip"; +//@import "~taucharts/dist/taucharts"; + +@import "index"; diff --git a/web/packs/src/stylesheets/index.scss b/web/packs/src/stylesheets/index.scss new file mode 100644 index 0000000..39fa518 --- /dev/null +++ b/web/packs/src/stylesheets/index.scss @@ -0,0 +1,27 @@ +.navigation_link { + color: #777; + font-style: italic; +} + +.comment_tab { + border-top: none; + border-left: none; + border-right: none; + font-size: 13px; + display: table-cell; + padding: 2px 1em; + cursor: pointer; + background: transparent; +} + +.active_comment_tab { + background: transparent; + border-bottom: 4px solid #54487a; + color: #54487a; +} + + +.index_page_icon { + color: #54487A; + text-align: center; +} diff --git a/web/packs/statistics.js b/web/packs/statistics.js new file mode 100644 index 0000000..43f9a27 --- /dev/null +++ b/web/packs/statistics.js @@ -0,0 +1,15 @@ + +Taucharts = require( 'taucharts' ); +require( 'taucharts/dist/plugins/tooltip' ); + + + +var chart = new Taucharts.Chart({ + type: 'horizontal-stacked-bar', + y: 'type', + x: 'count', + color: 'stage', + plugins: [Taucharts.api.plugins.get('tooltip')()], + data: window.CHART_DATA, +}); +chart.renderTo('#bar'); diff --git a/web/packs/stylesheets.js b/web/packs/stylesheets.js new file mode 100644 index 0000000..07a767b --- /dev/null +++ b/web/packs/stylesheets.js @@ -0,0 +1 @@ +import './src/stylesheets/application.scss'; diff --git a/web/templates/about/about.tmpl b/web/templates/about/about.tmpl new file mode 100644 index 0000000..8f22826 --- /dev/null +++ b/web/templates/about/about.tmpl @@ -0,0 +1,31 @@ + + +{{template "head"}} + +{{template "header" .}} + +
      +
      +
      + + +

      About GLSAMaker

      + +
      + +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

      + +

      Curabitur pretium tincidunt lacus. Nulla gravida orci a odio. Nullam varius, turpis et commodo pharetra, est eros bibendum elit, nec luctus magna felis sollicitudin mauris. Integer in mauris eu nibh euismod gravida. Duis ac tellus et risus vulputate vehicula. Donec lobortis risus a elit. Etiam tempor. Ut ullamcorper, ligula eu tempor congue, eros est euismod turpis, id tincidunt sapien risus a quam. Maecenas fermentum consequat mi. Donec fermentum. Pellentesque malesuada nulla a mi. Duis sapien sem, aliquet nec, commodo eget, consequat quis, neque. Aliquam faucibus, elit ut dictum aliquet, felis nisl adipiscing sapien, sed malesuada diam lacus eget erat. Cras mollis scelerisque nunc. Nullam arcu. Aliquam consequat. Curabitur augue lorem, dapibus quis, laoreet et, pretium ac, nisi. Aenean magna nisl, mollis quis, molestie eu, feugiat in, orci. In hac habitasse platea dictumst.

      + +
      + +
      +
      +
      + + + +{{template "footer" .}} + + + diff --git a/web/templates/about/aboutCLI.tmpl b/web/templates/about/aboutCLI.tmpl new file mode 100644 index 0000000..beef42a --- /dev/null +++ b/web/templates/about/aboutCLI.tmpl @@ -0,0 +1,30 @@ + + +{{template "head"}} + +{{template "header" .}} + +
      +
      +
      + +

      About the Command Line Tool

      + +
      + + + +
      + +
      +
      +
      + + + +{{template "footer" .}} + + + diff --git a/web/templates/about/aboutSearch.tmpl b/web/templates/about/aboutSearch.tmpl new file mode 100644 index 0000000..0c6c9f4 --- /dev/null +++ b/web/templates/about/aboutSearch.tmpl @@ -0,0 +1,71 @@ + + +{{template "head"}} + +{{template "header" .}} + +
      +
      +
      + + +

      About the Search

      + +
      + + The search search can be used to for navigating through the GLSAMaker. The following types of search queries are supported + +

      Navigate to pages

      +
        +
      • #home will navigate to '/'
      • +
      • #dashboard will navigate to '/dashboard'
      • +
      • #new will navigate to '/new'
      • +
      • #cvetool will navigate to '/cve/tool'
      • +
      • #requests will navigate to '/requests'
      • +
      • #drafts will navigate to '/drafts'
      • +
      • #all will navigate to '/all'
      • +
      • #archive will navigate to '/archive'
      • +
      • #about will navigate to '/about'
      • +
      • #admin will navigate to '/admin'
      • +
      • #password will navigate to '/account/password'
      • +
      • #2fa will navigate to '/account/2fa'
      • +
      • #statistics will navigate to '/statistics'
      • +
      • #logout will navigate to '/logout'
      • +
      • #bugzilla will navigate to 'https://bugs.gentoo.org'
      • +
      + +

      Navigate to GLSAs

      + +
        +
      • numeric value will navigate to '/glsa/#id'
      • +
      + +

      Search for GLSAs

      + +
        +
      • search string will search for GLSAs in the following fields: +
          +
        • title
        • +
        • type
        • +
        • synopsis
        • +
        • description
        • +
        • workaround
        • +
        • resolution
        • +
        • keyword
        • +
        • background
        • +
        +
      • +
      + +
      + +
      +
      +
      + + + +{{template "footer" .}} + + + diff --git a/web/templates/account/2fa.tmpl b/web/templates/account/2fa.tmpl new file mode 100644 index 0000000..dcb38a5 --- /dev/null +++ b/web/templates/account/2fa.tmpl @@ -0,0 +1,186 @@ + + +{{template "head"}} + +{{template "header" .}} + + +
      +
      +
      +

      Two Factor Authentication

      +
      + + {{ if .User.Force2FA }} + {{ if .User.IsUsingTOTP }} + {{ else if .User.IsUsingWebAuthn }} + {{ else }} +
      + +
      + {{end}} + {{end}} + +
      + +

      Time-based One-time Passwords{{ if .User.IsUsingTOTP }} active{{end}}

      + +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

      + +
      + +
      +
      +
      + +
      +
      + +
      +
      +

      Please scan the qr-code and enter the six-digit code shown in your Authenticator app.

      + + + + + + + +
      +
      + +
      +
      + +
      + + {{ if .User.IsUsingTOTP }} +
      + Disable +
      + {{ else }} +
      + Activate +
      + {{ end }} + +

      + + + +
      + +

      WebAuthn{{ if .User.IsUsingWebAuthn }} active{{end}}

      + +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

      + +
      + + +
      +
      +
      + +
      + + {{ if .User.WebauthnCredentials }} +
      +
      + {{range .User.WebauthnCredentials}} + +

      {{CredentialName $.User .}}

      + ID: {{ WebAuthnID . }} +
      + {{end}} +
      +
      + {{ else }} +
      + +

      No Authenticators present.

      +
      + {{ end }} + +
      +

      Click on the button below to add a new authenticator.

      + + + + {{ if .User.WebauthnCredentials }} + + {{ end }} + + +
      +
      + +
      +
      + +
      + + + {{ if .User.IsUsingWebAuthn }} +
      + Disable +
      + {{ else }} +
      + Activate +
      + {{ end }} + +
      + + + + + + +
      + + +{{template "footer" .}} + + + + + + diff --git a/web/templates/account/password/forcedchange.tmpl b/web/templates/account/password/forcedchange.tmpl new file mode 100644 index 0000000..d80b874 --- /dev/null +++ b/web/templates/account/password/forcedchange.tmpl @@ -0,0 +1,98 @@ +{{define "forcedPasswordChange"}} + + + + + + Gentoo Security + + + + + + + + + + + + +
      +
      +
      + +
      + +
      +
      +
      +
      + + Gentoo Linux logo + +

      Change your Password

      +
      + +
      + Sorry, but you have to change your password, before you can continue. +
      + +
      +
      +
      + + + + +
      +
      +
      + +
      +
      +
      + +
      +
      + + + + + + + +
      +
      +
      + To create a new account, please contact the security team and request access. +
      +
      + +
      +
      + In case you've forgotten your password, please contact the security team and ask an admin to reset your password. +
      +
      +
      + +
      +
      + +
      +
      + + + +
      +
      + + + + + + + + + + +{{end}} diff --git a/web/templates/account/password/normalchange.tmpl b/web/templates/account/password/normalchange.tmpl new file mode 100644 index 0000000..48b35bd --- /dev/null +++ b/web/templates/account/password/normalchange.tmpl @@ -0,0 +1,45 @@ +{{define "normalPasswordChange"}} + + + + {{template "head"}} + + {{template "header" .}} + + +
      +
      +
      +

      Change your password

      +
      + + {{if .Message}} +
      + +
      + {{end}} + +
      +
      +
      +
      + + + + +
      +
      +
      +
      +
      +
      + + + {{template "footer" .}} + + + + +{{end}} diff --git a/web/templates/account/password/password.tmpl b/web/templates/account/password/password.tmpl new file mode 100644 index 0000000..5f996c9 --- /dev/null +++ b/web/templates/account/password/password.tmpl @@ -0,0 +1,5 @@ +{{if .User.ForcePasswordRotation}} + {{template "forcedPasswordChange" .}} +{{else}} + {{template "normalPasswordChange" .}} +{{end}} diff --git a/web/templates/admin/components/global.tmpl b/web/templates/admin/components/global.tmpl new file mode 100644 index 0000000..c0a5fe0 --- /dev/null +++ b/web/templates/admin/components/global.tmpl @@ -0,0 +1,45 @@ +{{define "viewGlobal"}} +
      +
      +
      + Global 2FA Settings (coming soon) + +
      +
      +
      +
      + Force 2FA to login (coming soon) + +
      +
      + Force 2FA to release GLSA (coming soon) + +
      +
      +
      +
      +
      +{{end}} + +{{define "editGlobal"}} +
      +
      +
      + Global 2FA Settings + +
      +
      +
      +
      + Force 2FA to login + +
      +
      + Force 2FA to release GLSA (coming soon) + +
      +
      +
      +
      +
      +{{end}} diff --git a/web/templates/admin/components/permissions.tmpl b/web/templates/admin/components/permissions.tmpl new file mode 100644 index 0000000..32b7dc6 --- /dev/null +++ b/web/templates/admin/components/permissions.tmpl @@ -0,0 +1,424 @@ +{{define "viewPermissions"}} +
      +
      + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{range .Users}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{end}} + + +
      GLSACVEAdmin
      User + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      {{.Email}} + {{if .Permissions.Glsa.View}} + + {{else}} + + {{end}} + + {{if .Permissions.Glsa.UpdateBugs}} + + {{else}} + + {{end}} + + {{if .Permissions.Glsa.Comment}} + + {{else}} + + {{end}} + + {{if .Permissions.Glsa.Create}} + + {{else}} + + {{end}} + + {{if .Permissions.Glsa.Edit}} + + {{else}} + + {{end}} + + {{if .Permissions.Glsa.Delete}} + + {{else}} + + {{end}} + + {{if .Permissions.Glsa.Approve}} + + {{else}} + + {{end}} + + {{if .Permissions.Glsa.ApproveOwnGlsa}} + + {{else}} + + {{end}} + + {{if .Permissions.Glsa.Decline}} + + {{else}} + + {{end}} + + {{if .Permissions.Glsa.Release}} + + {{else}} + + {{end}} + + {{if .Permissions.Glsa.Confidential}} + + {{else}} + + {{end}} + + {{if .Permissions.CVETool.View}} + + {{else}} + + {{end}} + + {{if .Permissions.CVETool.UpdateCVEs}} + + {{else}} + + {{end}} + + {{if .Permissions.CVETool.Comment}} + + {{else}} + + {{end}} + + {{if .Permissions.CVETool.AddPackage}} + + {{else}} + + {{end}} + + {{if .Permissions.CVETool.ChangeState}} + + {{else}} + + {{end}} + + {{if .Permissions.CVETool.AssignBug}} + + {{else}} + + {{end}} + + {{if .Permissions.Admin.View}} + + {{else}} + + {{end}} + + {{if .Permissions.Admin.CreateTemplates}} + + {{else}} + + {{end}} + + {{if .Permissions.Admin.GlobalSettings}} + + {{else}} + + {{end}} + + {{if .Permissions.Admin.ManageUsers}} + + {{else}} + + {{end}} +
      +
      +
      +
      +{{end}} + + + +{{define "editPermissions"}} +
      +
      + +
      +
      + User Permissions + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{range .Users}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{end}} + + +
      GLSACVEAdmin
      User + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + {{.Email}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +
      +
      +
      +
      +{{end}} + diff --git a/web/templates/admin/components/templates.tmpl b/web/templates/admin/components/templates.tmpl new file mode 100644 index 0000000..470b229 --- /dev/null +++ b/web/templates/admin/components/templates.tmpl @@ -0,0 +1,10 @@ +{{define "viewTemplates"}} +
      +
      +
      + Template Management (coming soon) + +
      +
      +
      +{{end}} diff --git a/web/templates/admin/components/users.tmpl b/web/templates/admin/components/users.tmpl new file mode 100644 index 0000000..b7b2e87 --- /dev/null +++ b/web/templates/admin/components/users.tmpl @@ -0,0 +1,226 @@ + +{{define "viewUsers"}} + +
      +
      + +
      + + + + + + + + + + + + + + + + {{range .Users}} + + + + + + + + + + + + {{end}} + +
      BadgeNickNameEmailTOTPWebAuthnRotate PasswordForce 2FAActive
      + + + + {{.Badge.Name}} + + + {{.Nick}}{{.Name}}{{.Email}} + {{if .IsUsingTOTP}} + + {{else}} + + {{end}} + + {{if .IsUsingWebAuthn}} + + {{else}} + + {{end}} + + {{if .ForcePasswordRotation}} + + {{else}} + + {{end}} + + {{if .Force2FA}} + + {{else}} + + {{end}} + + {{if not .Disabled}} + + {{else}} + + {{end}} +
      + + {{if .NewUserNick}} + + {{end}} + +
      +
      +
      + +{{end}} + + + +{{define "editUsers"}} + +
      +
      + +
      +
      + User Management + + +
      +
      + + + + + + + + + + + + + + + + + {{range .Users}} + + + + + + + + + + + + + {{end}} + + + + + + + + + + + + + + + + + + +
      BadgeNickNameEmailTOTPWebAuthnRotate PasswordForce 2FAActive
      + + + {{.Badge.Name}} + + + + + + + + + + {{if .IsUsingTOTP}} + + {{else}} + + {{end}} + + {{if .IsUsingWebAuthn}} + + {{else}} + + {{end}} + + + + + + + + + + + + +
      + + + user + + + + + + + + + + + + + + + + + + + +
      +
      +
      +
      +
      + +{{end}} + diff --git a/web/templates/admin/edit/permissions.tmpl b/web/templates/admin/edit/permissions.tmpl new file mode 100644 index 0000000..c25d2ea --- /dev/null +++ b/web/templates/admin/edit/permissions.tmpl @@ -0,0 +1,36 @@ + + +{{template "head"}} + +{{template "header" .}} + +
      +
      +
      + + +

      Admin Area

      + +
      + + {{template "viewGlobal"}} + + {{template "viewUsers" .}} + + {{template "editPermissions" .}} + + {{template "viewTemplates"}} + +
      + +
      +
      +
      + + + +{{template "footer" .}} + + + + diff --git a/web/templates/admin/edit/users.tmpl b/web/templates/admin/edit/users.tmpl new file mode 100644 index 0000000..68b1b8e --- /dev/null +++ b/web/templates/admin/edit/users.tmpl @@ -0,0 +1,37 @@ + + +{{template "head"}} + +{{template "header" .}} + +
      +
      +
      + + +

      Admin Area

      + +
      + + {{template "viewGlobal"}} + + {{template "editUsers" .}} + + {{template "viewPermissions" .}} + + {{template "viewTemplates"}} + +
      + +
      +
      +
      + + + +{{template "footer" .}} + + + + + diff --git a/web/templates/admin/passwordreset.tmpl b/web/templates/admin/passwordreset.tmpl new file mode 100644 index 0000000..9b386f0 --- /dev/null +++ b/web/templates/admin/passwordreset.tmpl @@ -0,0 +1,35 @@ + + +{{template "head"}} + +{{template "header" .}} + +
      +
      +
      + + +

      Reset Password of {{.UserNick}}?

      + +
      + +
      +
      + No + +
      +
      + +
      + +
      +
      +
      + + + +{{template "footer" .}} + + + + diff --git a/web/templates/admin/view.tmpl b/web/templates/admin/view.tmpl new file mode 100644 index 0000000..2b32fdc --- /dev/null +++ b/web/templates/admin/view.tmpl @@ -0,0 +1,41 @@ + + +{{template "head"}} + +{{template "header" .}} + +
      +
      +
      + + +

      Admin Area

      + +
      + + {{if .User.Permissions.Admin.GlobalSettings}} + {{template "viewGlobal"}} + {{end}} + + {{if .User.Permissions.Admin.ManageUsers}} + {{template "viewUsers" .}} + {{template "viewPermissions" .}} + {{end}} + + {{if .User.Permissions.Admin.CreateTemplates}} + {{template "viewTemplates"}} + {{end}} + +
      + +
      +
      +
      + + + +{{template "footer" .}} + + + + diff --git a/web/templates/all/all.tmpl b/web/templates/all/all.tmpl new file mode 100644 index 0000000..1280ea4 --- /dev/null +++ b/web/templates/all/all.tmpl @@ -0,0 +1,86 @@ + + +{{template "head"}} + +{{template "header" .}} + + + +
      +
      +
      + + +

      All

      + + + + + + + + + + + + + + + + + + {{ range .All}} + + + + + + + + + + + + {{end}} + +
      IDTypeTitleRequesterDateBug ReadyApprovedWorkflowPermissions
      {{.Id}}{{.Type}}{{.Title}}{{.Creator.Nick}}{{.Created}} + + + + + {{if .Status.BugReady }}READY{{else}}NOT READY{{end}} + + + + + + {{.Status.Approval}} + + + + + {{.Status.WorkflowStatus}} + + + + + {{ if eq .Status.Permission "public"}}PUBLIC{{else}}CONFIDENTAL{{end}} + +
      + + +
      +
      +
      + + + +{{template "footer" .}} + + + + diff --git a/web/templates/archive/archive.tmpl b/web/templates/archive/archive.tmpl new file mode 100644 index 0000000..8550d1e --- /dev/null +++ b/web/templates/archive/archive.tmpl @@ -0,0 +1,75 @@ + + +{{template "head"}} + +{{template "header" .}} + + +
      +
      +
      + + +

      Released GLSAs

      + + + + + + + + + + + + + + + {{ range .GLSAs}} + + + + + + + + + {{end}} + +
      IDGLSA IDTitleRequesterDateState
      {{.Id}}{{.Alias}}{{.Title}}{{.Creator.Nick}}{{.Created}} + + + {{ if eq .Status.Permission "public"}}PUBLIC{{else}}CONFIDENTAL{{end}} + + + + + {{.Status.WorkflowStatus}} + + + + + {{.Status.Approval}} + + + + + + + {{if .Status.BugReady }}READY{{else}}NOT READY{{end}} + +
      + + +
      +
      +
      + + + +{{template "footer" .}} + + + + + diff --git a/web/templates/authentication/accessDenied.tmpl b/web/templates/authentication/accessDenied.tmpl new file mode 100644 index 0000000..a6042ec --- /dev/null +++ b/web/templates/authentication/accessDenied.tmpl @@ -0,0 +1,26 @@ + + +{{template "head"}} + +{{template "header" .}} + +
      + +
      + + + +

      - ACCESS DENIED -

      + +

      Sorry, you are missing the necessary rights to access this page.

      + + + +
      + + +{{template "footer" .}} + + + + diff --git a/web/templates/authentication/login.tmpl b/web/templates/authentication/login.tmpl new file mode 100644 index 0000000..b7ec356 --- /dev/null +++ b/web/templates/authentication/login.tmpl @@ -0,0 +1,113 @@ + + + + + Gentoo Security + + + + + + + + + + + + +
      +
      +
      + +
      + +
      +
      +
      +
      + + Gentoo Linux logo + +
      + +
      + +
      +
      + + +
      +
      + + +
      +
      + + Restrict this session to this IP address + (using this option improves security) +
      +
      + +
      + + +
      +
      + +
      +
      + +
      +
      +
      +
      + + +
      + +
      +
      +
      + +
      +
      + + + + + + + +
      +
      +
      + To create a new account, please contact the security team and request access. +
      +
      + +
      +
      + In case you've forgotten your password, please contact the security team and ask an admin to reset your password. +
      +
      +
      + +
      +
      + +
      +
      + + + +
      +
      + + + + + + + + + diff --git a/web/templates/authentication/totp.tmpl b/web/templates/authentication/totp.tmpl new file mode 100644 index 0000000..ea1871c --- /dev/null +++ b/web/templates/authentication/totp.tmpl @@ -0,0 +1,94 @@ + + + + + Gentoo Security + + + + + + + + + + + + +
      +
      +
      + +
      + +
      +
      +
      +
      + + Gentoo Linux logo + +

      TOTP Login

      +
      + +
      + +
      +
      + +
      + + + +
      + +
      + +
      +
      + +
      +
      +
      + +
      +
      + + + + + + + +
      +
      +
      + You've activated 2FA using TOTP for your account. Please use one of your registered Authenticators to generate a TOTP and log in. +
      +
      + +
      +
      + In case you lost all authenticators that you have registered, please contact the security team and ask an admin to temporarly disabled WebAuthn for your account. +
      +
      +
      + +
      +
      + +
      +
      + + + +
      +
      + + + + + + + + diff --git a/web/templates/authentication/webauthn.tmpl b/web/templates/authentication/webauthn.tmpl new file mode 100644 index 0000000..03a92f8 --- /dev/null +++ b/web/templates/authentication/webauthn.tmpl @@ -0,0 +1,204 @@ + + + + + Gentoo Security + + + + + + + + + + + + +
      +
      +
      + +
      + +
      +
      +
      +
      + + Gentoo Linux logo + +

      WebAuthn Login

      +
      + + + + + + + + + + + + + + +
      + 2FA using WebAuthn is activated. Please use your authenticator to log in. +
      + + +
      + +
      + + + + + +
      +
      +
      + +
      +
      + + + + + + + +
      +
      +
      + You've activated 2FA using WebAuthn for your account. Please use one of your registered Authenticators (such as security keys) to log in. +
      +
      + +
      +
      + In case you lost all authenticators that you have registered, please contact the security team and ask an admin to temporarly disabled WebAuthn for your account. +
      +
      +
      + +
      +
      + +
      +
      + + + +
      +
      + + + + + + + + + + + + diff --git a/web/templates/dashboard/dashboard.tmpl b/web/templates/dashboard/dashboard.tmpl new file mode 100644 index 0000000..d77fd73 --- /dev/null +++ b/web/templates/dashboard/dashboard.tmpl @@ -0,0 +1,158 @@ + + +{{template "head"}} + +{{template "header" .}} + + + +
      + + +

      Dashboard

      +
      + +

      + +
      +
      +

      Requests & Drafts recently created

      + + + + + {{range .GLSAs}} + + + + + + {{end}} + +
      {{.Type}}{{.Title}}{{.Creator.Nick}}
      +
      +
      +

      Recent Statistics from our Statistics Page

      +
      +
      +
      + +
      +
      +

      Recent CVEs view more at the CVE Tool

      + + + + + {{range .CVEs}} + + + + + + {{end}} + +
      {{.Id}}{{.Description}}{{.LastModifiedDate}}
      +
      +
      +

      Recent Comments on GLSAs and CVEs

      + + + + + {{range .Comments}} + + + + + + + {{end}} + +
      + {{if .GlsaId}} + + GLSA {{if eq .Type "approve"}}{{.Type}}{{else if eq .Type "decline"}}{{.Type}}{{else}}{{end}} + + {{else}} + + CVE + + {{end}} + + {{.Message}} + + {{.User}} + + {{.Date}} +
      +
      +
      + + +
      + + + +{{template "footer" .}} + + + + + + + + diff --git a/web/templates/drafts/drafts.tmpl b/web/templates/drafts/drafts.tmpl new file mode 100644 index 0000000..e0e5c10 --- /dev/null +++ b/web/templates/drafts/drafts.tmpl @@ -0,0 +1,84 @@ + + +{{template "head"}} + +{{template "header" .}} + + + +
      +
      +
      + + +

      Drafts

      + + + + + + + + + + + + + + + + + {{ range .Drafts}} + + + + + + + + + + + {{end}} + +
      IDTitleRequesterDateBug ReadyApprovedWorkflowPermissions
      {{.Id}}{{.Title}}{{.Creator.Nick}}{{.Created}} + + + + + {{if .Status.BugReady }}READY{{else}}NOT READY{{end}} + + + + + + {{.Status.Approval}} + + + + + {{.Status.WorkflowStatus}} + + + + + {{ if eq .Status.Permission "public"}}PUBLIC{{else}}CONFIDENTAL{{end}} + +
      + + +
      +
      +
      + + +{{template "footer" .}} + + + + + diff --git a/web/templates/glsa/edit.tmpl b/web/templates/glsa/edit.tmpl new file mode 100644 index 0000000..4318d86 --- /dev/null +++ b/web/templates/glsa/edit.tmpl @@ -0,0 +1,768 @@ + + +{{template "head"}} + +{{template "header" .}} + +
      + +
      +
      + + +
      + + + +
      + +
      + + +
      +
      +
      + +
      + {{.Glsa.Type}} + GLSA {{.Glsa.Id}} + + + Created: {{.Glsa.Created}} + Updated: {{.Glsa.Updated}} + + + + + + + {{ if eq .Glsa.Status.Permission "public"}}PUBLIC{{else}}CONFIDENTAL{{end}} + + + + + {{.Glsa.Status.WorkflowStatus}} + + + + + {{.Glsa.Status.Approval}} + + + + + + + {{if .Glsa.Status.BugReady }}READY{{else}}NOT READY{{end}} + + + + +
      + +
      +

      + +

      +
      +
      +
      +
      +
      + + +
      + +
      + +
      +
      +
      + Permission: + + + +
      +
      + Access: + + + +
      + +
      + Severity: + + + +
      +
      + Keyword: + + + +
      + +
      +
      +
      + +
      + + +
      +
      + +
      +
      + +
      +
      +
      + Synopsis: +
      +
      + + + +
      +
      +
      + +
      +
      +
      +
      +
      + Description: +
      +
      + + + +
      +
      +
      + +
      +
      +
      + Workaround: +
      +
      + +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      + Impact: +
      +
      + +
      +
      +
      + +
      +
      +
      + Background: +
      +
      + +
      +
      +
      +
      +
      + +
      +
      +
      +
      + + +
      +
      + +
      + +
      +
      +
      + + + +
      +
      + +
      +
      + +
      +
      +
      + Vulnerable: +
      +
      + +
      + {{ range .Glsa.Packages}} + {{ if .Affected}} +
      +
      +
      + + + + +
      +
      + + + +
      +
      + + + +
      +
      + + + +
      +
      + + + +
      +
      + + + +
      +
      +
      + {{end}} + {{end}} +
      + +

      + + +
      +
      + + + +
      +
      + + + +
      +
      + + + +
      +
      + + + +
      +
      + + + +
      +
      + + + +
      +
      + + + +
      +
      + +
      + +
      + +
      +
      + Unaffected: +
      +
      + +
      + {{ range .Glsa.Packages}} + {{ if not .Affected}} + +
      +
      +
      + + + + +
      +
      + + + +
      +
      + + + +
      +
      + + + +
      +
      + + + +
      +
      + + + +
      +
      +
      + + {{end}} + {{end}} +
      + +

      + +
      +
      + + + +
      +
      + + + +
      +
      + + + +
      +
      + + + +
      +
      + + + +
      +
      + + + +
      +
      + + + +
      +
      + +
      + +
      +
      +
      +
      + + + +
      + +
      +
      +
      + + Bugs +
      +
      +
      + + {{ range $key, $value := .Glsa.Bugs }} + +
      +
      +
      + + + + + + + +
      +
      + {{$value.Summary}} + +
      + + + + +
      +
      + + {{ end }} + +
      + +
      +

      + +
      + +
      +
      + + + + + + +
      +
      + Enter a bug id to add a new bug +
      + + + +
      +
      + +
      +
      +
      +
      + +
      +
      + +
      +
      + +
      +
      + + {{ range $key, $value := .Glsa.References }} + +
      +
      +
      + + + + + + + +
      +
      + + + +
      + + + +
      +
      + + {{ end }} +
      + +
      + +

      + +
      + +
      +
      + + + + + +
      +
      + + + + + + +
      + + + +
      +
      + +
      +
      +
      +
      + +
      + + {{if .User.Permissions.Glsa.Comment}} +

      + {{else if .Glsa.Comments}} +

      + {{end}} + +
      +
      + + {{ range .Glsa.Comments}} + +
      +
      +
      +
      +
      +
      +
      + + + + + + + {{.UserBadge.Name}} + + +
      +
      + + {{.Date}} + +
      +
      +
      + +
      +
      + + + +
      +
      +
      +
      + +
      + {{if eq .Type "approve"}}Approved: {{else if eq .Type "decline"}}Declined: {{end}} + {{.Message}} +
      +
      +
      + + {{end}} + +
      +
      + + + {{if .User.Permissions.Glsa.Comment}} +
      +
      + +
      +
      +
      + + +
      + +
      + {{if .User.Permissions.Glsa.Approve}} + {{if eq .Glsa.CreatorId .User.Id}} + {{if .User.Permissions.Glsa.ApproveOwnGlsa}} + + {{end}} + {{else}} + + {{end}} + {{end}} + {{if .User.Permissions.Glsa.Decline}} + + {{end}} +
      +
      +
      +
      +
      + {{end}} + + +
      +
      + +
      + + + + + + + +{{template "footer" .}} + + + diff --git a/web/templates/glsa/show.tmpl b/web/templates/glsa/show.tmpl new file mode 100644 index 0000000..c9a9591 --- /dev/null +++ b/web/templates/glsa/show.tmpl @@ -0,0 +1,495 @@ + + +{{template "head"}} + +{{template "header" .}} + +
      +
      + + +
      + + + +
      + +
      + + +
      +
      +
      + +
      + {{.Glsa.Type}} +  GLSA {{.Glsa.Id}} + + + Created: {{.Glsa.Created}} + Updated: {{.Glsa.Updated}} + + + + + + {{ if eq .Glsa.Status.Permission "public"}}PUBLIC{{else}}CONFIDENTAL{{end}} + + + + + {{.Glsa.Status.WorkflowStatus}} + + + + + {{.Glsa.Status.Approval}} + + + + + + + {{if .Glsa.Status.BugReady }}READY{{else}}NOT READY{{end}} + + + +
      + +
      +

      {{.Glsa.Title}}

      +
      +
      +
      +
      +
      + + + +
      + +
      + +
      +
      +
      + Permission: + {{.Glsa.Permission}} +
      +
      + Access: + {{.Glsa.Access}} +
      + +
      + Severity: + {{.Glsa.Severity}} +
      +
      + Keyword: + {{.Glsa.Keyword}} +
      + +
      +
      +
      + +
      + + +
      +
      + +
      +
      + +
      + +
      +
      + Synopsis: +
      +
      + {{.Glsa.Synopsis}} +
      +
      +
      + +
      +
      +
      +
      +
      + Description: +
      +
      + {{.Glsa.Description}} +
      +
      +
      + +
      +
      +
      + Workaround: +
      +
      + {{.Glsa.Workaround}} +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      + Impact: +
      +
      + {{.Glsa.Impact}} +
      +
      +
      + +
      +
      +
      + Background: +
      +
      + {{.Glsa.Background}} +
      +
      +
      +
      +
      + +
      +
      +
      +
      + + + +
      +
      + +
      + {{ if .Glsa.Resolution}} + {{ .Glsa.Resolution}} + {{else}} +
      - no resolution yet -
      + {{end}} + +
      +
      +
      + + + +
      +
      + +
      + {{ if .Glsa.Resolution}} +
      + +
      + + {{ range .Glsa.Packages}} + {{ if .Affected}} + +
      +
      + Vulnerable: +
      + +
      + {{.Identifier}}{{.Atom}}-{{.Version}}:{{.Slot}} on {{.Arch}} (auto: {{.Auto}}) +
      +
      + + {{end}} + {{end}} + +
      + +
      + {{ range .Glsa.Packages}} + {{ if not .Affected}} +
      +
      + Unaffected: +
      +
      + {{.Identifier}}{{.Atom}}-{{.Version}}:{{.Slot}} on {{.Arch}} (auto: {{.Auto}}) +
      +
      + {{end}} + {{end}} + +
      + +
      + {{else}} +
      - no packages yet -
      + {{end}} +
      +
      +
      + + +
      + +
      +
      +
      + + Bugs +
      +
      + {{ if .Glsa.Bugs}} +
      + + {{ range .Glsa.Bugs}} + +
      +
      +
      + + + + + + {{.Id}}: +
      +
      + {{.Summary}} +
      +
      +
      + + {{end}} + +
      + {{else}} +
      - no bugs yet -
      + {{end}} +
      +
      +
      + +
      +
      + +
      +
      + +
      + {{ if .Glsa.References}} +
      + + {{ range .Glsa.References}} + +
      +
      +
      + + + + + {{.Title}} + + + +
      +
      + {{.URL}} +
      +
      +
      + + {{end}} + + +
      + {{else}} +
      - no references yet -
      + {{end}} +
      +
      +
      + +
      + + + {{if .User.Permissions.Glsa.Comment}} +

      + {{else if .Glsa.Comments}} +

      + {{end}} + +
      +
      + + {{ range .Glsa.Comments}} + +
      +
      +
      +
      +
      +
      +
      + + + + + + + {{.UserBadge.Name}} + + +
      +
      + + {{.Date}} + +
      +
      +
      + +
      +
      + + + +
      +
      +
      +
      + +
      + {{if eq .Type "approve"}}Approved: {{else if eq .Type "decline"}}Declined: {{end}} + {{.Message}} +
      +
      +
      + + {{end}} + +
      +
      + + {{if .User.Permissions.Glsa.Comment}} +
      +
      + +
      +
      +
      + + +
      + +
      + + {{if .User.Permissions.Glsa.Approve}} + {{if eq .Glsa.CreatorId .User.Id}} + {{if .User.Permissions.Glsa.ApproveOwnGlsa}} + + {{end}} + {{else}} + + {{end}} + {{end}} + {{if .User.Permissions.Glsa.Decline}} + + {{end}} +
      +
      +
      +
      +
      + {{end}} + +
      +
      + + + + +{{template "footer" .}} + + + diff --git a/web/templates/home/home.tmpl b/web/templates/home/home.tmpl new file mode 100644 index 0000000..433be8a --- /dev/null +++ b/web/templates/home/home.tmpl @@ -0,0 +1,166 @@ + + +{{template "head"}} + +{{template "header" .}} + +
      + + {{ if .User.Show2FANotice }} + + {{ end }} + + +
      +
      + + +
      + +
      +

      Welcome to Gentoo's GLSAMaker

      +
      +
      + +
      +
      +
      + +
      + + +
      +
      +
      +
      + +
      + + +

      + The GLSAMaker supports different queries to navigate and search. Have look at the documentation.
      + The GLSAMaker can be used either by using this website or by using the corresponding command line tool.
      + +
      +
      + + +
      +
      + + + + + + + +
      + + + + +{{template "footer" .}} + + + diff --git a/web/templates/index/show.tmpl b/web/templates/index/show.tmpl new file mode 100644 index 0000000..265ac2f --- /dev/null +++ b/web/templates/index/show.tmpl @@ -0,0 +1,85 @@ + + +{{template "head"}} + +{{template "header" .}} + + + + +
      +
      +
      + + + + + + + + + + + + + + + + + + +
      IDDescriptionPackagesBugsBaseScoreImpactReferencesCommentsLastModifiedDatePublishedDateStateChangelog
      + +
      +
      +
      + +{{template "footer" .}} + + + + + + + diff --git a/web/templates/index/showFullscreen.tmpl b/web/templates/index/showFullscreen.tmpl new file mode 100644 index 0000000..e996e3f --- /dev/null +++ b/web/templates/index/showFullscreen.tmpl @@ -0,0 +1,80 @@ + + +{{template "head"}} + + + + + +
      +
      +
      + + + + + + + + + + + + + + + + + + +
      IDDescriptionPackagesBugsBaseScoreImpactReferencesCommentsLastModifiedDatePublishedDateStateChangelog
      + +
      +
      +
      + + + + + diff --git a/web/templates/layout/footer.tmpl b/web/templates/layout/footer.tmpl new file mode 100644 index 0000000..bdf2510 --- /dev/null +++ b/web/templates/layout/footer.tmpl @@ -0,0 +1,50 @@ +{{define "footer"}} +
      +
      +
      +
      +

      Gentoo GLSAMaker

      +
      +
      + Bug Data as current of
      {{ .Application.LastBugUpdate.Format "Jan 02, 2006 15:04:05 UTC" }}
      + {{if .User.Permissions.Glsa.UpdateBugs}} + Trigger an update + {{end}} +
      +
      + CVE Data as current of
      {{ .Application.LastCVEUpdate.Format "Jan 02, 2006 15:04:05 UTC" }}
      + {{if .User.Permissions.CVETool.UpdateCVEs}} + Trigger an update + {{end}} +
      +
      +
      +
      +
      +
      +

      Questions or comments?

      + Please feel free to contact us. +

      {{ .Application.Version }}

      +
      +
      +
      +
      + +
      +
      + © 2001–2020 Gentoo Foundation, Inc.
      + + Gentoo is a trademark of the Gentoo Foundation, Inc. + The contents of this document, unless otherwise expressly stated, are licensed under the + CC-BY-SA-4.0 license. + The Gentoo Name and Logo Usage Guidelines apply. + +
      +
      +
      +
      +{{end}} diff --git a/web/templates/layout/head.tmpl b/web/templates/layout/head.tmpl new file mode 100644 index 0000000..e92511b --- /dev/null +++ b/web/templates/layout/head.tmpl @@ -0,0 +1,12 @@ +{{define "head"}} + + Gentoo GLSAMaker + + + + + + + + +{{end}} diff --git a/web/templates/layout/header.tmpl b/web/templates/layout/header.tmpl new file mode 100644 index 0000000..571a58b --- /dev/null +++ b/web/templates/layout/header.tmpl @@ -0,0 +1,6 @@ +{{define "header"}} +
      + {{template "sitetitle"}} + {{template "tyrian-navbar" .}} +
      +{{end}} diff --git a/web/templates/layout/sitetitle.tmpl b/web/templates/layout/sitetitle.tmpl new file mode 100644 index 0000000..bce61c7 --- /dev/null +++ b/web/templates/layout/sitetitle.tmpl @@ -0,0 +1,37 @@ +{{define "sitetitle"}} + +{{end}} diff --git a/web/templates/layout/tyriannav.tmpl b/web/templates/layout/tyriannav.tmpl new file mode 100644 index 0000000..c53f671 --- /dev/null +++ b/web/templates/layout/tyriannav.tmpl @@ -0,0 +1,72 @@ +{{define "tyrian-navbar"}} + +{{end}} diff --git a/web/templates/new/new.tmpl b/web/templates/new/new.tmpl new file mode 100644 index 0000000..b6ff274 --- /dev/null +++ b/web/templates/new/new.tmpl @@ -0,0 +1,282 @@ + + +{{template "head"}} + +{{template "header" .}} + +
      +
      +
      + +

      New GLSA request

      + +
      +
      + +
      + + +
      + Request + +  GLSA {{.NewID}} + + + Created: 2020-04-08 16:05 UTC + + + + + + + PUBLIC + + + + + + + + OWN + + + + + NONE + + + + + + + + + + NOT READY + + + + + +
      + +
      +

      + New Gentoo Linux Security Advisories Request +

      +
      + + + + + + +
      +
      + Bugs
      + Please enter the relevant bug ID(s), separate more than one bug with a comma. +
      +
      + + + + +
      +
      + +
      +
      + Title
      + Either take the suggested title or enter a new custom one. +
      +
      + +
      +
      + +
      +
      + Synopsis
      + Either take the suggested title or enter a new custom one. +
      +
      + +
      +
      + +
      +
      + Description
      + Either take the suggested title or enter a new custom one. +
      +
      + +
      +
      + +
      +
      + Workaround
      + Either take the suggested title or enter a new custom one. +
      +
      + +
      +
      + +
      +
      + Impact
      + Either take the suggested title or enter a new custom one. +
      +
      + +
      +
      + +
      +
      + Background
      + Either take the suggested title or enter a new custom one. +
      +
      + +
      +
      + +
      +
      + Resolution
      + Either take the suggested title or enter a new custom one. +
      +
      + +
      +
      + + +
      +
      + References +
      +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      +
      + +
      +
      + Permissions
      + Mark this request as public or confidental. +
      +
      + +
      +
      + +
      +
      + Access
      + Mark this request as public or confidental. +
      +
      + +
      +
      + +
      +
      + Severity
      + Mark this request as public or confidental. +
      +
      + +
      +
      + +
      +
      + Keyword
      + Either take the suggested title or enter a new custom one. +
      +
      + +
      +
      + +
      +
      + Comment
      + Either take the suggested title or enter a new custom one. +
      +
      + +
      +
      + +
      + +
      +
      +
      + + + +
      +
      + +
      + +
      +
      + + + +
      +
      +
      + + +{{template "footer" .}} + + + + + diff --git a/web/templates/requests/requests.tmpl b/web/templates/requests/requests.tmpl new file mode 100644 index 0000000..7a9c8a3 --- /dev/null +++ b/web/templates/requests/requests.tmpl @@ -0,0 +1,84 @@ + + +{{template "head"}} + +{{template "header" .}} + + + +
      +
      +
      + + +

      Requests

      + + + + + + + + + + + + + + + + + {{ range .Requests}} + + + + + + + + + + + {{end}} + +
      IDTitleRequesterDateBug ReadyApprovedWorkflowPermissions
      {{.Id}}{{.Title}}{{.Creator.Nick}}{{.Created}} + + + + + {{if .Status.BugReady }}READY{{else}}NOT READY{{end}} + + + + + + {{.Status.Approval}} + + + + + {{.Status.WorkflowStatus}} + + + + + {{ if eq .Status.Permission "public"}}PUBLIC{{else}}CONFIDENTAL{{end}} + +
      + + +
      +
      +
      + + + +{{template "footer" .}} + + + + diff --git a/web/templates/search/search.tmpl b/web/templates/search/search.tmpl new file mode 100644 index 0000000..6a71c06 --- /dev/null +++ b/web/templates/search/search.tmpl @@ -0,0 +1,84 @@ + + +{{template "head"}} + +{{template "header" .}} + + + +
      +
      +
      + + +

      Search Results for: "{{.SearchQuery}}"

      + + + + + + + + + + + + + + + + + {{ range .GLSAs}} + + + + + + + + + + + {{end}} + +
      IDTitleRequesterDateBug ReadyApprovedWorkflowPermissions
      {{.Id}}{{.Title}}{{.Creator.Nick}}{{.Created}} + + + + + {{if .Status.BugReady }}READY{{else}}NOT READY{{end}} + + + + + + {{.Status.Approval}} + + + + + {{.Status.WorkflowStatus}} + + + + + {{ if eq .Status.Permission "public"}}PUBLIC{{else}}CONFIDENTAL{{end}} + +
      + + +
      +
      +
      + + + +{{template "footer" .}} + + + + diff --git a/web/templates/statistics/statistics.tmpl b/web/templates/statistics/statistics.tmpl new file mode 100644 index 0000000..134e7e0 --- /dev/null +++ b/web/templates/statistics/statistics.tmpl @@ -0,0 +1,89 @@ + + +{{template "head"}} + +{{template "header" .}} + +
      + + +

      + Statistics
      + Stay tuned, this is just a first placeholder. More is coming soon. +

      + + + + +
      + +
      + +
      + + + +
      + + +{{template "footer" .}} + + + + + + + diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..dc4a6c6 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,90 @@ +const webpack = require('webpack'); +const path = require('path'); + +module.exports = { + entry: { + stylesheets: './web/packs/stylesheets.js', + application: './web/packs/application.js', + account: './web/packs/account.js', + edit: './web/packs/edit.js', + glsa: './web/packs/glsa.js', + newglsa: './web/packs/newglsa.js', + statistics: './web/packs/statistics.js', + admin: './web/packs/admin.js', + }, + output: { + path: path.resolve(__dirname, 'assets'), + filename: '[name].js', + }, + plugins: [ + require('postcss-import') + ], + module: { + rules: [ + { + test: /\.css$/i, + use: [ + // Creates `style` nodes from JS strings + 'style-loader', + // Translates CSS into CommonJS + { + loader: 'css-loader', + },{ + loader: 'resolve-url-loader', + }, + ], + }, + { + test: /\.s[ac]ss$/i, + use: [ + // Creates `style` nodes from JS strings + 'style-loader', + // Translates CSS into CommonJS + { + loader: 'css-loader', + },{ + loader: 'resolve-url-loader', + }, + // Compiles Sass to CSS + { + loader: 'sass-loader', + options: { + sourceMap: true, + } + }, + ], + }, + { + test: /\.(woff(2)?|ttf|eot|svg)(\?v=\d+\.\d+\.\d+)?$/, + use: [ + { + loader: 'file-loader', + options: { + name: '[name].[ext]', + publicPath: '/assets' + } + } + ] + }, + { + test: /datatables\.net(?!.*[.]css$).*/, + loader: 'imports-loader?define=>false' + } + ], + }, + plugins: [ + new webpack.ProvidePlugin({ + $: 'jquery', + jQuery: 'jquery', + 'window.jQuery': 'jquery', + 'window.$': 'jquery', + 'windows.jQuery': 'jquery', + tether: 'tether', + Tether: 'tether', + 'window.Tether': 'tether', + Popper: ['popper.js', 'default'], + 'window.Tether': 'tether', + Modal: 'exports-loader?Modal!bootstrap/js/dist/modal', + }), + ], +}; -- cgit v1.2.3-65-gdbad